From e8765537900084bea7d2d98a5858f0badba8ab23 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sat, 15 Mar 2025 17:32:47 -0700 Subject: [PATCH 001/211] test(search): add unit tests --- tests/Search.test.svelte | 21 ------ tests/Search/Search.test.svelte | 17 +++++ tests/Search/Search.test.ts | 82 +++++++++++++++++++++++ tests/Search/SearchExpandable.test.svelte | 22 ++++++ tests/Search/SearchSkeleton.test.svelte | 9 +++ 5 files changed, 130 insertions(+), 21 deletions(-) delete mode 100644 tests/Search.test.svelte create mode 100644 tests/Search/Search.test.svelte create mode 100644 tests/Search/Search.test.ts create mode 100644 tests/Search/SearchExpandable.test.svelte create mode 100644 tests/Search/SearchSkeleton.test.svelte diff --git a/tests/Search.test.svelte b/tests/Search.test.svelte deleted file mode 100644 index 9def9e12..00000000 --- a/tests/Search.test.svelte +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/tests/Search/Search.test.svelte b/tests/Search/Search.test.svelte new file mode 100644 index 00000000..635d3f31 --- /dev/null +++ b/tests/Search/Search.test.svelte @@ -0,0 +1,17 @@ + + + { + console.log("clear"); + }} +/> + + diff --git a/tests/Search/Search.test.ts b/tests/Search/Search.test.ts new file mode 100644 index 00000000..a266b940 --- /dev/null +++ b/tests/Search/Search.test.ts @@ -0,0 +1,82 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import Search from "./Search.test.svelte"; +import SearchExpandable from "./SearchExpandable.test.svelte"; +import SearchSkeleton from "./SearchSkeleton.test.svelte"; + +describe("Search", () => { + const getSearchInput = (label?: string | RegExp) => + screen.getByRole("searchbox", { name: label }); + const getClearButton = (label = "Clear search input") => + screen.getByRole("button", { name: label }); + + it("renders and functions correctly", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Search); + + const search = getSearchInput("Default search"); + expect(search).toHaveValue(""); + expect(search).toHaveAttribute("placeholder", "Search"); + + await user.type(search, "test"); + expect(search).toHaveValue("test"); + + const clearButton = getClearButton("Clear value"); + await user.click(clearButton); + expect(search).toHaveValue(""); + expect(consoleLog).toHaveBeenCalledWith("clear"); + expect(consoleLog).toHaveBeenCalledTimes(1); + }); + + it("renders disabled state", async () => { + render(Search); + + const search = getSearchInput("Disabled search"); + expect(search).toBeDisabled(); + }); + + it("handles expandable variant", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(SearchExpandable); + + const search = getSearchInput("Expandable search"); + const searchWrapper = search.closest(".bx--search"); + assert(searchWrapper); + + expect(searchWrapper).toHaveClass("bx--search--expandable"); + expect(searchWrapper).not.toHaveClass("bx--search--expanded"); + + const magnifier = searchWrapper.querySelector(".bx--search-magnifier"); + assert(magnifier); + + await user.click(magnifier); + expect(searchWrapper).toHaveClass("bx--search--expanded"); + expect(consoleLog).toHaveBeenCalledWith("expanded"); + + await user.click(document.body); + expect(searchWrapper).not.toHaveClass("bx--search--expanded"); + expect(consoleLog).toHaveBeenCalledWith("collapsed"); + + // Don't collapse when has value + await user.click(magnifier); + await user.type(search, "test"); + await user.click(document.body); + expect(searchWrapper).toHaveClass("bx--search--expanded"); + }); + + it("renders skeleton states", () => { + render(SearchSkeleton); + + const skeletons = document.querySelectorAll(".bx--skeleton"); + expect(skeletons).toHaveLength(3); + + // Default (xl) skeleton + expect(skeletons[0]).toHaveClass("bx--search--xl"); + + // Large (lg) skeleton + expect(skeletons[1]).toHaveClass("bx--search--lg"); + + // Small (sm) skeleton + expect(skeletons[2]).toHaveClass("bx--search--sm"); + }); +}); diff --git a/tests/Search/SearchExpandable.test.svelte b/tests/Search/SearchExpandable.test.svelte new file mode 100644 index 00000000..68f2ca88 --- /dev/null +++ b/tests/Search/SearchExpandable.test.svelte @@ -0,0 +1,22 @@ + + + { + console.log("expanded"); + }} + on:collapse={() => { + console.log("collapsed"); + }} +/> + +
Status: {expanded ? "expanded" : "collapsed"}
diff --git a/tests/Search/SearchSkeleton.test.svelte b/tests/Search/SearchSkeleton.test.svelte new file mode 100644 index 00000000..e4c965e6 --- /dev/null +++ b/tests/Search/SearchSkeleton.test.svelte @@ -0,0 +1,9 @@ + + + + + + + From 9b3f2e0919beb9c49899cb8c167c8c8ddf03a5f8 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sat, 15 Mar 2025 17:50:24 -0700 Subject: [PATCH 002/211] test(copy-button): add unit tests --- tests/CopyButton.test.svelte | 11 ---- tests/CopyButton/CopyButton.test.svelte | 26 ++++++++++ tests/CopyButton/CopyButton.test.ts | 69 +++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 11 deletions(-) delete mode 100644 tests/CopyButton.test.svelte create mode 100644 tests/CopyButton/CopyButton.test.svelte create mode 100644 tests/CopyButton/CopyButton.test.ts diff --git a/tests/CopyButton.test.svelte b/tests/CopyButton.test.svelte deleted file mode 100644 index 929adc28..00000000 --- a/tests/CopyButton.test.svelte +++ /dev/null @@ -1,11 +0,0 @@ - - - text} - feedback="Copied to clipboard" -/> diff --git a/tests/CopyButton/CopyButton.test.svelte b/tests/CopyButton/CopyButton.test.svelte new file mode 100644 index 00000000..b02d999f --- /dev/null +++ b/tests/CopyButton/CopyButton.test.svelte @@ -0,0 +1,26 @@ + + + { + console.log("copied"); + }} +/> + + + + { + console.log(`Custom copy: ${text}`); + }} +/> diff --git a/tests/CopyButton/CopyButton.test.ts b/tests/CopyButton/CopyButton.test.ts new file mode 100644 index 00000000..c8472c8f --- /dev/null +++ b/tests/CopyButton/CopyButton.test.ts @@ -0,0 +1,69 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import CopyButton from "./CopyButton.test.svelte"; + +describe("CopyButton", () => { + const getCopyButton = (label: string) => + screen.getByRole("button", { name: label }); + + beforeEach(() => { + Object.defineProperty(navigator, "clipboard", { + value: { writeText: () => Promise.resolve() }, + writable: true, + }); + }); + + it("renders and functions correctly", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(CopyButton); + + const button = getCopyButton("Basic"); + expect(button).toHaveAttribute("aria-live", "polite"); + + await user.click(button); + expect(consoleLog).toHaveBeenCalledWith("copied"); + + const feedback = button.querySelector(".bx--copy-btn__feedback"); + expect(feedback).toHaveTextContent("Copied!"); + }); + + it("supports custom feedback text and timeout", async () => { + render(CopyButton); + + const button = getCopyButton("Custom feedback"); + await user.click(button); + + const feedback = button.querySelector(".bx--copy-btn__feedback"); + expect(feedback).toHaveTextContent("Copied to clipboard"); + + await new Promise((resolve) => setTimeout(resolve, 0)); + expect(button).toHaveClass("bx--copy-btn--fade-out"); + }); + + it("supports custom copy function", async () => { + const consoleLog = vi.spyOn(console, "log"); + const clipboard = vi.spyOn(navigator.clipboard, "writeText"); + render(CopyButton); + + const button = getCopyButton("Custom copy function"); + await user.click(button); + expect(consoleLog).toHaveBeenCalledWith( + "Custom copy: Custom copy function", + ); + expect(clipboard).not.toHaveBeenCalled(); + }); + + it("handles clipboard API errors", async () => { + const consoleLog = vi.spyOn(console, "log"); + Object.defineProperty(navigator, "clipboard", { + value: { writeText: () => Promise.reject("Clipboard error") }, + writable: true, + }); + + render(CopyButton); + + const button = getCopyButton("Basic"); + await user.click(button); + expect(consoleLog).toHaveBeenCalledWith("Clipboard error"); + }); +}); From 481f121f772c22eb685ddd42213ee160a78b992b Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sat, 15 Mar 2025 18:01:12 -0700 Subject: [PATCH 003/211] test(toggle): add unit tests --- tests/Toggle.test.svelte | 19 -------- tests/Toggle/Toggle.test.svelte | 25 ++++++++++ tests/Toggle/Toggle.test.ts | 81 +++++++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+), 19 deletions(-) delete mode 100644 tests/Toggle.test.svelte create mode 100644 tests/Toggle/Toggle.test.svelte create mode 100644 tests/Toggle/Toggle.test.ts diff --git a/tests/Toggle.test.svelte b/tests/Toggle.test.svelte deleted file mode 100644 index 77da9c44..00000000 --- a/tests/Toggle.test.svelte +++ /dev/null @@ -1,19 +0,0 @@ - - - - - { - console.log(e.detail.toggled); - }} -/> - - - - - - diff --git a/tests/Toggle/Toggle.test.svelte b/tests/Toggle/Toggle.test.svelte new file mode 100644 index 00000000..5e3b4b1b --- /dev/null +++ b/tests/Toggle/Toggle.test.svelte @@ -0,0 +1,25 @@ + + + { + console.log("toggled:", e.detail.toggled); + }} +/> + + + + + + + + diff --git a/tests/Toggle/Toggle.test.ts b/tests/Toggle/Toggle.test.ts new file mode 100644 index 00000000..ec739ccc --- /dev/null +++ b/tests/Toggle/Toggle.test.ts @@ -0,0 +1,81 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import Toggle from "./Toggle.test.svelte"; + +describe("Toggle", () => { + const getToggle = (label: string) => + screen.getByRole("switch", { name: new RegExp(label, "i") }); + + it("renders and functions correctly", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Toggle); + + const toggle = getToggle("Default toggle"); + expect(toggle).not.toBeChecked(); + + await user.click(toggle); + expect(toggle).toBeChecked(); + expect(consoleLog).toHaveBeenCalledWith("toggled:", true); + + await user.click(toggle); + expect(toggle).not.toBeChecked(); + expect(consoleLog).toHaveBeenCalledWith("toggled:", false); + }); + + it("supports custom labels", () => { + render(Toggle); + + const toggle = getToggle("Custom labels"); + const label = toggle.closest(".bx--form-item"); + expect(label).not.toBeNull(); + + if (label) { + expect(label).toContainElement(screen.getByText("Inactive")); + expect(label).toContainElement(screen.getByText("Active")); + } + }); + + it("supports small size variant", () => { + render(Toggle); + + const toggle = getToggle("Small toggle"); + expect(toggle).toHaveClass("bx--toggle-input--small"); + }); + + it("supports disabled state", () => { + render(Toggle); + + const toggle = getToggle("Disabled toggle"); + expect(toggle).toBeDisabled(); + }); + + it("supports hidden label", () => { + render(Toggle); + + const toggle = getToggle("Hidden label toggle"); + const label = toggle.closest(".bx--form-item"); + expect(label).not.toBeNull(); + + if (label) { + const hiddenText = label.querySelector(".bx--visually-hidden"); + expect(hiddenText).toHaveClass("bx--visually-hidden"); + expect(toggle).toHaveAccessibleName("Hidden label toggle"); + } + }); + + it("handles keyboard interactions", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Toggle); + + const toggle = getToggle("Default toggle"); + toggle.focus(); + + await user.keyboard(" "); + expect(toggle).toBeChecked(); + expect(consoleLog).toHaveBeenCalledWith("toggled:", true); + + await user.keyboard(" "); + expect(toggle).not.toBeChecked(); + expect(consoleLog).toHaveBeenCalledWith("toggled:", false); + }); +}); From d685091447dc740b6d108eb22b897d90c609c69e Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sat, 15 Mar 2025 18:17:16 -0700 Subject: [PATCH 004/211] test(image-loader): add unit tests --- tests/ImageLoader.test.svelte | 22 ---- tests/ImageLoader/ImageLoader.test.svelte | 64 +++++++++++ tests/ImageLoader/ImageLoader.test.ts | 129 ++++++++++++++++++++++ 3 files changed, 193 insertions(+), 22 deletions(-) delete mode 100644 tests/ImageLoader.test.svelte create mode 100644 tests/ImageLoader/ImageLoader.test.svelte create mode 100644 tests/ImageLoader/ImageLoader.test.ts diff --git a/tests/ImageLoader.test.svelte b/tests/ImageLoader.test.svelte deleted file mode 100644 index 1a3f8e1a..00000000 --- a/tests/ImageLoader.test.svelte +++ /dev/null @@ -1,22 +0,0 @@ - - - { - console.log(e.detail); // null - }} - on:error={(e) => { - console.log(e.detail); // null - }} -/> diff --git a/tests/ImageLoader/ImageLoader.test.svelte b/tests/ImageLoader/ImageLoader.test.svelte new file mode 100644 index 00000000..1a805651 --- /dev/null +++ b/tests/ImageLoader/ImageLoader.test.svelte @@ -0,0 +1,64 @@ + + + + + +
+ +
+ + +
+ + +
+ +
+
+ +
An error occurred.
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
Failed to load image
+
+
+
diff --git a/tests/ImageLoader/ImageLoader.test.ts b/tests/ImageLoader/ImageLoader.test.ts new file mode 100644 index 00000000..86640905 --- /dev/null +++ b/tests/ImageLoader/ImageLoader.test.ts @@ -0,0 +1,129 @@ +import { render, screen } from "@testing-library/svelte"; +import ImageLoader from "./ImageLoader.test.svelte"; + +describe("ImageLoader", () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + vi.restoreAllMocks(); + }); + + it("renders with default props", () => { + render(ImageLoader); + const wrapper = screen.getByTestId("default-loader"); + const img = wrapper.querySelector("img"); + expect(img).toBeDefined(); + }); + + it("shows loading state and transitions to loaded state", async () => { + render(ImageLoader); + + const loadingIndicator = screen.getByTestId("loading-state"); + expect(loadingIndicator).toBeInTheDocument(); + + const wrapper = screen.getByTestId("loader-with-slots"); + const img = wrapper.querySelector("img"); + expect(img).toBeDefined(); + if (img) { + const loadEvent = new Event("load"); + img.dispatchEvent(loadEvent); + + expect(screen.queryByTestId("loading-state")).not.toBeInTheDocument(); + expect(img).toBeVisible(); + } + }); + + it("handles error state correctly", async () => { + render(ImageLoader); + + const wrapper = screen.getByTestId("error-loader"); + const img = wrapper.querySelector("img"); + expect(img).toBeDefined(); + + if (img) { + const errorEvent = new Event("error"); + img.dispatchEvent(errorEvent); + + const errorMessage = screen.getByTestId("error-message"); + expect(errorMessage).toBeInTheDocument(); + expect(errorMessage).toHaveTextContent("Failed to load image"); + } + }); + + it("supports aspect ratio", () => { + render(ImageLoader); + + const wrapper = screen.getByTestId("loader-with-ratio"); + const aspectRatioWrapper = wrapper.querySelector( + "[class*='bx--aspect-ratio']", + ); + + expect(aspectRatioWrapper).toHaveClass("bx--aspect-ratio--16x9"); + }); + + it("supports fade in animation", async () => { + render(ImageLoader); + + const wrapper = screen.getByTestId("loader-with-fade"); + const img = wrapper.querySelector("img"); + expect(img).toBeDefined(); + + if (img) { + const loadEvent = new Event("load"); + img.dispatchEvent(loadEvent); + + expect(img).toHaveStyle({ + transition: expect.stringContaining("opacity"), + }); + } + }); + + it("supports programmatic image loading", async () => { + const { component } = render(ImageLoader); + + const wrapper = screen.getByTestId("programmatic-loader"); + const img = wrapper.querySelector("img"); + expect(img).toBeDefined(); + + const imageLoaderComponent = component.imageLoader; + expect(imageLoaderComponent).toBeDefined(); + + const newSrc = "https://example.com/new-image.jpg"; + + imageLoaderComponent.loadImage(newSrc); + if (img) { + expect(img.getAttribute("src")).toBe(newSrc); + } + }); + + it("dispatches load and error events", async () => { + const { component } = render(ImageLoader); + + const load = vi.fn(); + const error = vi.fn(); + + component.$on("load", load); + component.$on("error", error); + + const defaultWrapper = screen.getByTestId("default-loader"); + const defaultImg = defaultWrapper.querySelector("img"); + expect(defaultImg).toBeDefined(); + + if (defaultImg) { + defaultImg.dispatchEvent(new Event("load")); + expect(load).toHaveBeenCalled(); + } + + const errorWrapper = screen.getByTestId("error-loader"); + const errorImg = errorWrapper.querySelector("img"); + expect(errorImg).toBeDefined(); + + if (errorImg) { + errorImg.dispatchEvent(new Event("error")); + expect(error).toHaveBeenCalled(); + } + }); +}); From 884f5e596619bb5866c01ad390ca76bd894e6808 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sun, 16 Mar 2025 12:06:02 -0700 Subject: [PATCH 005/211] test(inline-loading): add unit tests --- tests/InlineLoading.test.svelte | 15 --- tests/InlineLoading/InlineLoading.test.svelte | 57 ++++++++ tests/InlineLoading/InlineLoading.test.ts | 126 ++++++++++++++++++ 3 files changed, 183 insertions(+), 15 deletions(-) delete mode 100644 tests/InlineLoading.test.svelte create mode 100644 tests/InlineLoading/InlineLoading.test.svelte create mode 100644 tests/InlineLoading/InlineLoading.test.ts diff --git a/tests/InlineLoading.test.svelte b/tests/InlineLoading.test.svelte deleted file mode 100644 index 2bdf6daf..00000000 --- a/tests/InlineLoading.test.svelte +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - diff --git a/tests/InlineLoading/InlineLoading.test.svelte b/tests/InlineLoading/InlineLoading.test.svelte new file mode 100644 index 00000000..fdf2612a --- /dev/null +++ b/tests/InlineLoading/InlineLoading.test.svelte @@ -0,0 +1,57 @@ + + + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ +
+ +
+ { + console.log("success"); + }} + /> +
+ + +
+ { + console.log("success custom delay"); + }} + /> +
+ +
+ +
+ + +
+ +
diff --git a/tests/InlineLoading/InlineLoading.test.ts b/tests/InlineLoading/InlineLoading.test.ts new file mode 100644 index 00000000..f5755e9f --- /dev/null +++ b/tests/InlineLoading/InlineLoading.test.ts @@ -0,0 +1,126 @@ +import { render, screen } from "@testing-library/svelte"; +import InlineLoading from "./InlineLoading.test.svelte"; + +describe("InlineLoading", () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + vi.restoreAllMocks(); + }); + + it("renders with default props", () => { + render(InlineLoading); + const wrapper = screen.getByTestId("default-loader"); + + expect(wrapper.querySelector(".bx--inline-loading")).toBeInTheDocument(); + expect(wrapper.querySelector(".bx--loading")).toBeInTheDocument(); + }); + + it("renders with description", () => { + render(InlineLoading); + const wrapper = screen.getByTestId("loader-with-description"); + + const description = wrapper.querySelector(".bx--inline-loading__text"); + expect(description).toHaveTextContent("Loading metrics..."); + }); + + it("supports active state", () => { + render(InlineLoading); + const wrapper = screen.getByTestId("loader-active"); + + expect(wrapper.querySelector(".bx--loading")).toHaveClass( + "bx--loading--small", + ); + expect(wrapper.querySelector(".bx--loading--small")).toBeVisible(); + expect( + wrapper.querySelector(".bx--inline-loading__text"), + ).toHaveTextContent("Submitting..."); + }); + + it("supports inactive state", () => { + render(InlineLoading); + const wrapper = screen.getByTestId("loader-inactive"); + + expect(wrapper.querySelector(".bx--loading")).toHaveClass( + "bx--loading--small", + ); + expect(wrapper.querySelector(".bx--loading--stop")).toBeInTheDocument(); + expect( + wrapper.querySelector(".bx--inline-loading__text"), + ).toHaveTextContent("Cancelling..."); + }); + + it("supports finished state", () => { + render(InlineLoading); + const wrapper = screen.getByTestId("loader-finished"); + + expect( + wrapper.querySelector(".bx--inline-loading__checkmark-container"), + ).toBeInTheDocument(); + expect( + wrapper.querySelector(".bx--inline-loading__text"), + ).toHaveTextContent("Success"); + }); + + it("supports error state", () => { + render(InlineLoading); + const wrapper = screen.getByTestId("loader-error"); + + expect( + wrapper.querySelector(".bx--inline-loading--error"), + ).toBeInTheDocument(); + expect( + wrapper.querySelector(".bx--inline-loading__text"), + ).toHaveTextContent("An error occurred"); + }); + + it("supports custom icon description", () => { + render(InlineLoading); + const wrapper = screen.getByTestId("loader-custom-icon"); + + const icon = wrapper.querySelector( + ".bx--inline-loading__checkmark-container", + ); + assert(icon); + expect(icon).toHaveTextContent("Operation completed successfully"); + }); + + it("dispatches success event after delay when finished", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(InlineLoading); + + const wrapper = screen.getByTestId("loader-finished"); + expect( + wrapper.querySelector(".bx--inline-loading__checkmark-container"), + ).toBeInTheDocument(); + + vi.advanceTimersByTime(1500); + expect(consoleLog).toHaveBeenCalledWith("success"); + }); + + it("supports custom success delay", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(InlineLoading); + + vi.advanceTimersByTime(400); + expect(consoleLog).not.toHaveBeenCalled(); + + vi.advanceTimersByTime(100); + expect(consoleLog).toHaveBeenCalledWith("success custom delay"); + }); + + it("cleans up timeout on unmount", () => { + const { unmount } = render(InlineLoading); + const wrapper = screen.getByTestId("loader-finished"); + expect(wrapper).toBeInTheDocument(); + + unmount(); + + // Advance timers to ensure no lingering timeouts + vi.advanceTimersByTime(2000); + // If cleanup wasn't working, this would throw an error about setState after unmount + }); +}); From 12a9b08f80dcd8ad8990e521ff0f145a223c8e70 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sun, 16 Mar 2025 12:09:38 -0700 Subject: [PATCH 006/211] test(loading): add unit tests --- tests/Loading.test.svelte | 7 --- tests/Loading/Loading.test.svelte | 28 ++++++++++ tests/Loading/Loading.test.ts | 93 +++++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+), 7 deletions(-) delete mode 100644 tests/Loading.test.svelte create mode 100644 tests/Loading/Loading.test.svelte create mode 100644 tests/Loading/Loading.test.ts diff --git a/tests/Loading.test.svelte b/tests/Loading.test.svelte deleted file mode 100644 index 2095cd4e..00000000 --- a/tests/Loading.test.svelte +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/tests/Loading/Loading.test.svelte b/tests/Loading/Loading.test.svelte new file mode 100644 index 00000000..aa152744 --- /dev/null +++ b/tests/Loading/Loading.test.svelte @@ -0,0 +1,28 @@ + + + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
diff --git a/tests/Loading/Loading.test.ts b/tests/Loading/Loading.test.ts new file mode 100644 index 00000000..68d4f561 --- /dev/null +++ b/tests/Loading/Loading.test.ts @@ -0,0 +1,93 @@ +import { render, screen } from "@testing-library/svelte"; +import Loading from "./Loading.test.svelte"; + +describe("Loading", () => { + it("renders with default props", () => { + render(Loading); + const wrapper = screen.getByTestId("default-loader"); + + // Should have overlay by default + expect(wrapper.querySelector(".bx--loading-overlay")).toBeInTheDocument(); + + // Should be active by default + const loader = wrapper.querySelector(".bx--loading"); + expect(loader).toBeInTheDocument(); + expect(loader).not.toHaveClass("bx--loading--stop"); + + // Should have correct ARIA attributes + expect(loader).toHaveAttribute("aria-atomic", "true"); + expect(loader).toHaveAttribute("aria-live", "assertive"); + + // Should have default description + const title = wrapper.querySelector("title"); + expect(title).toHaveTextContent("loading"); + }); + + it("renders without overlay", () => { + render(Loading); + const wrapper = screen.getByTestId("loader-no-overlay"); + + // Should not have overlay + expect( + wrapper.querySelector(".bx--loading-overlay"), + ).not.toBeInTheDocument(); + + // Should still have loader + expect(wrapper.querySelector(".bx--loading")).toBeInTheDocument(); + }); + + it("supports small variant", () => { + render(Loading); + const wrapper = screen.getByTestId("loader-small"); + + const loader = wrapper.querySelector(".bx--loading"); + expect(loader).toHaveClass("bx--loading--small"); + + // Small variant should have background circle + const backgroundCircle = wrapper.querySelector(".bx--loading__background"); + expect(backgroundCircle).toBeInTheDocument(); + expect(backgroundCircle).toHaveAttribute("r", "42"); + + // Should have stroke circle with correct radius + const strokeCircle = wrapper.querySelector(".bx--loading__stroke"); + expect(strokeCircle).toHaveAttribute("r", "42"); + }); + + it("supports inactive state", () => { + render(Loading); + const wrapper = screen.getByTestId("loader-inactive"); + + // Overlay should have stop class + const overlay = wrapper.querySelector(".bx--loading-overlay"); + expect(overlay).toHaveClass("bx--loading-overlay--stop"); + + // Loader should have stop class + const loader = wrapper.querySelector(".bx--loading"); + expect(loader).toHaveClass("bx--loading--stop"); + + // ARIA live should be off when inactive + expect(loader).toHaveAttribute("aria-live", "off"); + }); + + it("supports custom description", () => { + render(Loading); + const wrapper = screen.getByTestId("loader-description"); + + const title = wrapper.querySelector("title"); + expect(title).toHaveTextContent("Processing data..."); + }); + + it("renders with correct spinner radius", () => { + render(Loading); + + // Default (large) spinner + const defaultWrapper = screen.getByTestId("default-loader"); + const defaultStroke = defaultWrapper.querySelector(".bx--loading__stroke"); + expect(defaultStroke).toHaveAttribute("r", "44"); + + // Small spinner + const smallWrapper = screen.getByTestId("loader-small"); + const smallStroke = smallWrapper.querySelector(".bx--loading__stroke"); + expect(smallStroke).toHaveAttribute("r", "42"); + }); +}); From f23e7282b5cc9d216ed2bdcb3a72ee2adbc56383 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sun, 16 Mar 2025 12:16:55 -0700 Subject: [PATCH 007/211] test(link): add unit tests --- tests/Link.test.svelte | 9 --- tests/Link/Link.test.svelte | 87 ++++++++++++++++++++++++++ tests/Link/Link.test.ts | 121 ++++++++++++++++++++++++++++++++++++ 3 files changed, 208 insertions(+), 9 deletions(-) delete mode 100644 tests/Link.test.svelte create mode 100644 tests/Link/Link.test.svelte create mode 100644 tests/Link/Link.test.ts diff --git a/tests/Link.test.svelte b/tests/Link.test.svelte deleted file mode 100644 index 1a309c88..00000000 --- a/tests/Link.test.svelte +++ /dev/null @@ -1,9 +0,0 @@ - - - - Carbon Design System - - - diff --git a/tests/Link/Link.test.svelte b/tests/Link/Link.test.svelte new file mode 100644 index 00000000..61f98609 --- /dev/null +++ b/tests/Link/Link.test.svelte @@ -0,0 +1,87 @@ + + + + + +
+ { + e.preventDefault(); + console.log("click"); + }} + on:mouseover={() => { + console.log("mouseover"); + }} + on:mouseenter={() => { + console.log("mouseenter"); + }} + on:mouseleave={() => { + console.log("mouseleave"); + }} + > + Carbon Design System + +
+ + +
+ + Carbon Design System + +
+ + +
+ + Carbon Design System + +
+ + +
+ + Carbon Design System + +
+ + +
+ + Carbon Design System + + + + +
+ + +
+ + Carbon Design System + +
+ + +
+ + Carbon Design System + +
+ + +
+ + Carbon Design System + +
+ + +
+ + Carbon Design System + +
diff --git a/tests/Link/Link.test.ts b/tests/Link/Link.test.ts new file mode 100644 index 00000000..014b1383 --- /dev/null +++ b/tests/Link/Link.test.ts @@ -0,0 +1,121 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import Link from "./Link.test.svelte"; + +describe("Link", () => { + afterEach(() => { + vi.restoreAllMocks(); + }); + + it("renders with default props", () => { + render(Link); + const wrapper = screen.getByTestId("default-link"); + const link = wrapper.querySelector("a"); + + expect(link).toHaveClass("bx--link"); + expect(link).toHaveAttribute("href", "https://www.carbondesignsystem.com/"); + expect(link).toHaveTextContent("Carbon Design System"); + }); + + it("adds noopener noreferrer when target is _blank", () => { + render(Link); + const wrapper = screen.getByTestId("link-blank"); + const link = wrapper.querySelector("a"); + + expect(link).toHaveAttribute("target", "_blank"); + expect(link).toHaveAttribute("rel", "noopener noreferrer"); + }); + + it("supports inline variant", () => { + render(Link); + const wrapper = screen.getByTestId("link-inline"); + const link = wrapper.querySelector("a"); + + expect(link).toHaveClass("bx--link--inline"); + }); + + it("supports icon prop", () => { + render(Link); + const wrapper = screen.getByTestId("link-with-icon"); + const link = wrapper.querySelector("a"); + const iconWrapper = link?.querySelector(".bx--link__icon"); + + expect(iconWrapper).toBeInTheDocument(); + expect(iconWrapper?.querySelector("svg")).toBeInTheDocument(); + }); + + it("supports icon slot", () => { + render(Link); + const wrapper = screen.getByTestId("link-with-icon-slot"); + const link = wrapper.querySelector("a"); + const iconWrapper = link?.querySelector(".bx--link__icon"); + + expect(iconWrapper).toBeInTheDocument(); + expect(iconWrapper?.querySelector("svg")).toBeInTheDocument(); + }); + + it("supports large size variant", () => { + render(Link); + const wrapper = screen.getByTestId("link-large"); + const link = wrapper.querySelector("a"); + + expect(link).toHaveClass("bx--link--lg"); + }); + + it("supports small size variant", () => { + render(Link); + const wrapper = screen.getByTestId("link-small"); + const link = wrapper.querySelector("a"); + + expect(link).toHaveClass("bx--link--sm"); + }); + + it("supports disabled state", () => { + render(Link); + const wrapper = screen.getByTestId("link-disabled"); + const link = wrapper.querySelector("a"); + + expect(link).toHaveClass("bx--link--disabled"); + expect(link).toHaveAttribute("aria-disabled", "true"); + expect(link).toHaveAttribute("role", "link"); + }); + + it("supports visited state", () => { + render(Link); + const wrapper = screen.getByTestId("link-visited"); + const link = wrapper.querySelector("a"); + + expect(link).toHaveClass("bx--link--visited"); + }); + + it("supports click and mouse events", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Link); + + const wrapper = screen.getByTestId("default-link"); + const link = wrapper.querySelector("a"); + assert(link); + + await user.click(link); + expect(consoleLog).toHaveBeenCalledWith("click"); + + await user.hover(link); + expect(consoleLog).toHaveBeenCalledWith("mouseover"); + + await user.hover(link); + expect(consoleLog).toHaveBeenCalledWith("mouseenter"); + + await user.unhover(link); + expect(consoleLog).toHaveBeenCalledWith("mouseleave"); + expect(consoleLog).toHaveBeenCalledTimes(4); + }); + + it("prevents icon rendering when inline is true", () => { + render(Link); + const wrapper = screen.getByTestId("link-inline"); + const link = wrapper.querySelector("a"); + + expect(link).toHaveClass("bx--link--inline"); + expect(link?.querySelector(".bx--link__icon")).not.toBeInTheDocument(); + }); +}); From f28bfe307e26a396578b329a91e368af1e25da46 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sun, 16 Mar 2025 12:32:53 -0700 Subject: [PATCH 008/211] test(local-storage): add unit tests --- tests/LocalStorage.test.svelte | 22 ---- tests/LocalStorage/LocalStorage.test.svelte | 19 ++++ tests/LocalStorage/LocalStorage.test.ts | 103 ++++++++++++++++++ .../LocalStorageObject.test.svelte | 15 +++ tests/LocalStorage/LocalStorageObject.test.ts | 58 ++++++++++ .../LocalStoragePrimitive.test.svelte | 18 +++ .../LocalStoragePrimitive.test.ts | 61 +++++++++++ 7 files changed, 274 insertions(+), 22 deletions(-) delete mode 100644 tests/LocalStorage.test.svelte create mode 100644 tests/LocalStorage/LocalStorage.test.svelte create mode 100644 tests/LocalStorage/LocalStorage.test.ts create mode 100644 tests/LocalStorage/LocalStorageObject.test.svelte create mode 100644 tests/LocalStorage/LocalStorageObject.test.ts create mode 100644 tests/LocalStorage/LocalStoragePrimitive.test.svelte create mode 100644 tests/LocalStorage/LocalStoragePrimitive.test.ts diff --git a/tests/LocalStorage.test.svelte b/tests/LocalStorage.test.svelte deleted file mode 100644 index b67e50e3..00000000 --- a/tests/LocalStorage.test.svelte +++ /dev/null @@ -1,22 +0,0 @@ - - - { - events = [...events, { event: "on:save" }]; - }} - on:update={({ detail }) => { - events = [...events, { event: "on:update", detail }]; - }} -/> diff --git a/tests/LocalStorage/LocalStorage.test.svelte b/tests/LocalStorage/LocalStorage.test.svelte new file mode 100644 index 00000000..432f136f --- /dev/null +++ b/tests/LocalStorage/LocalStorage.test.svelte @@ -0,0 +1,19 @@ + + + + + +
+ +
+ + +
+ +
diff --git a/tests/LocalStorage/LocalStorage.test.ts b/tests/LocalStorage/LocalStorage.test.ts new file mode 100644 index 00000000..679b1142 --- /dev/null +++ b/tests/LocalStorage/LocalStorage.test.ts @@ -0,0 +1,103 @@ +import { render } from "@testing-library/svelte"; +import LocalStorage from "./LocalStorage.test.svelte"; + +describe("LocalStorage", () => { + let localStorageMock: { [key: string]: string }; + let originalLocalStorage: Storage; + + beforeEach(() => { + originalLocalStorage = global.localStorage; + localStorageMock = {}; + global.localStorage = { + getItem: vi.fn((key) => localStorageMock[key] || null), + setItem: vi.fn((key, value) => { + localStorageMock[key] = value; + }), + removeItem: vi.fn((key) => { + delete localStorageMock[key]; + }), + clear: vi.fn(() => { + localStorageMock = {}; + }), + length: 0, + key: vi.fn(), + }; + }); + + afterEach(() => { + global.localStorage = originalLocalStorage; + localStorage.clear(); + vi.restoreAllMocks(); + localStorageMock = {}; + }); + + it("saves primitive value to localStorage on mount", () => { + render(LocalStorage); + + expect(localStorage.setItem).toHaveBeenCalledWith( + "local-storage-key", + "test-value", + ); + }); + + it("saves object value as JSON string", () => { + render(LocalStorage); + + expect(localStorage.setItem).toHaveBeenCalledWith( + "theme-settings", + JSON.stringify({ theme: "dark", fontSize: 16 }), + ); + }); + + it("loads existing primitive value from localStorage", () => { + localStorageMock["local-storage-key"] = "existing-value"; + + render(LocalStorage); + expect(localStorage.getItem).toHaveBeenCalledWith("local-storage-key"); + }); + + it("loads existing object value from localStorage", () => { + // Set up existing value + const existingSettings = { theme: "light", fontSize: 14 }; + localStorageMock["theme-settings"] = JSON.stringify(existingSettings); + + render(LocalStorage); + expect(localStorage.getItem).toHaveBeenCalledWith("theme-settings"); + }); + + it("clears specific item from localStorage", () => { + const { component } = render(LocalStorage); + const storage = component.storage; + + if (storage) { + storage.clearItem(); + expect(localStorage.removeItem).toHaveBeenCalledWith("programmatic-key"); + } + }); + + it("clears all items from localStorage", () => { + const { component } = render(LocalStorage); + const storage = component.storage; + + if (storage) { + storage.clearAll(); + expect(localStorage.clear).toHaveBeenCalled(); + } + }); + + it("handles JSON parse errors gracefully", () => { + // Set up invalid JSON + localStorageMock["local-storage-key"] = "{invalid-json}"; + + render(LocalStorage); + expect(localStorage.getItem).toHaveBeenCalledWith("local-storage-key"); + }); + + it("uses default key if none provided", () => { + render(LocalStorage); + + expect(localStorage.getItem).toHaveBeenCalledWith( + expect.stringContaining("local-storage-key"), + ); + }); +}); diff --git a/tests/LocalStorage/LocalStorageObject.test.svelte b/tests/LocalStorage/LocalStorageObject.test.svelte new file mode 100644 index 00000000..23a78c17 --- /dev/null +++ b/tests/LocalStorage/LocalStorageObject.test.svelte @@ -0,0 +1,15 @@ + + +
+ { + console.log("update event", detail); + }} + /> +
diff --git a/tests/LocalStorage/LocalStorageObject.test.ts b/tests/LocalStorage/LocalStorageObject.test.ts new file mode 100644 index 00000000..d7228aac --- /dev/null +++ b/tests/LocalStorage/LocalStorageObject.test.ts @@ -0,0 +1,58 @@ +import { render } from "@testing-library/svelte"; +import LocalStorageObject from "./LocalStorageObject.test.svelte"; + +describe("LocalStorage - Object Values", () => { + let localStorageMock: { [key: string]: string }; + let originalLocalStorage: Storage; + + beforeEach(() => { + originalLocalStorage = global.localStorage; + localStorageMock = {}; + + global.localStorage = { + getItem: vi.fn((key) => localStorageMock[key] || null), + setItem: vi.fn((key, value) => { + localStorageMock[key] = value; + }), + removeItem: vi.fn((key) => { + delete localStorageMock[key]; + }), + clear: vi.fn(() => { + localStorageMock = {}; + }), + length: 0, + key: vi.fn(), + }; + }); + + afterEach(() => { + global.localStorage = originalLocalStorage; + localStorage.clear(); + vi.restoreAllMocks(); + localStorageMock = {}; + }); + + it("saves object value as JSON string", () => { + render(LocalStorageObject); + + expect(localStorage.setItem).toHaveBeenCalledWith( + "theme-settings", + JSON.stringify({ theme: "dark", fontSize: 16 }), + ); + }); + + it("loads existing object value from localStorage", () => { + const existingSettings = { theme: "light", fontSize: 14 }; + localStorageMock["theme-settings"] = JSON.stringify(existingSettings); + + render(LocalStorageObject); + expect(localStorage.getItem).toHaveBeenCalledWith("theme-settings"); + }); + + it("handles malformed JSON gracefully", () => { + localStorageMock["theme-settings"] = "{malformed-json}"; + + render(LocalStorageObject); + expect(localStorage.getItem).toHaveBeenCalledWith("theme-settings"); + }); +}); diff --git a/tests/LocalStorage/LocalStoragePrimitive.test.svelte b/tests/LocalStorage/LocalStoragePrimitive.test.svelte new file mode 100644 index 00000000..60d6a598 --- /dev/null +++ b/tests/LocalStorage/LocalStoragePrimitive.test.svelte @@ -0,0 +1,18 @@ + + +
+ { + console.log("save event"); + }} + on:update={({ detail }) => { + console.log("update event", detail); + }} + /> +
diff --git a/tests/LocalStorage/LocalStoragePrimitive.test.ts b/tests/LocalStorage/LocalStoragePrimitive.test.ts new file mode 100644 index 00000000..6a80e626 --- /dev/null +++ b/tests/LocalStorage/LocalStoragePrimitive.test.ts @@ -0,0 +1,61 @@ +import { render } from "@testing-library/svelte"; +import LocalStoragePrimitive from "./LocalStoragePrimitive.test.svelte"; + +describe("LocalStorage - Primitive Values", () => { + let localStorageMock: { [key: string]: string }; + let originalLocalStorage: Storage; + let consoleSpy: any; + + beforeEach(() => { + originalLocalStorage = global.localStorage; + localStorageMock = {}; + consoleSpy = vi.spyOn(console, "log"); + + global.localStorage = { + getItem: vi.fn((key) => localStorageMock[key] || null), + setItem: vi.fn((key, value) => { + localStorageMock[key] = value; + }), + removeItem: vi.fn((key) => { + delete localStorageMock[key]; + }), + clear: vi.fn(() => { + localStorageMock = {}; + }), + length: 0, + key: vi.fn(), + }; + }); + + afterEach(() => { + global.localStorage = originalLocalStorage; + localStorage.clear(); + vi.restoreAllMocks(); + localStorageMock = {}; + }); + + it("saves primitive value to localStorage on mount", () => { + render(LocalStoragePrimitive); + + expect(localStorage.setItem).toHaveBeenCalledWith("test-key", "test-value"); + }); + + it("loads existing primitive value from localStorage", () => { + localStorageMock["test-key"] = "existing-value"; + + render(LocalStoragePrimitive); + expect(localStorage.getItem).toHaveBeenCalledWith("test-key"); + }); + + it("dispatches save event when setting initial value", () => { + render(LocalStoragePrimitive); + expect(consoleSpy).toHaveBeenCalledWith("save event"); + }); + + it("handles invalid values gracefully", () => { + localStorageMock["test-key"] = "{invalid-value}"; + + render(LocalStoragePrimitive); + expect(localStorage.getItem).toHaveBeenCalledWith("test-key"); + }); +}); From 150e03e1fdac05f1dd878ee87329b611132171d0 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sun, 16 Mar 2025 13:52:33 -0700 Subject: [PATCH 009/211] test(theme): add unit tests --- tests/Theme.test.svelte | 24 ---- tests/Theme/Theme.test.svelte | 23 +++ tests/Theme/Theme.test.ts | 168 ++++++++++++++++++++++ tests/Theme/ThemeSelect.test.svelte | 10 ++ tests/Theme/ThemeSelectCustom.test.svelte | 15 ++ tests/Theme/ThemeToggle.test.svelte | 10 ++ tests/Theme/ThemeToggleCustom.test.svelte | 17 +++ 7 files changed, 243 insertions(+), 24 deletions(-) delete mode 100644 tests/Theme.test.svelte create mode 100644 tests/Theme/Theme.test.svelte create mode 100644 tests/Theme/Theme.test.ts create mode 100644 tests/Theme/ThemeSelect.test.svelte create mode 100644 tests/Theme/ThemeSelectCustom.test.svelte create mode 100644 tests/Theme/ThemeToggle.test.svelte create mode 100644 tests/Theme/ThemeToggleCustom.test.svelte diff --git a/tests/Theme.test.svelte b/tests/Theme.test.svelte deleted file mode 100644 index 929e5386..00000000 --- a/tests/Theme.test.svelte +++ /dev/null @@ -1,24 +0,0 @@ - - - console.log(e.detail.theme)} - tokens={{ "button-primary": "violet" }} - render="toggle" - toggle={{ - themes: ["g10", "g90"], - labelA: "", - labelB: "", - }} - select={{ - themes: ["g10", "g90"], - labelText: "", - }} -/> diff --git a/tests/Theme/Theme.test.svelte b/tests/Theme/Theme.test.svelte new file mode 100644 index 00000000..1fadc6b3 --- /dev/null +++ b/tests/Theme/Theme.test.svelte @@ -0,0 +1,23 @@ + + + + +
+ { + console.log("update", detail); + }} + > + + +
diff --git a/tests/Theme/Theme.test.ts b/tests/Theme/Theme.test.ts new file mode 100644 index 00000000..9758855a --- /dev/null +++ b/tests/Theme/Theme.test.ts @@ -0,0 +1,168 @@ +import { render, screen } from "@testing-library/svelte"; +import { tick } from "svelte"; +import { user } from "../setup-tests"; +import Theme from "./Theme.test.svelte"; +import ThemeSelect from "./ThemeSelect.test.svelte"; +import ThemeSelectCustom from "./ThemeSelectCustom.test.svelte"; +import ThemeToggle from "./ThemeToggle.test.svelte"; +import ThemeToggleCustom from "./ThemeToggleCustom.test.svelte"; + +describe("Theme", () => { + let documentMock: { + setAttribute: ReturnType; + style: { setProperty: ReturnType }; + }; + let consoleLog: ReturnType; + let localStorageMock: Record; + let originalLocalStorage: Storage; + + beforeEach(() => { + documentMock = { + setAttribute: vi.spyOn(document.documentElement, "setAttribute"), + style: { + setProperty: vi.spyOn(document.documentElement.style, "setProperty"), + }, + }; + consoleLog = vi.spyOn(console, "log"); + originalLocalStorage = global.localStorage; + localStorageMock = {}; + + global.localStorage = { + getItem: vi.fn((key) => localStorageMock[key] || null), + setItem: vi.fn((key, value) => { + localStorageMock[key] = value; + }), + removeItem: vi.fn((key) => { + delete localStorageMock[key]; + }), + clear: vi.fn(() => { + localStorageMock = {}; + }), + length: 0, + key: vi.fn(), + }; + }); + + afterEach(() => { + vi.restoreAllMocks(); + global.localStorage = originalLocalStorage; + localStorage.clear(); + localStorageMock = {}; + }); + + it("should set default theme to white", () => { + render(Theme); + expect(documentMock.setAttribute).toHaveBeenCalledWith("theme", "white"); + }); + + it("should update theme attribute when theme changes", async () => { + const { component } = render(Theme); + + component.$set({ theme: "g100" }); + await tick(); + + expect(documentMock.setAttribute).toHaveBeenCalledWith("theme", "g100"); + expect(consoleLog).toHaveBeenCalledWith("update", { theme: "g100" }); + }); + + it("should apply custom tokens", async () => { + const tokens = { + "interactive-01": "#ff0000", + "ui-background": "#ffffff", + }; + + render(Theme, { props: { tokens } }); + await tick(); + + expect(documentMock.style.setProperty).toHaveBeenCalledWith( + "--cds-interactive-01", + "#ff0000", + ); + expect(documentMock.style.setProperty).toHaveBeenCalledWith( + "--cds-ui-background", + "#ffffff", + ); + }); + + it("should persist theme in localStorage when persist is true", async () => { + render(Theme, { props: { persist: true } }); + await tick(); + + expect(localStorage.setItem).toHaveBeenCalledWith("theme", "white"); + }); + + it("should load persisted theme from localStorage", async () => { + localStorageMock["theme"] = "g90"; + + render(Theme, { props: { persist: true } }); + await tick(); + + expect(documentMock.setAttribute).toHaveBeenCalledWith("theme", "g90"); + }); + + it("should warn on invalid theme", async () => { + const consoleWarn = vi.spyOn(console, "warn"); + const { component } = render(Theme); + + // @ts-ignore - Testing invalid theme + component.$set({ theme: "invalid" }); + await tick(); + + expect(consoleWarn).toHaveBeenCalledWith( + expect.stringContaining('invalid theme "invalid"'), + ); + }); + + it("should render toggle when render prop is set to toggle", async () => { + render(ThemeToggle); + + const toggle = screen.getByLabelText("Dark mode"); + expect(toggle).toBeInTheDocument(); + expect(toggle).toHaveAttribute("type", "checkbox"); + + await user.click(toggle); + expect(consoleLog).toHaveBeenCalledWith("update", { theme: "g100" }); + + await user.click(toggle); + expect(consoleLog).toHaveBeenCalledWith("update", { theme: "white" }); + }); + + it("should render custom toggle when render prop is set to toggle and custom toggle options are provided", async () => { + render(ThemeToggleCustom); + + const toggle = screen.getAllByText("Enable dark mode")[0]; + expect(toggle).toBeInTheDocument(); + + await user.click(toggle); + expect(consoleLog).toHaveBeenCalledWith("update", { theme: "g80" }); + + await user.click(toggle); + expect(consoleLog).toHaveBeenCalledWith("update", { theme: "g10" }); + }); + + it("should render select when render prop is set to select", async () => { + render(ThemeSelect); + + const select = screen.getByLabelText("Themes"); + expect(select).toBeInTheDocument(); + + await user.selectOptions(select, "g100"); + expect(consoleLog).toHaveBeenCalledWith("update", { theme: "g100" }); + + await user.selectOptions(select, "white"); + expect(consoleLog).toHaveBeenCalledWith("update", { theme: "white" }); + }); + + it("should render custom select when render prop is set to select and custom select options are provided", async () => { + render(ThemeSelectCustom); + + const select = screen.getByLabelText("Select a theme"); + expect(select).toBeInTheDocument(); + + await user.selectOptions(select, "g100"); + expect(consoleLog).toHaveBeenCalledWith("update", { theme: "g100" }); + + await user.selectOptions(select, "white"); + expect(consoleLog).toHaveBeenCalledWith("update", { theme: "white" }); + }); +}); diff --git a/tests/Theme/ThemeSelect.test.svelte b/tests/Theme/ThemeSelect.test.svelte new file mode 100644 index 00000000..3648b3ef --- /dev/null +++ b/tests/Theme/ThemeSelect.test.svelte @@ -0,0 +1,10 @@ + + + { + console.log("update", detail); + }} +/> diff --git a/tests/Theme/ThemeSelectCustom.test.svelte b/tests/Theme/ThemeSelectCustom.test.svelte new file mode 100644 index 00000000..93fbfea3 --- /dev/null +++ b/tests/Theme/ThemeSelectCustom.test.svelte @@ -0,0 +1,15 @@ + + + { + console.log("update", detail); + }} +/> diff --git a/tests/Theme/ThemeToggle.test.svelte b/tests/Theme/ThemeToggle.test.svelte new file mode 100644 index 00000000..6512a23d --- /dev/null +++ b/tests/Theme/ThemeToggle.test.svelte @@ -0,0 +1,10 @@ + + + { + console.log("update", detail); + }} +/> diff --git a/tests/Theme/ThemeToggleCustom.test.svelte b/tests/Theme/ThemeToggleCustom.test.svelte new file mode 100644 index 00000000..c3f8a01e --- /dev/null +++ b/tests/Theme/ThemeToggleCustom.test.svelte @@ -0,0 +1,17 @@ + + + { + console.log("update", detail); + }} +/> From 0c6a171a246b0729f1620b7d1ca7ec2cbd921cd4 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sun, 16 Mar 2025 14:17:48 -0700 Subject: [PATCH 010/211] test(tabs): add unit tests --- tests/Tabs.test.svelte | 48 -------------- tests/Tabs/Tabs.test.svelte | 29 ++++++++ tests/Tabs/Tabs.test.ts | 129 ++++++++++++++++++++++++++++++++++++ 3 files changed, 158 insertions(+), 48 deletions(-) delete mode 100644 tests/Tabs.test.svelte create mode 100644 tests/Tabs/Tabs.test.svelte create mode 100644 tests/Tabs/Tabs.test.ts diff --git a/tests/Tabs.test.svelte b/tests/Tabs.test.svelte deleted file mode 100644 index 5f2dd5b8..00000000 --- a/tests/Tabs.test.svelte +++ /dev/null @@ -1,48 +0,0 @@ - - - { - console.log(e.detail); // number - }} -> - - - -
- Content 1 - Content 2 - Content 3 -
-
- -Content 1 - -Content 2 - -Content 3 - - - - - -
- Content 1 - Content 2 - Content 3 -
-
- -Content 1 - -Content 2 - -Content 3 - - diff --git a/tests/Tabs/Tabs.test.svelte b/tests/Tabs/Tabs.test.svelte new file mode 100644 index 00000000..27f06ebd --- /dev/null +++ b/tests/Tabs/Tabs.test.svelte @@ -0,0 +1,29 @@ + + + { + console.log("change event", detail); + }} +> + + + + + Content 1 + Content 2 + Content 3 + + diff --git a/tests/Tabs/Tabs.test.ts b/tests/Tabs/Tabs.test.ts new file mode 100644 index 00000000..16ef4573 --- /dev/null +++ b/tests/Tabs/Tabs.test.ts @@ -0,0 +1,129 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import Tabs from "./Tabs.test.svelte"; + +describe("Tabs", () => { + let consoleLog: ReturnType; + + beforeEach(() => { + consoleLog = vi.spyOn(console, "log"); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + it("should render with default props", () => { + render(Tabs); + + expect(screen.getByRole("tab", { name: "Tab 1" })).toBeInTheDocument(); + expect(screen.getByRole("tab", { name: "Tab 2" })).toBeInTheDocument(); + expect(screen.getByRole("tab", { name: "Tab 3" })).toBeInTheDocument(); + expect(screen.getByText("Content 1")).toBeVisible(); + expect(screen.getByText("Content 2")).not.toBeVisible(); + expect(screen.getByText("Content 3")).not.toBeVisible(); + }); + + it("should select initial tab based on selected prop", () => { + render(Tabs, { props: { selected: 2 } }); + + const tab3 = screen.getByRole("tab", { name: "Tab 3" }); + expect(tab3).toHaveAttribute("aria-selected", "true"); + expect(screen.getByText("Content 3")).toBeVisible(); + expect(screen.getByText("Content 1")).not.toBeVisible(); + expect(screen.getByText("Content 2")).not.toBeVisible(); + }); + + it("should change tab on click", async () => { + render(Tabs); + + const tab3 = screen.getByRole("tab", { name: "Tab 3" }); + await user.click(tab3); + + expect(tab3.getAttribute("aria-selected")).toBe("true"); + expect(screen.getByText("Content 3")).toBeVisible(); + expect(consoleLog).toHaveBeenCalledWith("change event", 2); + }); + + it("should not select disabled tabs", async () => { + render(Tabs); + + const tab2 = screen.getByRole("tab", { name: "Tab 2" }); + expect(tab2).toHaveAttribute("aria-disabled", "true"); + await user.click(tab2); + + expect(tab2).toHaveAttribute("aria-selected", "false"); + expect(screen.getByText("Content 1")).toBeVisible(); + }); + + it("should support keyboard navigation", async () => { + render(Tabs); + + const tab1 = screen.getByRole("tab", { name: "Tab 1" }); + await user.click(tab1); + + await user.keyboard("{ArrowRight}"); + expect(screen.getByRole("tab", { name: "Tab 3" })).toHaveFocus(); + expect(consoleLog).toHaveBeenCalledWith("change event", 2); + + await user.keyboard("{ArrowLeft}"); + expect(tab1).toHaveFocus(); + expect(consoleLog).toHaveBeenCalledWith("change event", 0); + }); + + it("should render container type tabs", () => { + const { container } = render(Tabs, { + props: { type: "container" }, + }); + + expect(container.querySelector(".bx--tabs--container")).not.toBeNull(); + }); + + it("should support auto width", () => { + const { container } = render(Tabs, { + props: { autoWidth: true }, + }); + + const tabs = container.querySelectorAll(".bx--tabs__nav-item"); + tabs.forEach((tab) => { + expect(tab).not.toHaveStyle({ width: "10rem" }); + }); + }); + + it("should show dropdown on trigger click", async () => { + const { container } = render(Tabs); + + const trigger = container.querySelector(".bx--tabs-trigger"); + if (!trigger) throw new Error("Trigger element not found"); + + await user.click(trigger); + expect(container.querySelector(".bx--tabs__nav--hidden")).toBeNull(); + }); + + it("should update trigger text when tab changes", async () => { + const { container } = render(Tabs); + + const tab3 = screen.getByText("Tab 3"); + await user.click(tab3); + + const triggerText = container.querySelector(".bx--tabs-trigger-text"); + expect(triggerText).toHaveTextContent("Tab 3"); + }); + + it("should support custom trigger href", () => { + const { container } = render(Tabs, { + props: { triggerHref: "#custom" }, + }); + + const triggerLink = container.querySelector(".bx--tabs-trigger-text"); + expect(triggerLink).toHaveAttribute("href", "#custom"); + }); + + it("should support custom icon description", () => { + render(Tabs, { + props: { iconDescription: "Custom description" }, + }); + + expect(screen.getByTitle("Custom description")).toBeInTheDocument(); + }); +}); From c118a5392e42e84b8d3291990a0df2ddfc7a2634 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sun, 16 Mar 2025 14:29:24 -0700 Subject: [PATCH 011/211] ci: use `macos-latest-xlarge` (#2123) --- .github/workflows/checks.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index df91e1b9..24297747 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -5,7 +5,7 @@ on: jobs: test: - runs-on: ubuntu-latest + runs-on: macos-latest-xlarge steps: - uses: actions/checkout@v4 - uses: actions/cache@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e57dc6ca..3198c4c0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,7 +5,7 @@ on: jobs: release: - runs-on: ubuntu-latest + runs-on: macos-latest-xlarge permissions: contents: read id-token: write From 023b49d0509603d3e90525e995394e490705aa6e Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sun, 16 Mar 2025 15:37:40 -0700 Subject: [PATCH 012/211] docs(copy-button): remove note on compatability --- docs/src/pages/components/CopyButton.svx | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/src/pages/components/CopyButton.svx b/docs/src/pages/components/CopyButton.svx index a450d6b7..d13e7caa 100644 --- a/docs/src/pages/components/CopyButton.svx +++ b/docs/src/pages/components/CopyButton.svx @@ -5,8 +5,6 @@ This component uses the native, asynchronous [Clipboard API](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard/writeText) to copy text. -Please note that the `clipboard.writeText` API is not supported in [IE 11 nor Safari iOS version 13.3 or lower](https://caniuse.com/mdn-api_clipboard_writetext). - You can override the default copy functionality with your own implementation. See [Overriding copy functionality](#overriding-copy-functionality). ## Default From 5caa9c90b35022c14c072a859ab2e5e10959e979 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sun, 16 Mar 2025 16:59:41 -0700 Subject: [PATCH 013/211] test(tooltip-definition): add unit tests --- tests/TooltipDefinition.test.svelte | 29 ---- .../TooltipDefinition.test.svelte | 26 +++ .../TooltipDefinition.test.ts | 158 ++++++++++++++++++ 3 files changed, 184 insertions(+), 29 deletions(-) delete mode 100644 tests/TooltipDefinition.test.svelte create mode 100644 tests/TooltipDefinition/TooltipDefinition.test.svelte create mode 100644 tests/TooltipDefinition/TooltipDefinition.test.ts diff --git a/tests/TooltipDefinition.test.svelte b/tests/TooltipDefinition.test.svelte deleted file mode 100644 index a4c41069..00000000 --- a/tests/TooltipDefinition.test.svelte +++ /dev/null @@ -1,29 +0,0 @@ - - - - Armonk - - - - Armonk - - - - Armonk - - IBM Corporate Headquarters is based in Armonk, New York. - - diff --git a/tests/TooltipDefinition/TooltipDefinition.test.svelte b/tests/TooltipDefinition/TooltipDefinition.test.svelte new file mode 100644 index 00000000..ce308884 --- /dev/null +++ b/tests/TooltipDefinition/TooltipDefinition.test.svelte @@ -0,0 +1,26 @@ + + + { + console.log("open"); + }} + on:close={() => { + console.log("close"); + }} +> + {triggerContent} + diff --git a/tests/TooltipDefinition/TooltipDefinition.test.ts b/tests/TooltipDefinition/TooltipDefinition.test.ts new file mode 100644 index 00000000..0250f0cd --- /dev/null +++ b/tests/TooltipDefinition/TooltipDefinition.test.ts @@ -0,0 +1,158 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import TooltipDefinition from "./TooltipDefinition.test.svelte"; + +describe("TooltipDefinition", () => { + let consoleLog: ReturnType; + + beforeEach(() => { + consoleLog = vi.spyOn(console, "log"); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + it("should render with default props", () => { + render(TooltipDefinition); + + expect(screen.getByText("Tooltip trigger")).toBeInTheDocument(); + expect(screen.getByText("Test tooltip text")).toBeInTheDocument(); + }); + + it("should show tooltip on hover", async () => { + render(TooltipDefinition); + + const trigger = screen.getByText("Tooltip trigger"); + await user.hover(trigger); + + expect(trigger).toHaveClass("bx--tooltip--visible"); + expect(consoleLog).toHaveBeenCalledWith("open"); + }); + + it("should hide tooltip on mouse leave", async () => { + render(TooltipDefinition); + + const trigger = screen.getByText("Tooltip trigger"); + await user.hover(trigger); + await user.unhover(trigger); + + expect(trigger).toHaveClass("bx--tooltip--hidden"); + expect(consoleLog).toHaveBeenCalledWith("close"); + }); + + it("should show tooltip on focus", async () => { + render(TooltipDefinition); + + const trigger = screen.getByText("Tooltip trigger"); + await user.tab(); + + expect(trigger).toHaveClass("bx--tooltip--visible"); + expect(consoleLog).toHaveBeenCalledWith("open"); + }); + + it("should hide tooltip on blur", async () => { + render(TooltipDefinition); + + const trigger = screen.getByText("Tooltip trigger"); + await user.tab(); + await user.tab(); + + expect(trigger).toHaveClass("bx--tooltip--hidden"); + expect(consoleLog).toHaveBeenCalledWith("close"); + }); + + it("should hide tooltip on Escape key", async () => { + render(TooltipDefinition); + + const trigger = screen.getByText("Tooltip trigger"); + await user.hover(trigger); + await user.keyboard("{Escape}"); + + expect(trigger).toHaveClass("bx--tooltip--hidden"); + expect(consoleLog).toHaveBeenCalledWith("close"); + }); + + it("should support top direction", () => { + render(TooltipDefinition, { + props: { direction: "top" }, + }); + + const trigger = screen.getByText("Tooltip trigger"); + expect(trigger).toHaveClass("bx--tooltip--top"); + }); + + it("should support bottom direction", () => { + render(TooltipDefinition, { + props: { direction: "bottom" }, + }); + + const trigger = screen.getByText("Tooltip trigger"); + expect(trigger).toHaveClass("bx--tooltip--bottom"); + }); + + it("should support start alignment", () => { + render(TooltipDefinition, { + props: { align: "start" }, + }); + + const trigger = screen.getByText("Tooltip trigger"); + expect(trigger).toHaveClass("bx--tooltip--align-start"); + }); + + it("should support center alignment", () => { + render(TooltipDefinition, { + props: { align: "center" }, + }); + + const trigger = screen.getByText("Tooltip trigger"); + expect(trigger).toHaveClass("bx--tooltip--align-center"); + }); + + it("should support end alignment", () => { + render(TooltipDefinition, { + props: { align: "end" }, + }); + + const trigger = screen.getByText("Tooltip trigger"); + expect(trigger).toHaveClass("bx--tooltip--align-end"); + }); + + it("should support custom trigger content", () => { + render(TooltipDefinition, { + props: { + triggerContent: "Custom trigger", + }, + }); + + expect(screen.getByText("Custom trigger")).toBeInTheDocument(); + }); + + it("should support controlled open state", () => { + render(TooltipDefinition, { + props: { open: true }, + }); + + const trigger = screen.getByText("Tooltip trigger"); + expect(trigger).toHaveClass("bx--tooltip--visible"); + }); + + it("should use provided id for tooltip", () => { + render(TooltipDefinition, { + props: { id: "custom-id" }, + }); + + const tooltip = screen.getByRole("tooltip"); + expect(tooltip).toHaveAttribute("id", "custom-id"); + }); + + it("should have correct ARIA attributes", () => { + render(TooltipDefinition); + + const trigger = screen.getByText("Tooltip trigger"); + const tooltip = screen.getByRole("tooltip"); + + expect(trigger).toHaveAttribute("aria-describedby", tooltip.id); + expect(tooltip).toHaveClass("bx--assistive-text"); + }); +}); From 19a6c65313d997ec94af93dadd012ed70e416428 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sun, 16 Mar 2025 17:16:04 -0700 Subject: [PATCH 014/211] test(tooltip-icon): add unit tests --- tests/TooltipIcon.test.svelte | 33 ------ tests/TooltipIcon/TooltipIcon.test.svelte | 28 +++++ tests/TooltipIcon/TooltipIcon.test.ts | 120 ++++++++++++++++++++++ 3 files changed, 148 insertions(+), 33 deletions(-) delete mode 100644 tests/TooltipIcon.test.svelte create mode 100644 tests/TooltipIcon/TooltipIcon.test.svelte create mode 100644 tests/TooltipIcon/TooltipIcon.test.ts diff --git a/tests/TooltipIcon.test.svelte b/tests/TooltipIcon.test.svelte deleted file mode 100644 index 4f69a3e9..00000000 --- a/tests/TooltipIcon.test.svelte +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Carbon is an open source design system by IBM. - - diff --git a/tests/TooltipIcon/TooltipIcon.test.svelte b/tests/TooltipIcon/TooltipIcon.test.svelte new file mode 100644 index 00000000..ca40f41d --- /dev/null +++ b/tests/TooltipIcon/TooltipIcon.test.svelte @@ -0,0 +1,28 @@ + + + + + + diff --git a/tests/TooltipIcon/TooltipIcon.test.ts b/tests/TooltipIcon/TooltipIcon.test.ts new file mode 100644 index 00000000..52e0668b --- /dev/null +++ b/tests/TooltipIcon/TooltipIcon.test.ts @@ -0,0 +1,120 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import TooltipIcon from "./TooltipIcon.test.svelte"; + +describe("TooltipIcon", () => { + it("should render with default props", () => { + render(TooltipIcon); + + expect(screen.getByText("Test tooltip text")).toBeInTheDocument(); + }); + + it("should show and hide the tooltip", async () => { + render(TooltipIcon); + + const trigger = screen.getByRole("button"); + await user.hover(trigger); + + expect(trigger).not.toHaveClass("bx--tooltip--hidden"); + + await user.keyboard("{Escape}"); + expect(screen.getByRole("button")).toHaveClass("bx--tooltip--hidden"); + }); + + it("should show tooltip on focus", async () => { + render(TooltipIcon); + + const trigger = screen.getByRole("button"); + await user.tab(); + + expect(trigger).not.toHaveClass("bx--tooltip--hidden"); + }); + + it("should hide tooltip on Escape key", async () => { + render(TooltipIcon); + + const trigger = screen.getByRole("button"); + await user.hover(trigger); + await user.keyboard("{Escape}"); + + expect(trigger).toHaveClass("bx--tooltip--hidden"); + }); + + describe("tooltip positioning", () => { + test.each([ + ["top", "bx--tooltip--top"], + ["right", "bx--tooltip--right"], + ["bottom", "bx--tooltip--bottom"], + ["left", "bx--tooltip--left"], + ] as const)("should support %s direction", (direction, expectedClass) => { + render(TooltipIcon, { + props: { direction }, + }); + + const trigger = screen.getByRole("button"); + expect(trigger).toHaveClass(expectedClass); + }); + + test.each([ + ["start", "bx--tooltip--align-start"], + ["center", "bx--tooltip--align-center"], + ["end", "bx--tooltip--align-end"], + ] as const)("should support %s alignment", (align, expectedClass) => { + render(TooltipIcon, { + props: { align }, + }); + + const trigger = screen.getByRole("button"); + expect(trigger).toHaveClass(expectedClass); + }); + }); + + it("should support disabled state", () => { + render(TooltipIcon, { + props: { disabled: true }, + }); + + const trigger = screen.getByRole("button"); + expect(trigger).toBeDisabled(); + expect(trigger).toHaveStyle({ cursor: "not-allowed" }); + expect(trigger).toHaveClass("bx--tooltip--hidden"); + }); + + it("should not show tooltip when disabled", async () => { + render(TooltipIcon, { + props: { disabled: true }, + }); + + const trigger = screen.getByRole("button"); + await user.hover(trigger); + + expect(trigger).toHaveClass("bx--tooltip--hidden"); + }); + + it("should support custom tooltip text", () => { + render(TooltipIcon, { + props: { tooltipText: "Custom tooltip" }, + }); + + expect(screen.getByText("Custom tooltip")).toBeInTheDocument(); + }); + + it("should use provided id for tooltip", () => { + render(TooltipIcon, { + props: { id: "custom-id" }, + }); + + const tooltip = screen.getByRole("button"); + expect(tooltip).toHaveAttribute("aria-describedby", "custom-id"); + }); + + it("should have correct ARIA attributes", () => { + render(TooltipIcon); + + const trigger = screen.getByRole("button"); + const tooltip = screen.getByText("Test tooltip text"); + + expect(trigger).toHaveAttribute("aria-describedby", "test-tooltip"); + expect(tooltip).toHaveClass("bx--assistive-text"); + }); +}); From d64465e7741ef54424f3effc0b451a718905ea1b Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sun, 16 Mar 2025 17:22:05 -0700 Subject: [PATCH 015/211] test(truncate): add unit tests --- tests/Truncate.test.svelte | 22 ------ tests/Truncate/Truncate.test.svelte | 11 +++ tests/Truncate/Truncate.test.ts | 90 +++++++++++++++++++++++ tests/Truncate/TruncateAction.test.svelte | 22 ++++++ 4 files changed, 123 insertions(+), 22 deletions(-) delete mode 100644 tests/Truncate.test.svelte create mode 100644 tests/Truncate/Truncate.test.svelte create mode 100644 tests/Truncate/Truncate.test.ts create mode 100644 tests/Truncate/TruncateAction.test.svelte diff --git a/tests/Truncate.test.svelte b/tests/Truncate.test.svelte deleted file mode 100644 index 64f4049e..00000000 --- a/tests/Truncate.test.svelte +++ /dev/null @@ -1,22 +0,0 @@ - - - - Carbon Components Svelte is a Svelte component library that implements the - Carbon Design System, an open source design system by IBM. - - - - Carbon Components Svelte is a Svelte component library that implements the - Carbon Design System, an open source design system by IBM. - - -

- Carbon Components Svelte is a Svelte component library that implements the - Carbon Design System, an open source design system by IBM. -

-

- Carbon Components Svelte is a Svelte component library that implements the - Carbon Design System, an open source design system by IBM. -

diff --git a/tests/Truncate/Truncate.test.svelte b/tests/Truncate/Truncate.test.svelte new file mode 100644 index 00000000..d9aee792 --- /dev/null +++ b/tests/Truncate/Truncate.test.svelte @@ -0,0 +1,11 @@ + + + + {text} + diff --git a/tests/Truncate/Truncate.test.ts b/tests/Truncate/Truncate.test.ts new file mode 100644 index 00000000..b5f7b758 --- /dev/null +++ b/tests/Truncate/Truncate.test.ts @@ -0,0 +1,90 @@ +import { render, screen } from "@testing-library/svelte"; +import Truncate from "./Truncate.test.svelte"; +import TruncateAction from "./TruncateAction.test.svelte"; + +describe("Truncate", () => { + describe("component", () => { + test.each([ + ["end", "bx--text-truncate--end"], + ["front", "bx--text-truncate--front"], + ] as const)("should support %s clamp", (clamp, expectedClass) => { + render(Truncate, { props: { clamp } }); + + const element = screen.getByText(/This is a long text/); + expect(element).toHaveClass(expectedClass); + }); + + it("should render text content", () => { + const text = "Custom text content"; + render(Truncate, { props: { text } }); + + expect(screen.getByText(text)).toBeInTheDocument(); + }); + + it("should render as paragraph element", () => { + render(Truncate); + + const element = screen.getByText(/This is a long text/); + expect(element.tagName).toBe("P"); + }); + + it("should default to end clamp", () => { + render(Truncate); + + const element = screen.getByText(/This is a long text/); + expect(element).toHaveClass("bx--text-truncate--end"); + }); + }); + + describe("action", () => { + test.each([ + ["end", "bx--text-truncate--end"], + ["front", "bx--text-truncate--front"], + ] as const)("should support %s clamp", (clamp, expectedClass) => { + render(TruncateAction, { props: { clamp } }); + + const element = screen.getByText(/This is a long text/); + expect(element).toHaveClass(expectedClass); + }); + + test.each([ + ["h1", "H1"], + ["h2", "H2"], + ["h3", "H3"], + ["h4", "H4"], + ["p", "P"], + ["span", "SPAN"], + ] as const)("should work with %s element", (elementType, expectedTag) => { + render(TruncateAction, { props: { element: elementType } }); + + const element = screen.getByText(/This is a long text/); + expect(element.tagName).toBe(expectedTag); + expect(element).toHaveClass("bx--text-truncate--end"); + }); + + it("should preserve existing classes", () => { + render(TruncateAction, { + props: { + element: "p", + text: "Test", + }, + }); + + const element = screen.getByText("Test"); + element.classList.add("custom-class"); + + // Trigger update + element.dispatchEvent(new Event("update")); + + expect(element).toHaveClass("custom-class"); + expect(element).toHaveClass("bx--text-truncate--end"); + }); + + it("should default to end clamp", () => { + render(TruncateAction); + + const element = screen.getByText(/This is a long text/); + expect(element).toHaveClass("bx--text-truncate--end"); + }); + }); +}); diff --git a/tests/Truncate/TruncateAction.test.svelte b/tests/Truncate/TruncateAction.test.svelte new file mode 100644 index 00000000..fe2d8b50 --- /dev/null +++ b/tests/Truncate/TruncateAction.test.svelte @@ -0,0 +1,22 @@ + + +{#if element === "h1"} +

{text}

+{:else if element === "h2"} +

{text}

+{:else if element === "h3"} +

{text}

+{:else if element === "h4"} +

{text}

+{:else if element === "span"} + {text} +{:else} +

{text}

+{/if} From b6b5579f67babe5cf072ff520f4780bf2a891f1f Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sun, 16 Mar 2025 17:26:44 -0700 Subject: [PATCH 016/211] test(unordered-list): add unit tests --- tests/UnorderedList.test.svelte | 39 ------ tests/UnorderedList/UnorderedList.test.svelte | 30 ++++ tests/UnorderedList/UnorderedList.test.ts | 128 ++++++++++++++++++ 3 files changed, 158 insertions(+), 39 deletions(-) delete mode 100644 tests/UnorderedList.test.svelte create mode 100644 tests/UnorderedList/UnorderedList.test.svelte create mode 100644 tests/UnorderedList/UnorderedList.test.ts diff --git a/tests/UnorderedList.test.svelte b/tests/UnorderedList.test.svelte deleted file mode 100644 index f2d3292d..00000000 --- a/tests/UnorderedList.test.svelte +++ /dev/null @@ -1,39 +0,0 @@ - - - - Unordered list item - Unordered list item - Unordered list item - - - - - Unordered list item - - - Unordered list item - - - Unordered list item - - - - - - Unordered list level 1 - - Unordered list level 2 - - Unordered list level 3 - - Unordered list level 3 - Unordered list level 3 - - - - - Unordered list level 1 - Unordered list level 1 - diff --git a/tests/UnorderedList/UnorderedList.test.svelte b/tests/UnorderedList/UnorderedList.test.svelte new file mode 100644 index 00000000..96ada196 --- /dev/null +++ b/tests/UnorderedList/UnorderedList.test.svelte @@ -0,0 +1,30 @@ + + + + {#each items as item} + + {item} + {#if nested && nestedItems.length > 0} + + {#each nestedItems as nestedItem} + {nestedItem} + {/each} + + {/if} + + {/each} + diff --git a/tests/UnorderedList/UnorderedList.test.ts b/tests/UnorderedList/UnorderedList.test.ts new file mode 100644 index 00000000..4dd4d702 --- /dev/null +++ b/tests/UnorderedList/UnorderedList.test.ts @@ -0,0 +1,128 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import UnorderedList from "./UnorderedList.test.svelte"; + +describe("UnorderedList", () => { + it("should render with default props", () => { + render(UnorderedList); + + const list = screen.getByRole("list"); + expect(list).toHaveClass("bx--list--unordered"); + expect(list).not.toHaveClass("bx--list--nested"); + expect(list).not.toHaveClass("bx--list--expressive"); + + const items = screen.getAllByRole("listitem"); + expect(items).toHaveLength(3); + expect(items[0]).toHaveTextContent("Item 1"); + expect(items[1]).toHaveTextContent("Item 2"); + expect(items[2]).toHaveTextContent("Item 3"); + }); + + it("should support nested lists", () => { + render(UnorderedList, { + props: { + nested: true, + nestedItems: ["Nested 1", "Nested 2"], + }, + }); + + const lists = screen.getAllByRole("list"); + expect(lists).toHaveLength(4); // Main list + 3 nested lists (one for each main item) + + const mainList = lists[0]; + expect(mainList).toHaveClass("bx--list--unordered"); + expect(mainList).toHaveClass("bx--list--nested"); + + const nestedLists = lists.slice(1); + nestedLists.forEach((list) => { + expect(list).toHaveClass("bx--list--unordered"); + expect(list).toHaveClass("bx--list--nested"); + }); + + const items = screen.getAllByRole("listitem"); + expect(items).toHaveLength(9); // 3 main items + (2 nested items × 3) + }); + + it("should support expressive styles", () => { + render(UnorderedList, { + props: { expressive: true }, + }); + + const list = screen.getByRole("list"); + expect(list).toHaveClass("bx--list--expressive"); + }); + + it("should support custom items", () => { + const customItems = ["Custom 1", "Custom 2", "Custom 3", "Custom 4"]; + render(UnorderedList, { + props: { items: customItems }, + }); + + const items = screen.getAllByRole("listitem"); + expect(items).toHaveLength(customItems.length); + items.forEach((item, index) => { + expect(item).toHaveTextContent(customItems[index]); + }); + }); + + describe("events", () => { + it("should emit click event", async () => { + const { component } = render(UnorderedList); + const list = screen.getByRole("list"); + + const mock = vi.fn(); + component.$on("click", mock); + + await user.click(list); + expect(mock).toHaveBeenCalled(); + }); + + test.each(["mouseover", "mouseenter", "mouseleave"])( + "should emit %s event", + (eventName) => { + const { component } = render(UnorderedList); + const list = screen.getByRole("list"); + + const mock = vi.fn(); + component.$on(eventName, mock); + + const event = new MouseEvent(eventName); + list.dispatchEvent(event); + + expect(mock).toHaveBeenCalled(); + }, + ); + }); + + describe("accessibility", () => { + it("should have correct ARIA role", () => { + render(UnorderedList); + + const list = screen.getByRole("list"); + expect(list.tagName).toBe("UL"); + + const items = screen.getAllByRole("listitem"); + items.forEach((item) => { + expect(item.tagName).toBe("LI"); + }); + }); + + it("should maintain list structure with nested items", () => { + render(UnorderedList, { + props: { + nested: true, + nestedItems: ["Nested 1", "Nested 2"], + }, + }); + + const lists = screen.getAllByRole("list"); + lists.forEach((list) => { + expect(list.tagName).toBe("UL"); + expect(list.children).toBeTruthy(); + Array.from(list.children).forEach((child) => { + expect(child.tagName).toBe("LI"); + }); + }); + }); + }); +}); From 79d50b1a839d72b7b11d969b1c68bcb26f324469 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sun, 16 Mar 2025 17:30:57 -0700 Subject: [PATCH 017/211] test(ordered-list): add unit tests --- tests/OrderedList.test.svelte | 57 ------- tests/OrderedList/OrderedList.test.svelte | 36 +++++ tests/OrderedList/OrderedList.test.ts | 172 ++++++++++++++++++++++ 3 files changed, 208 insertions(+), 57 deletions(-) delete mode 100644 tests/OrderedList.test.svelte create mode 100644 tests/OrderedList/OrderedList.test.svelte create mode 100644 tests/OrderedList/OrderedList.test.ts diff --git a/tests/OrderedList.test.svelte b/tests/OrderedList.test.svelte deleted file mode 100644 index c1d24c86..00000000 --- a/tests/OrderedList.test.svelte +++ /dev/null @@ -1,57 +0,0 @@ - - - - Ordered list item - Ordered list item - Ordered list item - - - - - Ordered list item - - - Ordered list item - - - Ordered list item - - - - - - Ordered list level 1 - - Ordered list level 2 - - Ordered list level 3 - - Ordered list level 3 - Ordered list level 3 - - - - - Ordered list level 1 - Ordered list level 1 - - - - - Ordered list level 1 - - Ordered list level 2 - - Ordered list level 3 - - Ordered list level 3 - Ordered list level 3 - - - - - Ordered list level 1 - Ordered list level 1 - diff --git a/tests/OrderedList/OrderedList.test.svelte b/tests/OrderedList/OrderedList.test.svelte new file mode 100644 index 00000000..07e2a41c --- /dev/null +++ b/tests/OrderedList/OrderedList.test.svelte @@ -0,0 +1,36 @@ + + + + +
+ + {#each items as item} + + {item} + {#if nested && nestedItems.length > 0} + + {#each nestedItems as nestedItem} + {nestedItem} + {/each} + + {/if} + + {/each} + +
diff --git a/tests/OrderedList/OrderedList.test.ts b/tests/OrderedList/OrderedList.test.ts new file mode 100644 index 00000000..56357e5c --- /dev/null +++ b/tests/OrderedList/OrderedList.test.ts @@ -0,0 +1,172 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import OrderedList from "./OrderedList.test.svelte"; + +describe("OrderedList", () => { + it("should render with default props", () => { + render(OrderedList); + + const list = screen.getByRole("list"); + expect(list).toHaveClass("bx--list--ordered"); + expect(list).not.toHaveClass("bx--list--ordered--native"); + expect(list).not.toHaveClass("bx--list--nested"); + expect(list).not.toHaveClass("bx--list--expressive"); + + const items = screen.getAllByRole("listitem"); + expect(items).toHaveLength(3); + expect(items[0]).toHaveTextContent("Item 1"); + expect(items[1]).toHaveTextContent("Item 2"); + expect(items[2]).toHaveTextContent("Item 3"); + }); + + it("should support nested lists", () => { + render(OrderedList, { + props: { + nested: true, + nestedItems: ["Nested 1", "Nested 2"], + }, + }); + + const lists = screen.getAllByRole("list"); + expect(lists).toHaveLength(4); // Main list + 3 nested lists (one for each main item) + + const mainList = lists[0]; + expect(mainList).toHaveClass("bx--list--ordered"); + expect(mainList).toHaveClass("bx--list--nested"); + + const nestedLists = lists.slice(1); + nestedLists.forEach((list) => { + expect(list).toHaveClass("bx--list--ordered"); + expect(list).toHaveClass("bx--list--nested"); + }); + + const items = screen.getAllByRole("listitem"); + expect(items).toHaveLength(9); // 3 main items + (2 nested items × 3) + }); + + it("should support native list styles", () => { + render(OrderedList, { + props: { native: true }, + }); + + const list = screen.getByRole("list"); + expect(list).toHaveClass("bx--list--ordered--native"); + expect(list).not.toHaveClass("bx--list--ordered"); + }); + + it("should support native list styles with nesting", () => { + render(OrderedList, { + props: { + native: true, + nested: true, + nestedItems: ["Nested 1", "Nested 2"], + }, + }); + + const lists = screen.getAllByRole("list"); + + // Only the top-level list has the native class + expect(lists[0]).toHaveClass("bx--list--ordered--native"); + expect(lists[0]).not.toHaveClass("bx--list--ordered"); + + lists.slice(1).forEach((list) => { + expect(list).toHaveClass("bx--list--ordered bx--list--nested"); + expect(list).not.toHaveClass("bx--list--ordered--native"); + }); + }); + + it("should support expressive styles", () => { + render(OrderedList, { + props: { expressive: true }, + }); + + const list = screen.getByRole("list"); + expect(list).toHaveClass("bx--list--expressive"); + }); + + it("should support custom items", () => { + const customItems = ["Custom 1", "Custom 2", "Custom 3", "Custom 4"]; + render(OrderedList, { + props: { items: customItems }, + }); + + const items = screen.getAllByRole("listitem"); + expect(items).toHaveLength(customItems.length); + items.forEach((item, index) => { + expect(item).toHaveTextContent(customItems[index]); + }); + }); + + describe("events", () => { + it("should emit click event", async () => { + const { component } = render(OrderedList); + const list = screen.getByRole("list"); + + const mock = vi.fn(); + component.$on("click", mock); + + await user.click(list); + expect(mock).toHaveBeenCalled(); + }); + + test.each(["mouseover", "mouseenter", "mouseleave"])( + "should emit %s event", + (eventName) => { + const { component } = render(OrderedList); + const list = screen.getByRole("list"); + + const mock = vi.fn(); + component.$on(eventName, mock); + + const event = new MouseEvent(eventName); + list.dispatchEvent(event); + + expect(mock).toHaveBeenCalled(); + }, + ); + }); + + describe("accessibility", () => { + it("should have correct ARIA role", () => { + render(OrderedList); + + const list = screen.getByRole("list"); + expect(list.tagName).toBe("OL"); + + const items = screen.getAllByRole("listitem"); + items.forEach((item) => { + expect(item.tagName).toBe("LI"); + }); + }); + + it("should maintain list structure with nested items", () => { + render(OrderedList, { + props: { + nested: true, + nestedItems: ["Nested 1", "Nested 2"], + }, + }); + + const lists = screen.getAllByRole("list"); + lists.forEach((list) => { + expect(list.tagName).toBe("OL"); + expect(list.children).toBeTruthy(); + Array.from(list.children).forEach((child) => { + expect(child.tagName).toBe("LI"); + }); + }); + }); + + it("should maintain correct order with native styles", () => { + const items = ["First", "Second", "Third", "Fourth", "Fifth"]; + render(OrderedList, { + props: { native: true, items }, + }); + + const listItems = screen.getAllByRole("listitem"); + items.forEach((text, index) => { + expect(listItems[index]).toHaveTextContent(text); + }); + }); + }); +}); From 6eda673aaf8d8bb31fbaeca83b0fdbb1b6519ce8 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Mon, 17 Mar 2025 17:45:18 -0700 Subject: [PATCH 018/211] test(pagination-nav): add unit tests --- tests/PaginationNav.test.svelte | 19 --- tests/PaginationNav/PaginationNav.test.svelte | 36 ++++ tests/PaginationNav/PaginationNav.test.ts | 159 ++++++++++++++++++ 3 files changed, 195 insertions(+), 19 deletions(-) delete mode 100644 tests/PaginationNav.test.svelte create mode 100644 tests/PaginationNav/PaginationNav.test.svelte create mode 100644 tests/PaginationNav/PaginationNav.test.ts diff --git a/tests/PaginationNav.test.svelte b/tests/PaginationNav.test.svelte deleted file mode 100644 index 872194a9..00000000 --- a/tests/PaginationNav.test.svelte +++ /dev/null @@ -1,19 +0,0 @@ - - - - - { - console.log(e.detail); // { page: number; } - }} - on:click:button--next={(e) => { - console.log(e.detail); // { page: number; } - }} - on:click:button--previous={(e) => { - console.log(e.detail); // { page: number; } - }} -/> diff --git a/tests/PaginationNav/PaginationNav.test.svelte b/tests/PaginationNav/PaginationNav.test.svelte new file mode 100644 index 00000000..42b4e28d --- /dev/null +++ b/tests/PaginationNav/PaginationNav.test.svelte @@ -0,0 +1,36 @@ + + + { + console.log("change", e.detail); + }} + on:click:button--previous={(e) => { + console.log("previous", e.detail); + }} + on:click:button--next={(e) => { + console.log("next", e.detail); + }} +/> diff --git a/tests/PaginationNav/PaginationNav.test.ts b/tests/PaginationNav/PaginationNav.test.ts new file mode 100644 index 00000000..7c4a5bd6 --- /dev/null +++ b/tests/PaginationNav/PaginationNav.test.ts @@ -0,0 +1,159 @@ +import { render, screen, within } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import PaginationNav from "./PaginationNav.test.svelte"; + +describe("PaginationNav", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("should render with default props", () => { + render(PaginationNav); + + const nav = screen.getByRole("navigation"); + expect(nav).toHaveClass("bx--pagination-nav"); + expect(nav).toHaveAttribute("aria-label", "pagination"); + + const list = screen.getByRole("list"); + expect(list).toHaveClass("bx--pagination-nav__list"); + + expect(screen.getByText("Previous page")).toBeInTheDocument(); + expect(screen.getByText("Next page")).toBeInTheDocument(); + + const pageItems = screen.getAllByRole("listitem"); + expect(pageItems.length).toBeGreaterThan(0); + }); + + it("should render correct number of pages", () => { + render(PaginationNav, { + props: { total: 5 }, + }); + + const pageItems = screen.getAllByRole("listitem"); + expect(pageItems.length).toBe(7); // 5 pages + 2 navigation buttons + }); + + it("should show correct active page", () => { + render(PaginationNav, { + props: { page: 3 }, + }); + + const listItems = screen.getAllByRole("listitem"); + expect(within(listItems[3]).getByRole("button")).toHaveAttribute( + "aria-current", + "page", + ); + }); + + it("should handle custom shown pages", () => { + render(PaginationNav, { + props: { total: 20, shown: 5 }, + }); + + const pageItems = screen.getAllByRole("listitem"); + // Should show 5 pages + 2 navigation buttons + expect(pageItems.length).toBe(7); + }); + + it("should disable previous button on first page", () => { + render(PaginationNav, { + props: { page: 1 }, + }); + + const prevButton = screen.getByRole("button", { name: "Previous page" }); + expect(prevButton).toBeDisabled(); + }); + + it("should disable next button on last page", () => { + render(PaginationNav, { + props: { page: 10, total: 10 }, + }); + + const nextButton = screen.getByRole("button", { name: "Next page" }); + expect(nextButton).toBeDisabled(); + }); + + it("should enable navigation buttons when looping", () => { + render(PaginationNav, { + props: { loop: true, page: 1, total: 10 }, + }); + + const prevButton = screen.getByRole("button", { name: "Previous page" }); + const nextButton = screen.getByRole("button", { name: "Next page" }); + + expect(prevButton).not.toBeDisabled(); + expect(nextButton).not.toBeDisabled(); + }); + + it("should support custom button text", () => { + render(PaginationNav, { + props: { + backwardText: "Previous", + forwardText: "Next", + }, + }); + + expect( + screen.getByRole("button", { name: "Previous" }), + ).toBeInTheDocument(); + expect(screen.getByRole("button", { name: "Next" })).toBeInTheDocument(); + }); + + test.each([ + ["top", ["bx--btn--icon-only--top", "bx--btn--icon-only--top"]], + ["right", ["bx--btn--icon-only--right", "bx--btn--icon-only--right"]], + ["bottom", ["bx--btn--icon-only--bottom", "bx--btn--icon-only--bottom"]], + ["left", ["bx--btn--icon-only--left", "bx--btn--icon-only--left"]], + ["outside", ["bx--btn--icon-only--left", "bx--btn--icon-only--right"]], + ["inside", ["bx--btn--icon-only--right", "bx--btn--icon-only--left"]], + ] as const)("should support %s position", (position, [prev, next]) => { + render(PaginationNav, { + props: { tooltipPosition: position }, + }); + + const prevButton = screen.getByRole("button", { name: "Previous page" }); + const nextButton = screen.getByRole("button", { name: "Next page" }); + + expect(prevButton).toHaveClass("bx--tooltip--align-center"); + expect(prevButton).toHaveClass(prev); + + expect(nextButton).toHaveClass("bx--tooltip--align-center"); + expect(nextButton).toHaveClass(next); + }); + + it("should emit change event when clicking a page", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(PaginationNav); + + const pageButton = screen.getByRole("button", { name: /2/ }); + await user.click(pageButton); + expect(consoleLog).toHaveBeenCalledWith("change", { page: 2 }); + + const nextButton = screen.getByRole("button", { name: "Next page" }); + await user.click(nextButton); + expect(consoleLog).toHaveBeenCalledWith("change", { page: 3 }); + + const prevButton = screen.getByRole("button", { name: "Previous page" }); + await user.click(prevButton); + expect(consoleLog).toHaveBeenCalledWith("change", { page: 2 }); + }); + + it("should handle overflow selection", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(PaginationNav, { + props: { total: 100, shown: 5 }, + }); + + const overflowIndicator = screen.getByLabelText("Select Page number"); + expect(overflowIndicator).toBeInTheDocument(); + + await user.selectOptions(overflowIndicator, "4"); + + expect(consoleLog).toHaveBeenCalledWith("change", { page: 4 }); + expect(consoleLog).toHaveBeenCalledTimes(1); + + await user.selectOptions(overflowIndicator, "50"); + expect(consoleLog).toHaveBeenCalledWith("change", { page: 50 }); + expect(consoleLog).toHaveBeenCalledTimes(2); + }); +}); From a73000ffbe2a85b75fb0974b64924bde4c3c7924 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Mon, 17 Mar 2025 18:05:00 -0700 Subject: [PATCH 019/211] test(pagination): add unit tests --- tests/Pagination.test.svelte | 24 --- tests/Pagination/Pagination.test.svelte | 41 +++++ tests/Pagination/Pagination.test.ts | 199 ++++++++++++++++++++++++ 3 files changed, 240 insertions(+), 24 deletions(-) delete mode 100644 tests/Pagination.test.svelte create mode 100644 tests/Pagination/Pagination.test.svelte create mode 100644 tests/Pagination/Pagination.test.ts diff --git a/tests/Pagination.test.svelte b/tests/Pagination.test.svelte deleted file mode 100644 index 7c26b9e5..00000000 --- a/tests/Pagination.test.svelte +++ /dev/null @@ -1,24 +0,0 @@ - - - { - console.log(e.detail); // { pageSize?: number, page?: number } - }} - on:update={(e) => { - console.log(e.detail); // { pageSize: number; page: number; } - }} -/> - - - - - - - - - - diff --git a/tests/Pagination/Pagination.test.svelte b/tests/Pagination/Pagination.test.svelte new file mode 100644 index 00000000..63b4005e --- /dev/null +++ b/tests/Pagination/Pagination.test.svelte @@ -0,0 +1,41 @@ + + + { + console.log("change", e.detail); + }} + on:click:button--previous={(e) => { + console.log("previous", e.detail); + }} + on:click:button--next={(e) => { + console.log("next", e.detail); + }} + on:update={(e) => { + console.log("update", e.detail); + }} +/> diff --git a/tests/Pagination/Pagination.test.ts b/tests/Pagination/Pagination.test.ts new file mode 100644 index 00000000..027647d2 --- /dev/null +++ b/tests/Pagination/Pagination.test.ts @@ -0,0 +1,199 @@ +import { render, screen, within } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import Pagination from "./Pagination.test.svelte"; + +describe("Pagination", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("should render with default props", () => { + render(Pagination); + + expect(screen.getByText("Items per page:")).toBeInTheDocument(); + expect( + screen.getByRole("button", { name: "Next page" }), + ).toBeInTheDocument(); + expect( + screen.getByRole("button", { name: "Previous page" }), + ).toBeInTheDocument(); + }); + + it("should render with custom total items", () => { + render(Pagination, { + props: { totalItems: 102 }, + }); + + expect(screen.getByText("1–10 of 102 items")).toBeInTheDocument(); + }); + + it("should handle custom page sizes", () => { + render(Pagination, { + props: { + totalItems: 102, + pageSizes: [10, 15, 20], + pageSize: 15, + }, + }); + + const select = screen.getByRole("combobox", { name: "Items per page:" }); + expect(select).toHaveValue("15"); + + const options = within(select).getAllByRole("option"); + expect(options).toHaveLength(3); + expect(options[0]).toHaveTextContent("10"); + expect(options[1]).toHaveTextContent("15"); + expect(options[2]).toHaveTextContent("20"); + }); + + it("should handle page navigation", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Pagination, { + props: { totalItems: 102, page: 1 }, + }); + + const nextButton = screen.getByRole("button", { name: "Next page" }); + await user.click(nextButton); + expect(consoleLog).toHaveBeenCalledWith("next", { page: 2 }); + expect(consoleLog).toHaveBeenCalledWith("change", { page: 2 }); + + const prevButton = screen.getByRole("button", { name: "Previous page" }); + await user.click(prevButton); + expect(consoleLog).toHaveBeenCalledWith("previous", { page: 1 }); + expect(consoleLog).toHaveBeenCalledWith("change", { page: 1 }); + }); + + it("should handle page size changes", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Pagination, { + props: { + totalItems: 102, + pageSizes: [10, 15, 20], + }, + }); + + const select = screen.getByRole("combobox", { name: "Items per page:" }); + await user.selectOptions(select, "15"); + + expect(consoleLog).toHaveBeenCalledWith("change", { pageSize: 10 }); + expect(consoleLog).toHaveBeenCalledWith("update", { + pageSize: 15, + page: 1, + }); + }); + + it("should handle page selection", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Pagination, { + props: { totalItems: 102, pageSizes: [5, 10, 15] }, + }); + + const pageSelect = screen.getAllByRole("combobox"); + await user.selectOptions(pageSelect[0], "5"); + + expect(consoleLog).toHaveBeenCalledWith("change", { pageSize: 10 }); + expect(consoleLog).toHaveBeenCalledWith("update", { pageSize: 5, page: 1 }); + }); + + it("should disable navigation buttons when disabled", () => { + render(Pagination, { + props: { disabled: true }, + }); + + const prevButton = screen.getByRole("button", { name: "Previous page" }); + const nextButton = screen.getByRole("button", { name: "Next page" }); + + expect(prevButton).toBeDisabled(); + expect(nextButton).toBeDisabled(); + }); + + it("should handle custom button text", () => { + render(Pagination, { + props: { + forwardText: "Next", + backwardText: "Previous", + }, + }); + + expect( + screen.getByRole("button", { name: "Previous" }), + ).toBeInTheDocument(); + expect(screen.getByRole("button", { name: "Next" })).toBeInTheDocument(); + }); + + it("should handle custom items per page text", () => { + render(Pagination, { + props: { + itemsPerPageText: "Show:", + }, + }); + + expect(screen.getByText("Show:")).toBeInTheDocument(); + }); + + it("should handle disabled page input", () => { + render(Pagination, { + props: { pageInputDisabled: true }, + }); + + expect( + screen.queryByRole("combobox", { name: "Page number" }), + ).not.toBeInTheDocument(); + }); + + it("should handle disabled page size input", () => { + render(Pagination, { + props: { pageSizeInputDisabled: true }, + }); + + expect( + screen.queryByRole("combobox", { name: "Items per page:" }), + ).not.toBeInTheDocument(); + }); + + it("should handle unknown pages", () => { + render(Pagination, { + props: { pagesUnknown: true }, + }); + + expect(screen.getByText("1–10 items")).toBeInTheDocument(); + expect(screen.getByText("page 1")).toBeInTheDocument(); + }); + + it("should update when page or pageSize changes", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Pagination, { + props: { totalItems: 102, pageSizes: [5, 10, 15] }, + }); + + // Change page size + const pageSizeSelect = screen.getAllByRole("combobox"); + await user.selectOptions(pageSizeSelect[0], "15"); + expect(consoleLog).toHaveBeenCalledWith("change", { pageSize: 10 }); + expect(consoleLog).toHaveBeenCalledWith("update", { + pageSize: 15, + page: 1, + }); + + // Change page + const pageSelect = screen.getAllByRole("combobox"); + await user.selectOptions(pageSelect[1], "2"); + expect(consoleLog).toHaveBeenCalledWith("change", { pageSize: 10 }); + expect(consoleLog).toHaveBeenCalledWith("update", { + pageSize: 15, + page: 2, + }); + }); + + it("should handle edge cases", () => { + render(Pagination, { + props: { + totalItems: 0, + page: 1, + pageSize: 10, + }, + }); + + expect(screen.getByText("0–0 of 0 items")).toBeInTheDocument(); + }); +}); From 8142c713073be3da565683d3966d3eb8f18c3a43 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Mon, 17 Mar 2025 18:35:30 -0700 Subject: [PATCH 020/211] test(slider): add unit tests --- tests/Slider.test.svelte | 43 -------- tests/Slider/Slider.test.svelte | 37 +++++++ tests/Slider/Slider.test.ts | 177 ++++++++++++++++++++++++++++++++ 3 files changed, 214 insertions(+), 43 deletions(-) delete mode 100644 tests/Slider.test.svelte create mode 100644 tests/Slider/Slider.test.svelte create mode 100644 tests/Slider/Slider.test.ts diff --git a/tests/Slider.test.svelte b/tests/Slider.test.svelte deleted file mode 100644 index 23bacfa4..00000000 --- a/tests/Slider.test.svelte +++ /dev/null @@ -1,43 +0,0 @@ - - - - - { - console.log(e.detail); // number - }} - on:input={(e) => { - console.log(e.detail); // number - }} -/> - - - - - - - - diff --git a/tests/Slider/Slider.test.svelte b/tests/Slider/Slider.test.svelte new file mode 100644 index 00000000..efd560f5 --- /dev/null +++ b/tests/Slider/Slider.test.svelte @@ -0,0 +1,37 @@ + + + { + console.log("change", e.detail); + }} + on:input={(e) => { + console.log("input", e.detail); + }} +/> diff --git a/tests/Slider/Slider.test.ts b/tests/Slider/Slider.test.ts new file mode 100644 index 00000000..65005860 --- /dev/null +++ b/tests/Slider/Slider.test.ts @@ -0,0 +1,177 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import Slider from "./Slider.test.svelte"; + +describe("Slider", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("should render with default props", () => { + render(Slider); + + expect(screen.getByText("Test Slider")).toBeInTheDocument(); + expect(screen.getByRole("slider")).toBeInTheDocument(); + expect(screen.getByRole("spinbutton")).toHaveValue(0); + }); + + it("should handle value changes through input", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Slider); + + const input = screen.getByRole("spinbutton"); + await user.clear(input); + await user.type(input, "50"); + await user.keyboard("{Tab}"); + + expect(consoleLog).toHaveBeenCalledWith("change", 50); + }); + + it("should handle keyboard navigation", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Slider); + + const slider = screen.getByRole("slider"); + await user.tab(); + expect(slider).toHaveFocus(); + + await user.keyboard("{ArrowRight}"); + expect(consoleLog).toHaveBeenCalledWith("change", 1); + + await user.keyboard("{ArrowLeft}"); + expect(consoleLog).toHaveBeenCalledWith("change", 0); + }); + + it("should handle custom range and step", () => { + render(Slider, { + props: { + min: 10, + max: 990, + minLabel: "10 MB", + maxLabel: "990 MB", + step: 10, + }, + }); + + const slider = screen.getByRole("slider"); + expect(slider).toHaveAttribute("aria-valuemin", "10"); + expect(slider).toHaveAttribute("aria-valuemax", "990"); + expect(screen.getByText("990 MB")).toBeInTheDocument(); + }); + + it("should handle hidden text input", () => { + render(Slider, { + props: { hideTextInput: true }, + }); + + const spinbutton = screen.getByLabelText("Slider number input"); + expect(spinbutton).toHaveAttribute("type", "hidden"); + }); + + it("should handle full width", () => { + render(Slider, { + props: { fullWidth: true }, + }); + + const slider = screen.getByRole("slider").parentElement; + expect(slider).toHaveStyle("max-width: none"); + }); + + it("should handle disabled state", () => { + render(Slider, { + props: { disabled: true }, + }); + + const slider = screen.getByRole("slider"); + const input = screen.getByRole("spinbutton"); + const label = screen.getByText("Test Slider"); + + expect(slider.parentElement).toHaveClass("bx--slider--disabled"); + expect(input).toBeDisabled(); + expect(label).toHaveClass("bx--label--disabled"); + }); + + it("should handle invalid state", () => { + render(Slider, { + props: { invalid: true }, + }); + + const input = screen.getByRole("spinbutton"); + expect(input).toHaveClass("bx--text-input--invalid"); + expect(input).toHaveAttribute("data-invalid", "true"); + expect(input).toHaveAttribute("aria-invalid", "true"); + }); + + it("should handle custom labels", () => { + render(Slider, { + props: { + minLabel: "0 MB", + maxLabel: "100 MB", + }, + }); + + expect(screen.getByText("0 MB")).toBeInTheDocument(); + expect(screen.getByText("100 MB")).toBeInTheDocument(); + }); + + it("should handle required state", () => { + render(Slider, { + props: { required: true }, + }); + + const input = screen.getByRole("spinbutton"); + expect(input).toBeRequired(); + }); + + it("should handle step multiplier with shift key", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Slider); + + const slider = screen.getByRole("slider"); + await user.tab(); + expect(slider).toHaveFocus(); + + await user.keyboard("{Shift>}{ArrowRight}{/Shift}"); + expect(consoleLog).toHaveBeenCalledWith("change", 25); + }); + + it("should clamp values to min and max", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Slider, { + props: { min: 10, max: 990 }, + }); + + const input = screen.getByRole("spinbutton"); + await user.clear(input); + await user.type(input, "5"); + await user.keyboard("{Tab}"); + expect(consoleLog).toHaveBeenCalledWith("change", 10); + + await user.clear(input); + await user.type(input, "1000{Tab}"); + await user.keyboard("{Tab}"); + expect(consoleLog).toHaveBeenCalledWith("change", 990); + }); + + it("should not respond to dragging when disabled", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Slider, { + props: { disabled: true }, + }); + + const slider = screen.getByRole("slider"); + const container = screen.getByRole("presentation"); + + // Simulate mouse down on the slider + await user.pointer({ target: slider, keys: "[MouseLeft]" }); + + // Simulate mouse move + const { left, width } = container.getBoundingClientRect(); + await user.pointer({ target: container, coords: { x: left + width / 2 } }); + + // Simulate mouse up + await user.pointer({ target: container, keys: "[/MouseLeft]" }); + + expect(consoleLog).not.toHaveBeenCalled(); + }); +}); From d25a85c8258ed5d627ee8937d8b95624b9c9e47d Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Mon, 17 Mar 2025 19:15:52 -0700 Subject: [PATCH 021/211] test(popover): add unit tests --- tests/Popover.test.svelte | 20 ---- tests/Popover/Popover.test.svelte | 41 ++++++++ tests/Popover/Popover.test.ts | 154 ++++++++++++++++++++++++++++++ 3 files changed, 195 insertions(+), 20 deletions(-) delete mode 100644 tests/Popover.test.svelte create mode 100644 tests/Popover/Popover.test.svelte create mode 100644 tests/Popover/Popover.test.ts diff --git a/tests/Popover.test.svelte b/tests/Popover.test.svelte deleted file mode 100644 index 3ca51da8..00000000 --- a/tests/Popover.test.svelte +++ /dev/null @@ -1,20 +0,0 @@ - - - { - console.log("on:click:outside"); - }} -> -
Content
-
diff --git a/tests/Popover/Popover.test.svelte b/tests/Popover/Popover.test.svelte new file mode 100644 index 00000000..b21cc440 --- /dev/null +++ b/tests/Popover/Popover.test.svelte @@ -0,0 +1,41 @@ + + +
+ Parent + { + console.log("click:outside", e.detail); + }} + > +
Content
+
+
diff --git a/tests/Popover/Popover.test.ts b/tests/Popover/Popover.test.ts new file mode 100644 index 00000000..686cce18 --- /dev/null +++ b/tests/Popover/Popover.test.ts @@ -0,0 +1,154 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import Popover from "./Popover.test.svelte"; + +describe("Popover", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("should render when open", () => { + render(Popover, { props: { open: true } }); + + expect(screen.getByTestId("content")).toBeVisible(); + expect(screen.getByTestId("parent").firstElementChild).toHaveClass( + "bx--popover--open", + ); + }); + + it("should not render when closed", () => { + render(Popover, { props: { open: false } }); + + const popover = screen.getByTestId("parent").firstElementChild; + expect(popover).not.toHaveClass("bx--popover--open"); + }); + + it("should handle outside clicks", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Popover, { + props: { + open: true, + closeOnOutsideClick: true, + }, + }); + + await user.click(document.body); + expect(consoleLog).toHaveBeenCalledWith( + "click:outside", + expect.any(Object), + ); + }); + + it("should not close on outside click when closeOnOutsideClick is false", async () => { + render(Popover, { + props: { + open: true, + closeOnOutsideClick: false, + }, + }); + + const popover = screen.getByTestId("parent").firstElementChild; + + await user.click(document.body); + expect(popover).toHaveClass("bx--popover--open"); + }); + + test.each([ + "top", + "top-left", + "top-right", + "bottom", + "bottom-left", + "bottom-right", + "left", + "left-bottom", + "left-top", + "right", + "right-bottom", + "right-top", + ] as const)("should handle %s alignment", (align) => { + render(Popover, { + props: { open: true, align }, + }); + + expect(screen.getByTestId("parent").firstElementChild).toHaveClass( + `bx--popover--${align}`, + ); + }); + + it("should render with caret", () => { + render(Popover, { + props: { open: true, caret: true }, + }); + + expect(screen.getByTestId("parent").firstElementChild).toHaveClass( + "bx--popover--caret", + ); + }); + + it("should handle light variant", () => { + render(Popover, { + props: { open: true, light: true }, + }); + + expect(screen.getByTestId("parent").firstElementChild).toHaveClass( + "bx--popover--light", + ); + }); + + it("should handle high contrast variant", () => { + render(Popover, { + props: { open: true, highContrast: true }, + }); + + expect(screen.getByTestId("parent").firstElementChild).toHaveClass( + "bx--popover--high-contrast", + ); + }); + + it("should handle relative positioning", () => { + render(Popover, { + props: { open: true, relative: true }, + }); + + const popover = screen.getByTestId("parent").firstElementChild; + expect(popover).toHaveClass("bx--popover--relative"); + expect(popover).toHaveStyle({ position: "relative" }); + }); + + it("should not dispatch click:outside event when clicking inside", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Popover, { + props: { open: true, closeOnOutsideClick: true }, + }); + + await user.click(screen.getByTestId("content")); + expect(consoleLog).not.toHaveBeenCalled(); + }); + + it("should not handle outside clicks when closed", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Popover, { + props: { open: false, closeOnOutsideClick: true }, + }); + + await user.click(document.body); + expect(consoleLog).not.toHaveBeenCalled(); + }); + + it("should handle multiple variants simultaneously", () => { + render(Popover, { + props: { + open: true, + caret: true, + light: true, + align: "bottom-right", + }, + }); + + const popover = screen.getByTestId("parent").firstElementChild; + expect(popover).toHaveClass("bx--popover--caret"); + expect(popover).toHaveClass("bx--popover--light"); + expect(popover).toHaveClass("bx--popover--bottom-right"); + }); +}); From 0e1177f398044a155c0ebfb5b47174b075c1ecec Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Mon, 17 Mar 2025 21:19:24 -0700 Subject: [PATCH 022/211] test(combo-box): add unit tests --- tests/ComboBox.test.svelte | 77 --------- tests/ComboBox/ComboBox.test.svelte | 49 ++++++ tests/ComboBox/ComboBox.test.ts | 186 ++++++++++++++++++++++ tests/ComboBox/ComboBoxCustom.test.svelte | 36 +++++ 4 files changed, 271 insertions(+), 77 deletions(-) delete mode 100644 tests/ComboBox.test.svelte create mode 100644 tests/ComboBox/ComboBox.test.svelte create mode 100644 tests/ComboBox/ComboBox.test.ts create mode 100644 tests/ComboBox/ComboBoxCustom.test.svelte diff --git a/tests/ComboBox.test.svelte b/tests/ComboBox.test.svelte deleted file mode 100644 index c6bf6ac6..00000000 --- a/tests/ComboBox.test.svelte +++ /dev/null @@ -1,77 +0,0 @@ - - - { - console.log(e.detail.selectedId); - }} - on:clear={(e) => { - console.log(e.detail); - }} - translateWithId={(id) => { - console.log(id); // "open" | "close" - return id; - }} - translateWithIdSelection={(id) => { - console.log(id); // "clearSelection" - return id; - }} - let:item - let:index -> - {item.id} - {index} - - - - - - - - - - - diff --git a/tests/ComboBox/ComboBox.test.svelte b/tests/ComboBox/ComboBox.test.svelte new file mode 100644 index 00000000..249f0dd5 --- /dev/null +++ b/tests/ComboBox/ComboBox.test.svelte @@ -0,0 +1,49 @@ + + + { + console.log("select", e.detail); + }} + on:clear={(e) => { + console.log("clear", e.type); + }} +/> diff --git a/tests/ComboBox/ComboBox.test.ts b/tests/ComboBox/ComboBox.test.ts new file mode 100644 index 00000000..c2ee66b6 --- /dev/null +++ b/tests/ComboBox/ComboBox.test.ts @@ -0,0 +1,186 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import ComboBox from "./ComboBox.test.svelte"; +import ComboBoxCustom from "./ComboBoxCustom.test.svelte"; + +describe("ComboBox", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("should render with default props", () => { + render(ComboBox); + + expect(screen.getByText("Contact")).toBeInTheDocument(); + const input = screen.getByRole("textbox"); + expect(input).toHaveAttribute("placeholder", "Select contact method"); + }); + + it("should open menu on click", async () => { + render(ComboBox); + + const input = screen.getByRole("textbox"); + await user.click(input); + + const dropdown = screen.getAllByRole("listbox")[1]; + expect(dropdown).toBeVisible(); + }); + + it("should handle item selection", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(ComboBox); + + await user.click(screen.getByRole("textbox")); + await user.click(screen.getByText("Email")); + + expect(consoleLog).toHaveBeenCalledWith("select", { + selectedId: "1", + selectedItem: { id: "1", text: "Email" }, + }); + expect(screen.getByRole("textbox")).toHaveValue("Email"); + }); + + it("should handle keyboard navigation", async () => { + render(ComboBox); + + const input = screen.getByRole("textbox"); + await user.click(input); + await user.keyboard("{ArrowDown}"); + await user.keyboard("{Enter}"); + + expect(input).toHaveValue("Slack"); + }); + + it("should handle clear selection", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(ComboBox, { + props: { + selectedId: "1", + value: "Email", + }, + }); + + const clearButton = screen.getByRole("button", { name: /clear/i }); + await user.click(clearButton); + + expect(consoleLog).toHaveBeenCalledWith("clear", expect.any(String)); + expect(screen.getByRole("textbox")).toHaveValue(""); + }); + + it("should handle disabled state", () => { + render(ComboBox, { props: { disabled: true } }); + + expect(screen.getByRole("textbox")).toBeDisabled(); + expect(screen.getByText("Contact")).toHaveClass("bx--label--disabled"); + }); + + it("should handle invalid state", () => { + render(ComboBox, { + props: { + invalid: true, + invalidText: "Invalid selection", + }, + }); + + expect(screen.getByRole("listbox")).toHaveAttribute("data-invalid", "true"); + expect(screen.getByText("Invalid selection")).toBeInTheDocument(); + }); + + it("should handle warning state", () => { + render(ComboBox, { + props: { + warn: true, + warnText: "Warning message", + }, + }); + + expect(screen.getByText("Warning message")).toBeInTheDocument(); + }); + + it("should handle helper text", () => { + render(ComboBox, { props: { helperText: "Helper message" } }); + + expect(screen.getByText("Helper message")).toBeInTheDocument(); + }); + + it("should handle light variant", () => { + render(ComboBox, { props: { light: true } }); + + expect(screen.getByRole("textbox")).toHaveClass("bx--text-input--light"); + }); + + test.each([ + ["sm", "bx--list-box--sm"], + ["xl", "bx--list-box--xl"], + ] as const)("should handle size variants", (size, className) => { + render(ComboBox, { props: { size } }); + expect(screen.getByRole("listbox")).toHaveClass(className); + }); + + it("should handle filtering items", async () => { + render(ComboBox); + + const input = screen.getByRole("textbox"); + await user.click(input); + await user.type(input, "em"); + + const options = screen.getAllByRole("option"); + expect(options).toHaveLength(1); + expect(options[0]).toHaveTextContent("Email"); + }); + + it("should handle disabled items", async () => { + render(ComboBoxCustom); + + await user.click(screen.getByRole("textbox")); + const disabledOption = screen.getByText(/Fax/).closest('[role="option"]'); + assert(disabledOption); + expect(disabledOption).toHaveAttribute("disabled", "true"); + + await user.click(disabledOption); + expect(screen.getByRole("textbox")).toHaveValue(""); + + // Dropdown remains open + const dropdown = screen.getAllByRole("listbox")[1]; + expect(dropdown).toBeVisible(); + }); + + it("should handle custom item display", async () => { + render(ComboBoxCustom); + + await user.click(screen.getByRole("textbox")); + const options = screen.getAllByRole("option"); + + expect(options[0]).toHaveTextContent("Item Slack"); + expect(options[1]).toHaveTextContent("Item Email"); + expect(options[2]).toHaveTextContent("Item Fax"); + }); + + it("should handle top direction", async () => { + render(ComboBoxCustom, { props: { direction: "top" } }); + + await user.click(screen.getAllByRole("button")[0]); + expect(screen.getByRole("listbox")).toHaveClass("bx--list-box--up"); + }); + + it("should programmatically clear selection", async () => { + render(ComboBoxCustom, { props: { selectedId: "1" } }); + + expect(screen.getByRole("textbox")).toHaveValue("Email"); + await user.click(screen.getByText("Clear")); + expect(screen.getByRole("textbox")).toHaveValue(""); + }); + + it("should close menu on Escape key", async () => { + render(ComboBox); + + const input = screen.getByRole("textbox"); + await user.click(input); + + const dropdown = screen.getAllByRole("listbox")[1]; + expect(dropdown).toBeVisible(); + + await user.keyboard("{Escape}"); + expect(dropdown).not.toBeVisible(); + }); +}); diff --git a/tests/ComboBox/ComboBoxCustom.test.svelte b/tests/ComboBox/ComboBoxCustom.test.svelte new file mode 100644 index 00000000..221aa005 --- /dev/null +++ b/tests/ComboBox/ComboBoxCustom.test.svelte @@ -0,0 +1,36 @@ + + + { + console.log("select", e.detail); + }} + let:item +> + Item {item.text} + + + From 9e3d83031e69889472c4e84be256ea242854cf81 Mon Sep 17 00:00:00 2001 From: Brian West <157514993+b-r-i-a-n-w-e-s-t@users.noreply.github.com> Date: Wed, 19 Mar 2025 12:29:13 -0500 Subject: [PATCH 023/211] fix(combo-box): fix typing when refocusing input Fixes a bug where the input `value` is immediately reset when re-focusing the input. The `value` resetting is necessary to support programmatically clearing the value, but it should only execute if the input is not currently focused. --- src/ComboBox/ComboBox.svelte | 12 +++++++++--- tests/ComboBox/ComboBox.test.ts | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/ComboBox/ComboBox.svelte b/src/ComboBox/ComboBox.svelte index 4ec4e85e..07a89433 100644 --- a/src/ComboBox/ComboBox.svelte +++ b/src/ComboBox/ComboBox.svelte @@ -175,12 +175,18 @@ filteredItems = []; if (!selectedItem) { selectedId = undefined; - value = ""; + // Only reset value if the input is not focused + if (!ref.contains(document.activeElement)) { + value = ""; + } highlightedIndex = -1; highlightedId = undefined; } else { - // programmatically set value - value = itemToString(selectedItem); + // Only set value if the input is not focused + if (!ref.contains(document.activeElement)) { + // programmatically set value + value = itemToString(selectedItem); + } } } }); diff --git a/tests/ComboBox/ComboBox.test.ts b/tests/ComboBox/ComboBox.test.ts index c2ee66b6..14144965 100644 --- a/tests/ComboBox/ComboBox.test.ts +++ b/tests/ComboBox/ComboBox.test.ts @@ -127,6 +127,24 @@ describe("ComboBox", () => { const options = screen.getAllByRole("option"); expect(options).toHaveLength(1); expect(options[0]).toHaveTextContent("Email"); + + await user.clear(input); + expect(input).toHaveValue(""); + expect(screen.getAllByRole("option")).toHaveLength(3); + + await user.click(document.body); + expect(input).not.toHaveFocus(); + + await user.keyboard("{Tab}"); + expect(input).toHaveFocus(); + + await user.type(input, "a"); + await user.click(screen.getAllByRole("option")[1]); + expect(input).toHaveValue("Email"); + + await user.click(document.body); + expect(input).not.toHaveFocus(); + expect(screen.queryByRole("option")).not.toBeInTheDocument(); }); it("should handle disabled items", async () => { From c67e095eaf57d4056e6de37799ae7efc0950efb8 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Wed, 19 Mar 2025 10:42:54 -0700 Subject: [PATCH 024/211] test(combo-box): more unit tests --- tests/ComboBox/ComboBox.test.ts | 35 +++++++++++++++++++++-- tests/ComboBox/ComboBoxCustom.test.svelte | 5 +++- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/tests/ComboBox/ComboBox.test.ts b/tests/ComboBox/ComboBox.test.ts index 14144965..2ac7534f 100644 --- a/tests/ComboBox/ComboBox.test.ts +++ b/tests/ComboBox/ComboBox.test.ts @@ -141,12 +141,24 @@ describe("ComboBox", () => { await user.type(input, "a"); await user.click(screen.getAllByRole("option")[1]); expect(input).toHaveValue("Email"); - + await user.click(document.body); expect(input).not.toHaveFocus(); expect(screen.queryByRole("option")).not.toBeInTheDocument(); }); + it("should clear input when clicking clear button", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(ComboBox, { props: { selectedId: "1" } }); + + expect(consoleLog).not.toBeCalled(); + const clearButton = screen.getByRole("button", { name: /clear/i }); + await user.click(clearButton); + + expect(screen.getByRole("textbox")).toHaveValue(""); + expect(consoleLog).toHaveBeenCalledWith("clear", "clear"); + }); + it("should handle disabled items", async () => { render(ComboBoxCustom); @@ -184,9 +196,26 @@ describe("ComboBox", () => { it("should programmatically clear selection", async () => { render(ComboBoxCustom, { props: { selectedId: "1" } }); - expect(screen.getByRole("textbox")).toHaveValue("Email"); + const textbox = screen.getByRole("textbox"); + expect(textbox).toHaveValue("Email"); await user.click(screen.getByText("Clear")); - expect(screen.getByRole("textbox")).toHaveValue(""); + expect(textbox).toHaveValue(""); + expect(textbox).toHaveFocus(); + }); + + it("should not re-focus textbox if clearOptions.focus is false", async () => { + render(ComboBoxCustom, { + props: { + selectedId: "1", + clearOptions: { focus: false }, + }, + }); + + const textbox = screen.getByRole("textbox"); + expect(textbox).toHaveValue("Email"); + await user.click(screen.getByText("Clear")); + expect(textbox).toHaveValue(""); + expect(textbox).not.toHaveFocus(); }); it("should close menu on Escape key", async () => { diff --git a/tests/ComboBox/ComboBoxCustom.test.svelte b/tests/ComboBox/ComboBoxCustom.test.svelte index 221aa005..85fe7f06 100644 --- a/tests/ComboBox/ComboBoxCustom.test.svelte +++ b/tests/ComboBox/ComboBoxCustom.test.svelte @@ -11,6 +11,7 @@ ]; export let selectedId: string | undefined = undefined; export let direction: "top" | "bottom" = "bottom"; + export let clearOptions: { focus?: boolean } = {}; export let shouldFilterItem = (item: ComboBoxItem, value: string) => item.text.toLowerCase().includes(value.toLowerCase()); export let itemToString = (item: ComboBoxItem) => item.text; @@ -33,4 +34,6 @@ Item {item.text} - + From e1b3ef22c9ee09474bacadbb0b22b41326566bab Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Wed, 19 Mar 2025 12:43:05 -0700 Subject: [PATCH 025/211] fix(list-box): use `aria-disabled` instead of invalid `disabled` attribute (#2125) --- src/ListBox/ListBoxMenuItem.svelte | 2 +- tests/ComboBox/ComboBox.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ListBox/ListBoxMenuItem.svelte b/src/ListBox/ListBoxMenuItem.svelte index dd2ff422..569f0e9e 100644 --- a/src/ListBox/ListBoxMenuItem.svelte +++ b/src/ListBox/ListBoxMenuItem.svelte @@ -25,7 +25,7 @@ class:bx--list-box__menu-item--active={active} class:bx--list-box__menu-item--highlighted={highlighted || active} aria-selected={active} - disabled={disabled ? true : undefined} + aria-disabled={disabled ? true : undefined} {...$$restProps} on:click on:mouseenter diff --git a/tests/ComboBox/ComboBox.test.ts b/tests/ComboBox/ComboBox.test.ts index 2ac7534f..697031a8 100644 --- a/tests/ComboBox/ComboBox.test.ts +++ b/tests/ComboBox/ComboBox.test.ts @@ -165,7 +165,7 @@ describe("ComboBox", () => { await user.click(screen.getByRole("textbox")); const disabledOption = screen.getByText(/Fax/).closest('[role="option"]'); assert(disabledOption); - expect(disabledOption).toHaveAttribute("disabled", "true"); + expect(disabledOption).toHaveAttribute("aria-disabled", "true"); await user.click(disabledOption); expect(screen.getByRole("textbox")).toHaveValue(""); From e85d7efc5ed15f5236d074fd7981ae527d9e5ab5 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Wed, 19 Mar 2025 12:43:23 -0700 Subject: [PATCH 026/211] fix(notification): remove invalid `kind` prop from markup (#2126) --- src/Notification/InlineNotification.svelte | 1 - src/Notification/ToastNotification.svelte | 1 - 2 files changed, 2 deletions(-) diff --git a/src/Notification/InlineNotification.svelte b/src/Notification/InlineNotification.svelte index 9cea92f4..0212b079 100644 --- a/src/Notification/InlineNotification.svelte +++ b/src/Notification/InlineNotification.svelte @@ -71,7 +71,6 @@ {#if open}
Date: Wed, 19 Mar 2025 12:43:33 -0700 Subject: [PATCH 027/211] fix(theme): remove invalid `themes` prop from markup (#2127) --- src/Theme/Theme.svelte | 12 +++++++----- tests/Theme/Theme.test.ts | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/Theme/Theme.svelte b/src/Theme/Theme.svelte index b276b483..e3ae9eda 100644 --- a/src/Theme/Theme.svelte +++ b/src/Theme/Theme.svelte @@ -100,16 +100,18 @@ {/if} {#if render === "toggle"} + {@const { themes: toggleThemes, ...toggleProps } = toggle} { - theme = detail.toggled ? toggle.themes[1] : toggle.themes[0]; + theme = detail.toggled ? toggleThemes[1] : toggleThemes[0]; }} /> {:else if render === "select"} - + {#each selectThemes as theme (theme)} {/each} diff --git a/tests/Theme/Theme.test.ts b/tests/Theme/Theme.test.ts index 9758855a..68cc09ba 100644 --- a/tests/Theme/Theme.test.ts +++ b/tests/Theme/Theme.test.ts @@ -130,14 +130,20 @@ describe("Theme", () => { it("should render custom toggle when render prop is set to toggle and custom toggle options are provided", async () => { render(ThemeToggleCustom); + const checkbox = screen.getByRole("switch"); + assert(checkbox); + expect(checkbox).not.toBeChecked(); + const toggle = screen.getAllByText("Enable dark mode")[0]; expect(toggle).toBeInTheDocument(); await user.click(toggle); expect(consoleLog).toHaveBeenCalledWith("update", { theme: "g80" }); + expect(checkbox).toBeChecked(); await user.click(toggle); expect(consoleLog).toHaveBeenCalledWith("update", { theme: "g10" }); + expect(checkbox).not.toBeChecked(); }); it("should render select when render prop is set to select", async () => { @@ -145,11 +151,17 @@ describe("Theme", () => { const select = screen.getByLabelText("Themes"); expect(select).toBeInTheDocument(); + expect(select).toHaveTextContent("White"); + expect(select).toHaveValue("white"); await user.selectOptions(select, "g100"); + expect(select).toHaveTextContent("Gray 100"); + expect(select).toHaveValue("g100"); expect(consoleLog).toHaveBeenCalledWith("update", { theme: "g100" }); await user.selectOptions(select, "white"); + expect(select).toHaveTextContent("White"); + expect(select).toHaveValue("white"); expect(consoleLog).toHaveBeenCalledWith("update", { theme: "white" }); }); @@ -158,11 +170,17 @@ describe("Theme", () => { const select = screen.getByLabelText("Select a theme"); expect(select).toBeInTheDocument(); + expect(select).toHaveTextContent("White"); + expect(select).toHaveValue("white"); await user.selectOptions(select, "g100"); + expect(select).toHaveTextContent("Gray 100"); + expect(select).toHaveValue("g100"); expect(consoleLog).toHaveBeenCalledWith("update", { theme: "g100" }); await user.selectOptions(select, "white"); + expect(select).toHaveTextContent("White"); + expect(select).toHaveValue("white"); expect(consoleLog).toHaveBeenCalledWith("update", { theme: "white" }); }); }); From e7939ff0e21c3430c9eea74c503b7c35f6823445 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Wed, 19 Mar 2025 12:43:46 -0700 Subject: [PATCH 028/211] fix(multi-select): fix keyboard navigation for disabled items (#2129) Fixes #2128 --- src/MultiSelect/MultiSelect.svelte | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/MultiSelect/MultiSelect.svelte b/src/MultiSelect/MultiSelect.svelte index 224746b1..ec4aeb54 100644 --- a/src/MultiSelect/MultiSelect.svelte +++ b/src/MultiSelect/MultiSelect.svelte @@ -201,7 +201,8 @@ function change(direction) { let index = highlightedIndex + direction; - const length = filterable ? filteredItems.length : items.length; + const itemsToUse = filterable ? filteredItems : sortedItems; + const length = itemsToUse.length; if (length === 0) return; if (index < 0) { index = length - 1; @@ -209,18 +210,18 @@ index = 0; } - let disabled = items[index].disabled; + let disabled = itemsToUse[index].disabled; while (disabled) { index = index + direction; if (index < 0) { - index = items.length - 1; - } else if (index >= items.length) { + index = length - 1; + } else if (index >= length) { index = 0; } - disabled = items[index].disabled; + disabled = itemsToUse[index].disabled; } highlightedIndex = index; From 86794dafe22bc98bb64a70d81b3961496242d9b1 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Wed, 19 Mar 2025 12:51:41 -0700 Subject: [PATCH 029/211] chore(examples): bump deps --- examples/rollup/package-lock.json | 347 +++++++++++------ examples/rollup/package.json | 4 +- examples/sveltekit/package-lock.json | 313 +++++++++------ examples/sveltekit/package.json | 6 +- examples/vite/package-lock.json | 273 ++++++++----- examples/vite/package.json | 2 +- examples/webpack/package-lock.json | 553 ++++++++++++++++++++++----- examples/webpack/package.json | 2 +- 8 files changed, 1089 insertions(+), 411 deletions(-) diff --git a/examples/rollup/package-lock.json b/examples/rollup/package-lock.json index 8f34db80..0af320f7 100644 --- a/examples/rollup/package-lock.json +++ b/examples/rollup/package-lock.json @@ -5,14 +5,14 @@ "packages": { "": { "dependencies": { - "carbon-components-svelte": "^0.87.7" + "carbon-components-svelte": "^0.88.1" }, "devDependencies": { "@rollup/plugin-commonjs": "^26.0.3", "@rollup/plugin-node-resolve": "^15.3.1", "@rollup/plugin-terser": "^0.4.4", "carbon-preprocess-svelte": "^0.11.11", - "rollup": "^4.35.0", + "rollup": "^4.36.0", "rollup-plugin-css-only": "^4.5.2", "rollup-plugin-svelte": "^7.2.2", "svelte": "^4.2.19" @@ -23,6 +23,7 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -35,6 +36,7 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/@ibm/telemetry-js/-/telemetry-js-1.9.1.tgz", "integrity": "sha512-qq8RPafUJHUQieXVCte1kbJEx6JctWzbA/YkXzopbfzIDRT2+hbR9QmgH+KH7bDDNRcDbdHWvHfwJKzThlMtPg==", + "license": "Apache-2.0", "bin": { "ibmtelemetry": "dist/collect.js" } @@ -44,6 +46,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -61,6 +64,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -75,6 +79,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -84,6 +89,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -93,6 +99,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -102,13 +109,15 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -119,6 +128,7 @@ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -129,6 +139,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-26.0.3.tgz", "integrity": "sha512-2BJcolt43MY+y5Tz47djHkodCC3c1VKVrBDKpVqHKpQ9z9S158kCCqB8NF6/gzxLdNlYW9abB3Ibh+kOWLp8KQ==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", @@ -154,6 +165,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", @@ -178,6 +190,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", "dev": true, + "license": "MIT", "dependencies": { "serialize-javascript": "^6.0.1", "smob": "^1.0.0", @@ -200,6 +213,7 @@ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", @@ -218,247 +232,266 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz", - "integrity": "sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.36.0.tgz", + "integrity": "sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz", - "integrity": "sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.36.0.tgz", + "integrity": "sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz", - "integrity": "sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.36.0.tgz", + "integrity": "sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz", - "integrity": "sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.36.0.tgz", + "integrity": "sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz", - "integrity": "sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.36.0.tgz", + "integrity": "sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz", - "integrity": "sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.36.0.tgz", + "integrity": "sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz", - "integrity": "sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.36.0.tgz", + "integrity": "sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz", - "integrity": "sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.36.0.tgz", + "integrity": "sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.35.0.tgz", - "integrity": "sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.36.0.tgz", + "integrity": "sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz", - "integrity": "sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.36.0.tgz", + "integrity": "sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz", - "integrity": "sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.36.0.tgz", + "integrity": "sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz", - "integrity": "sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.36.0.tgz", + "integrity": "sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz", - "integrity": "sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.36.0.tgz", + "integrity": "sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz", - "integrity": "sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.36.0.tgz", + "integrity": "sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.35.0.tgz", - "integrity": "sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.36.0.tgz", + "integrity": "sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.35.0.tgz", - "integrity": "sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.36.0.tgz", + "integrity": "sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz", - "integrity": "sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.36.0.tgz", + "integrity": "sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz", - "integrity": "sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.36.0.tgz", + "integrity": "sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz", - "integrity": "sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.36.0.tgz", + "integrity": "sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -468,19 +501,22 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/resolve": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -493,6 +529,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -505,6 +542,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -517,6 +555,7 @@ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">= 0.4" } @@ -526,6 +565,7 @@ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">= 0.4" } @@ -534,13 +574,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -549,13 +591,15 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/carbon-components-svelte": { - "version": "0.87.7", - "resolved": "https://registry.npmjs.org/carbon-components-svelte/-/carbon-components-svelte-0.87.7.tgz", - "integrity": "sha512-c9CJdZZZIzqEm7gaJu0Gvw2ZbEM5DZ9WrzA9Gp6bOhoqMGFKU8NRHK10Dj5ZsxuDJ3IgR4zy2/qTZi9q8TvDbQ==", + "version": "0.88.1", + "resolved": "https://registry.npmjs.org/carbon-components-svelte/-/carbon-components-svelte-0.88.1.tgz", + "integrity": "sha512-R5bJ4I3eTB1BSOCP/HAH/iNsltiNcKvY8EwNkUluuZD+s2J+D6DVlDOQyaa96UtGW9tJareVUuZE/r6E+4DwQA==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "@ibm/telemetry-js": "^1.5.0", "flatpickr": "4.6.9" @@ -566,6 +610,7 @@ "resolved": "https://registry.npmjs.org/carbon-preprocess-svelte/-/carbon-preprocess-svelte-0.11.11.tgz", "integrity": "sha512-F8dZ+evXjmGG/l7gZKHwX5vwJ5CngPFIIWyTsxoBKZqIyCgGZJh83X61q2ZE+jG1vhktZCAd18Z6Yyw1WQMN/Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "estree-walker": "^2.0.2", "magic-string": "^0.30.17", @@ -578,6 +623,7 @@ "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "@types/estree": "^1.0.1", @@ -591,6 +637,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -600,6 +647,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -611,25 +659,29 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -644,6 +696,7 @@ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, + "license": "MIT", "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" @@ -657,6 +710,7 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -665,30 +719,35 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/flatpickr": { "version": "4.6.9", "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.9.tgz", - "integrity": "sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw==" + "integrity": "sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw==", + "license": "MIT" }, "node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" @@ -706,6 +765,7 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -719,6 +779,7 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -728,6 +789,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -748,6 +810,7 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -760,6 +823,7 @@ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -775,6 +839,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -783,13 +848,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*" } @@ -798,13 +865,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -819,19 +888,22 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/magic-string": { "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } @@ -840,13 +912,15 @@ "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -862,14 +936,15 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/nanoid": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz", - "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -877,6 +952,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -888,13 +964,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true + "dev": true, + "license": "BlueOak-1.0.0" }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -903,13 +981,15 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -926,6 +1006,7 @@ "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^3.0.0", @@ -937,6 +1018,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -946,6 +1028,7 @@ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.6" } @@ -954,13 +1037,15 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -987,6 +1072,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", @@ -1001,6 +1087,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz", "integrity": "sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==", "dev": true, + "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, @@ -1013,6 +1100,7 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -1022,6 +1110,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", @@ -1042,15 +1131,17 @@ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/rollup": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.35.0.tgz", - "integrity": "sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.36.0.tgz", + "integrity": "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "1.0.6" }, @@ -1062,25 +1153,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.35.0", - "@rollup/rollup-android-arm64": "4.35.0", - "@rollup/rollup-darwin-arm64": "4.35.0", - "@rollup/rollup-darwin-x64": "4.35.0", - "@rollup/rollup-freebsd-arm64": "4.35.0", - "@rollup/rollup-freebsd-x64": "4.35.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.35.0", - "@rollup/rollup-linux-arm-musleabihf": "4.35.0", - "@rollup/rollup-linux-arm64-gnu": "4.35.0", - "@rollup/rollup-linux-arm64-musl": "4.35.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.35.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.35.0", - "@rollup/rollup-linux-riscv64-gnu": "4.35.0", - "@rollup/rollup-linux-s390x-gnu": "4.35.0", - "@rollup/rollup-linux-x64-gnu": "4.35.0", - "@rollup/rollup-linux-x64-musl": "4.35.0", - "@rollup/rollup-win32-arm64-msvc": "4.35.0", - "@rollup/rollup-win32-ia32-msvc": "4.35.0", - "@rollup/rollup-win32-x64-msvc": "4.35.0", + "@rollup/rollup-android-arm-eabi": "4.36.0", + "@rollup/rollup-android-arm64": "4.36.0", + "@rollup/rollup-darwin-arm64": "4.36.0", + "@rollup/rollup-darwin-x64": "4.36.0", + "@rollup/rollup-freebsd-arm64": "4.36.0", + "@rollup/rollup-freebsd-x64": "4.36.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", + "@rollup/rollup-linux-arm-musleabihf": "4.36.0", + "@rollup/rollup-linux-arm64-gnu": "4.36.0", + "@rollup/rollup-linux-arm64-musl": "4.36.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", + "@rollup/rollup-linux-riscv64-gnu": "4.36.0", + "@rollup/rollup-linux-s390x-gnu": "4.36.0", + "@rollup/rollup-linux-x64-gnu": "4.36.0", + "@rollup/rollup-linux-x64-musl": "4.36.0", + "@rollup/rollup-win32-arm64-msvc": "4.36.0", + "@rollup/rollup-win32-ia32-msvc": "4.36.0", + "@rollup/rollup-win32-x64-msvc": "4.36.0", "fsevents": "~2.3.2" } }, @@ -1089,6 +1180,7 @@ "resolved": "https://registry.npmjs.org/rollup-plugin-css-only/-/rollup-plugin-css-only-4.5.2.tgz", "integrity": "sha512-7rj9+jB17Pz8LNcPgtMUb16JcgD8lxQMK9HcGfAVhMK3na/WXes3oGIo5QsrQQVqtgAU6q6KnQNXJrYunaUIQQ==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "5" }, @@ -1104,6 +1196,7 @@ "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-7.2.2.tgz", "integrity": "sha512-hgnIblTRewaBEVQD6N0Q43o+y6q1TmDRhBjaEzQCi50bs8TXqjc+d1zFZyE8tsfgcfNHZQzclh4RxlFUB85H8Q==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^4.1.0", "resolve.exports": "^2.0.0" @@ -1121,6 +1214,7 @@ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", "dev": true, + "license": "MIT", "dependencies": { "estree-walker": "^2.0.1", "picomatch": "^2.2.2" @@ -1134,6 +1228,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -1159,13 +1254,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -1175,6 +1272,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -1187,6 +1285,7 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1196,6 +1295,7 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -1207,13 +1307,15 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -1223,6 +1325,7 @@ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -1232,6 +1335,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -1242,6 +1346,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -1260,6 +1365,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1274,6 +1380,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1282,13 +1389,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -1301,6 +1410,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -1317,6 +1427,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -1329,6 +1440,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1338,6 +1450,7 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1350,6 +1463,7 @@ "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz", "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.1", "@jridgewell/sourcemap-codec": "^1.4.15", @@ -1375,6 +1489,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -1384,6 +1499,7 @@ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.6" } @@ -1393,6 +1509,7 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -1411,6 +1528,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -1426,6 +1544,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -1444,6 +1563,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -1461,6 +1581,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1470,6 +1591,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1484,13 +1606,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1505,6 +1629,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, diff --git a/examples/rollup/package.json b/examples/rollup/package.json index 2472f916..5ba8cce5 100644 --- a/examples/rollup/package.json +++ b/examples/rollup/package.json @@ -6,14 +6,14 @@ "build": "rollup -c" }, "dependencies": { - "carbon-components-svelte": "^0.87.7" + "carbon-components-svelte": "^0.88.1" }, "devDependencies": { "@rollup/plugin-commonjs": "^26.0.3", "@rollup/plugin-node-resolve": "^15.3.1", "@rollup/plugin-terser": "^0.4.4", "carbon-preprocess-svelte": "^0.11.11", - "rollup": "^4.35.0", + "rollup": "^4.36.0", "rollup-plugin-css-only": "^4.5.2", "rollup-plugin-svelte": "^7.2.2", "svelte": "^4.2.19" diff --git a/examples/sveltekit/package-lock.json b/examples/sveltekit/package-lock.json index 31cbe9f6..e0b0b8d9 100644 --- a/examples/sveltekit/package-lock.json +++ b/examples/sveltekit/package-lock.json @@ -5,11 +5,11 @@ "packages": { "": { "dependencies": { - "carbon-components-svelte": "^0.87.7", - "carbon-pictograms-svelte": "^12.14.0" + "carbon-components-svelte": "^0.88.1", + "carbon-pictograms-svelte": "^13.3.0" }, "devDependencies": { - "@sveltejs/kit": "^2.19.0", + "@sveltejs/kit": "^2.20.1", "@sveltejs/vite-plugin-svelte": "^3.1.2", "carbon-preprocess-svelte": "^0.11.11", "svelte": "^4.2.19", @@ -21,6 +21,7 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -37,6 +38,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -53,6 +55,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -69,6 +72,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -85,6 +89,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -101,6 +106,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -117,6 +123,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -133,6 +140,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -149,6 +157,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -165,6 +174,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -181,6 +191,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -197,6 +208,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -213,6 +225,7 @@ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -229,6 +242,7 @@ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -245,6 +259,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -261,6 +276,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -277,6 +293,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -293,6 +310,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -309,6 +327,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -325,6 +344,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -341,6 +361,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -357,6 +378,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -373,6 +395,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -389,6 +412,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -401,6 +425,7 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/@ibm/telemetry-js/-/telemetry-js-1.9.1.tgz", "integrity": "sha512-qq8RPafUJHUQieXVCte1kbJEx6JctWzbA/YkXzopbfzIDRT2+hbR9QmgH+KH7bDDNRcDbdHWvHfwJKzThlMtPg==", + "license": "Apache-2.0", "bin": { "ibmtelemetry": "dist/collect.js" } @@ -410,6 +435,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -424,6 +450,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -433,6 +460,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -441,13 +469,15 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -457,260 +487,281 @@ "version": "1.0.0-next.28", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz", - "integrity": "sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.36.0.tgz", + "integrity": "sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz", - "integrity": "sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.36.0.tgz", + "integrity": "sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz", - "integrity": "sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.36.0.tgz", + "integrity": "sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz", - "integrity": "sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.36.0.tgz", + "integrity": "sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz", - "integrity": "sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.36.0.tgz", + "integrity": "sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz", - "integrity": "sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.36.0.tgz", + "integrity": "sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz", - "integrity": "sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.36.0.tgz", + "integrity": "sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz", - "integrity": "sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.36.0.tgz", + "integrity": "sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.35.0.tgz", - "integrity": "sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.36.0.tgz", + "integrity": "sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz", - "integrity": "sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.36.0.tgz", + "integrity": "sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz", - "integrity": "sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.36.0.tgz", + "integrity": "sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz", - "integrity": "sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.36.0.tgz", + "integrity": "sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz", - "integrity": "sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.36.0.tgz", + "integrity": "sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz", - "integrity": "sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.36.0.tgz", + "integrity": "sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.35.0.tgz", - "integrity": "sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.36.0.tgz", + "integrity": "sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.35.0.tgz", - "integrity": "sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.36.0.tgz", + "integrity": "sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz", - "integrity": "sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.36.0.tgz", + "integrity": "sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz", - "integrity": "sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.36.0.tgz", + "integrity": "sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz", - "integrity": "sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.36.0.tgz", + "integrity": "sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@sveltejs/kit": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.19.0.tgz", - "integrity": "sha512-UTx28Ad4sYsLU//gqkEo5aFOPFBRT2uXCmXTsURqhurDCvzkVwXruJgBcHDaMiK6RKKpYRteDUaXYqZyGPgCXQ==", + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.20.1.tgz", + "integrity": "sha512-XXd6hQKi9le+8rYIKsxTfgABjB3b8S21qZmMUTvAC5kuVA1AXvYPVEmxrMhRqyOacXu3e6P3ag5HtJi6j9K7UQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/cookie": "^0.6.0", "cookie": "^0.6.0", @@ -741,6 +792,7 @@ "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.2.tgz", "integrity": "sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==", "dev": true, + "license": "MIT", "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^2.1.0", "debug": "^4.3.4", @@ -763,6 +815,7 @@ "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.1.0.tgz", "integrity": "sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -779,19 +832,22 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -804,6 +860,7 @@ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">= 0.4" } @@ -813,30 +870,34 @@ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">= 0.4" } }, "node_modules/carbon-components-svelte": { - "version": "0.87.7", - "resolved": "https://registry.npmjs.org/carbon-components-svelte/-/carbon-components-svelte-0.87.7.tgz", - "integrity": "sha512-c9CJdZZZIzqEm7gaJu0Gvw2ZbEM5DZ9WrzA9Gp6bOhoqMGFKU8NRHK10Dj5ZsxuDJ3IgR4zy2/qTZi9q8TvDbQ==", + "version": "0.88.1", + "resolved": "https://registry.npmjs.org/carbon-components-svelte/-/carbon-components-svelte-0.88.1.tgz", + "integrity": "sha512-R5bJ4I3eTB1BSOCP/HAH/iNsltiNcKvY8EwNkUluuZD+s2J+D6DVlDOQyaa96UtGW9tJareVUuZE/r6E+4DwQA==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "@ibm/telemetry-js": "^1.5.0", "flatpickr": "4.6.9" } }, "node_modules/carbon-pictograms-svelte": { - "version": "12.14.0", - "resolved": "https://registry.npmjs.org/carbon-pictograms-svelte/-/carbon-pictograms-svelte-12.14.0.tgz", - "integrity": "sha512-A3pAf6GxUp3JgTy0B63Y8fLwCTyZ5bN+d879vOUf2xVktHgWuZeUj6yVrjFrZOPJ9aDydMPuRrQj+0seTf4i4Q==" + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/carbon-pictograms-svelte/-/carbon-pictograms-svelte-13.3.0.tgz", + "integrity": "sha512-xeJOCeQ4YnX/yz0SIVehqpILGjxguiYOnyeg5nc9Xo5qTOWfvXXs8/HHOVJjOGEmURyEzaezrjjUeP0CHobnuw==", + "license": "Apache-2.0" }, "node_modules/carbon-preprocess-svelte": { "version": "0.11.11", "resolved": "https://registry.npmjs.org/carbon-preprocess-svelte/-/carbon-preprocess-svelte-0.11.11.tgz", "integrity": "sha512-F8dZ+evXjmGG/l7gZKHwX5vwJ5CngPFIIWyTsxoBKZqIyCgGZJh83X61q2ZE+jG1vhktZCAd18Z6Yyw1WQMN/Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "estree-walker": "^2.0.2", "magic-string": "^0.30.17", @@ -849,6 +910,7 @@ "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "@types/estree": "^1.0.1", @@ -862,6 +924,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -871,6 +934,7 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -880,6 +944,7 @@ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, + "license": "MIT", "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" @@ -893,6 +958,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -910,6 +976,7 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -918,7 +985,8 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz", "integrity": "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/esbuild": { "version": "0.21.5", @@ -926,6 +994,7 @@ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -962,18 +1031,21 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/flatpickr": { "version": "4.6.9", "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.9.tgz", - "integrity": "sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw==" + "integrity": "sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw==", + "license": "MIT" }, "node_modules/fsevents": { "version": "2.3.3", @@ -981,6 +1053,7 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -994,6 +1067,7 @@ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -1004,6 +1078,7 @@ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.6" } @@ -1013,6 +1088,7 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1021,13 +1097,15 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/magic-string": { "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } @@ -1036,13 +1114,15 @@ "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -1052,6 +1132,7 @@ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -1060,12 +1141,13 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz", - "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -1073,6 +1155,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -1085,6 +1168,7 @@ "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^3.0.0", @@ -1096,6 +1180,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -1104,7 +1189,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/postcss": { "version": "8.5.3", @@ -1125,6 +1211,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", @@ -1139,6 +1226,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz", "integrity": "sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==", "dev": true, + "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, @@ -1147,10 +1235,11 @@ } }, "node_modules/rollup": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.35.0.tgz", - "integrity": "sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.36.0.tgz", + "integrity": "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "1.0.6" }, @@ -1162,25 +1251,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.35.0", - "@rollup/rollup-android-arm64": "4.35.0", - "@rollup/rollup-darwin-arm64": "4.35.0", - "@rollup/rollup-darwin-x64": "4.35.0", - "@rollup/rollup-freebsd-arm64": "4.35.0", - "@rollup/rollup-freebsd-x64": "4.35.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.35.0", - "@rollup/rollup-linux-arm-musleabihf": "4.35.0", - "@rollup/rollup-linux-arm64-gnu": "4.35.0", - "@rollup/rollup-linux-arm64-musl": "4.35.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.35.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.35.0", - "@rollup/rollup-linux-riscv64-gnu": "4.35.0", - "@rollup/rollup-linux-s390x-gnu": "4.35.0", - "@rollup/rollup-linux-x64-gnu": "4.35.0", - "@rollup/rollup-linux-x64-musl": "4.35.0", - "@rollup/rollup-win32-arm64-msvc": "4.35.0", - "@rollup/rollup-win32-ia32-msvc": "4.35.0", - "@rollup/rollup-win32-x64-msvc": "4.35.0", + "@rollup/rollup-android-arm-eabi": "4.36.0", + "@rollup/rollup-android-arm64": "4.36.0", + "@rollup/rollup-darwin-arm64": "4.36.0", + "@rollup/rollup-darwin-x64": "4.36.0", + "@rollup/rollup-freebsd-arm64": "4.36.0", + "@rollup/rollup-freebsd-x64": "4.36.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", + "@rollup/rollup-linux-arm-musleabihf": "4.36.0", + "@rollup/rollup-linux-arm64-gnu": "4.36.0", + "@rollup/rollup-linux-arm64-musl": "4.36.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", + "@rollup/rollup-linux-riscv64-gnu": "4.36.0", + "@rollup/rollup-linux-s390x-gnu": "4.36.0", + "@rollup/rollup-linux-x64-gnu": "4.36.0", + "@rollup/rollup-linux-x64-musl": "4.36.0", + "@rollup/rollup-win32-arm64-msvc": "4.36.0", + "@rollup/rollup-win32-ia32-msvc": "4.36.0", + "@rollup/rollup-win32-x64-msvc": "4.36.0", "fsevents": "~2.3.2" } }, @@ -1189,6 +1278,7 @@ "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", "dev": true, + "license": "MIT", "dependencies": { "mri": "^1.1.0" }, @@ -1200,13 +1290,15 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sirv": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", "dev": true, + "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", @@ -1221,6 +1313,7 @@ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -1230,6 +1323,7 @@ "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz", "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.1", "@jridgewell/sourcemap-codec": "^1.4.15", @@ -1255,6 +1349,7 @@ "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.16.0.tgz", "integrity": "sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==", "dev": true, + "license": "ISC", "engines": { "node": "^12.20 || ^14.13.1 || >= 16" }, @@ -1267,6 +1362,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -1276,6 +1372,7 @@ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1285,6 +1382,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -1344,6 +1442,7 @@ "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", "dev": true, + "license": "MIT", "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" }, diff --git a/examples/sveltekit/package.json b/examples/sveltekit/package.json index e0c24228..bd65cc43 100644 --- a/examples/sveltekit/package.json +++ b/examples/sveltekit/package.json @@ -7,11 +7,11 @@ "preview": "vite preview" }, "dependencies": { - "carbon-components-svelte": "^0.87.7", - "carbon-pictograms-svelte": "^12.14.0" + "carbon-components-svelte": "^0.88.1", + "carbon-pictograms-svelte": "^13.3.0" }, "devDependencies": { - "@sveltejs/kit": "^2.19.0", + "@sveltejs/kit": "^2.20.1", "@sveltejs/vite-plugin-svelte": "^3.1.2", "carbon-preprocess-svelte": "^0.11.11", "svelte": "^4.2.19", diff --git a/examples/vite/package-lock.json b/examples/vite/package-lock.json index 59b11dd7..98673789 100644 --- a/examples/vite/package-lock.json +++ b/examples/vite/package-lock.json @@ -5,7 +5,7 @@ "packages": { "": { "dependencies": { - "carbon-components-svelte": "^0.87.7" + "carbon-components-svelte": "^0.88.1" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^3.1.2", @@ -19,6 +19,7 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -35,6 +36,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -51,6 +53,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -67,6 +70,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -83,6 +87,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -99,6 +104,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -115,6 +121,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -131,6 +138,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -147,6 +155,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -163,6 +172,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -179,6 +189,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -195,6 +206,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -211,6 +223,7 @@ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -227,6 +240,7 @@ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -243,6 +257,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -259,6 +274,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -275,6 +291,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -291,6 +308,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -307,6 +325,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -323,6 +342,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -339,6 +359,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -355,6 +376,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -371,6 +393,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -387,6 +410,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -399,6 +423,7 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/@ibm/telemetry-js/-/telemetry-js-1.9.1.tgz", "integrity": "sha512-qq8RPafUJHUQieXVCte1kbJEx6JctWzbA/YkXzopbfzIDRT2+hbR9QmgH+KH7bDDNRcDbdHWvHfwJKzThlMtPg==", + "license": "Apache-2.0", "bin": { "ibmtelemetry": "dist/collect.js" } @@ -408,6 +433,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -422,6 +448,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -431,6 +458,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -439,260 +467,281 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz", - "integrity": "sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.36.0.tgz", + "integrity": "sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz", - "integrity": "sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.36.0.tgz", + "integrity": "sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz", - "integrity": "sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.36.0.tgz", + "integrity": "sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz", - "integrity": "sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.36.0.tgz", + "integrity": "sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz", - "integrity": "sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.36.0.tgz", + "integrity": "sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz", - "integrity": "sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.36.0.tgz", + "integrity": "sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz", - "integrity": "sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.36.0.tgz", + "integrity": "sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz", - "integrity": "sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.36.0.tgz", + "integrity": "sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.35.0.tgz", - "integrity": "sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.36.0.tgz", + "integrity": "sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz", - "integrity": "sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.36.0.tgz", + "integrity": "sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz", - "integrity": "sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.36.0.tgz", + "integrity": "sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz", - "integrity": "sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.36.0.tgz", + "integrity": "sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz", - "integrity": "sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.36.0.tgz", + "integrity": "sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz", - "integrity": "sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.36.0.tgz", + "integrity": "sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.35.0.tgz", - "integrity": "sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.36.0.tgz", + "integrity": "sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.35.0.tgz", - "integrity": "sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.36.0.tgz", + "integrity": "sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz", - "integrity": "sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.36.0.tgz", + "integrity": "sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz", - "integrity": "sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.36.0.tgz", + "integrity": "sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz", - "integrity": "sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.36.0.tgz", + "integrity": "sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -703,6 +752,7 @@ "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.2.tgz", "integrity": "sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==", "dev": true, + "license": "MIT", "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^2.1.0", "debug": "^4.3.4", @@ -725,6 +775,7 @@ "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.1.0.tgz", "integrity": "sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -741,13 +792,15 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -760,6 +813,7 @@ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">= 0.4" } @@ -769,15 +823,17 @@ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">= 0.4" } }, "node_modules/carbon-components-svelte": { - "version": "0.87.7", - "resolved": "https://registry.npmjs.org/carbon-components-svelte/-/carbon-components-svelte-0.87.7.tgz", - "integrity": "sha512-c9CJdZZZIzqEm7gaJu0Gvw2ZbEM5DZ9WrzA9Gp6bOhoqMGFKU8NRHK10Dj5ZsxuDJ3IgR4zy2/qTZi9q8TvDbQ==", + "version": "0.88.1", + "resolved": "https://registry.npmjs.org/carbon-components-svelte/-/carbon-components-svelte-0.88.1.tgz", + "integrity": "sha512-R5bJ4I3eTB1BSOCP/HAH/iNsltiNcKvY8EwNkUluuZD+s2J+D6DVlDOQyaa96UtGW9tJareVUuZE/r6E+4DwQA==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "@ibm/telemetry-js": "^1.5.0", "flatpickr": "4.6.9" @@ -788,6 +844,7 @@ "resolved": "https://registry.npmjs.org/carbon-preprocess-svelte/-/carbon-preprocess-svelte-0.11.11.tgz", "integrity": "sha512-F8dZ+evXjmGG/l7gZKHwX5vwJ5CngPFIIWyTsxoBKZqIyCgGZJh83X61q2ZE+jG1vhktZCAd18Z6Yyw1WQMN/Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "estree-walker": "^2.0.2", "magic-string": "^0.30.17", @@ -800,6 +857,7 @@ "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "@types/estree": "^1.0.1", @@ -813,6 +871,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -822,6 +881,7 @@ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, + "license": "MIT", "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" @@ -835,6 +895,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -852,6 +913,7 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -862,6 +924,7 @@ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -898,12 +961,14 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/flatpickr": { "version": "4.6.9", "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.9.tgz", - "integrity": "sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw==" + "integrity": "sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw==", + "license": "MIT" }, "node_modules/fsevents": { "version": "2.3.3", @@ -911,6 +976,7 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -924,6 +990,7 @@ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.6" } @@ -933,6 +1000,7 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -941,13 +1009,15 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/magic-string": { "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } @@ -956,18 +1026,20 @@ "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz", - "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -975,6 +1047,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -987,6 +1060,7 @@ "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^3.0.0", @@ -998,6 +1072,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -1006,7 +1081,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/postcss": { "version": "8.5.3", @@ -1027,6 +1103,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", @@ -1041,6 +1118,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz", "integrity": "sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==", "dev": true, + "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, @@ -1049,10 +1127,11 @@ } }, "node_modules/rollup": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.35.0.tgz", - "integrity": "sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.36.0.tgz", + "integrity": "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "1.0.6" }, @@ -1064,25 +1143,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.35.0", - "@rollup/rollup-android-arm64": "4.35.0", - "@rollup/rollup-darwin-arm64": "4.35.0", - "@rollup/rollup-darwin-x64": "4.35.0", - "@rollup/rollup-freebsd-arm64": "4.35.0", - "@rollup/rollup-freebsd-x64": "4.35.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.35.0", - "@rollup/rollup-linux-arm-musleabihf": "4.35.0", - "@rollup/rollup-linux-arm64-gnu": "4.35.0", - "@rollup/rollup-linux-arm64-musl": "4.35.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.35.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.35.0", - "@rollup/rollup-linux-riscv64-gnu": "4.35.0", - "@rollup/rollup-linux-s390x-gnu": "4.35.0", - "@rollup/rollup-linux-x64-gnu": "4.35.0", - "@rollup/rollup-linux-x64-musl": "4.35.0", - "@rollup/rollup-win32-arm64-msvc": "4.35.0", - "@rollup/rollup-win32-ia32-msvc": "4.35.0", - "@rollup/rollup-win32-x64-msvc": "4.35.0", + "@rollup/rollup-android-arm-eabi": "4.36.0", + "@rollup/rollup-android-arm64": "4.36.0", + "@rollup/rollup-darwin-arm64": "4.36.0", + "@rollup/rollup-darwin-x64": "4.36.0", + "@rollup/rollup-freebsd-arm64": "4.36.0", + "@rollup/rollup-freebsd-x64": "4.36.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", + "@rollup/rollup-linux-arm-musleabihf": "4.36.0", + "@rollup/rollup-linux-arm64-gnu": "4.36.0", + "@rollup/rollup-linux-arm64-musl": "4.36.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", + "@rollup/rollup-linux-riscv64-gnu": "4.36.0", + "@rollup/rollup-linux-s390x-gnu": "4.36.0", + "@rollup/rollup-linux-x64-gnu": "4.36.0", + "@rollup/rollup-linux-x64-musl": "4.36.0", + "@rollup/rollup-win32-arm64-msvc": "4.36.0", + "@rollup/rollup-win32-ia32-msvc": "4.36.0", + "@rollup/rollup-win32-x64-msvc": "4.36.0", "fsevents": "~2.3.2" } }, @@ -1091,6 +1170,7 @@ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -1100,6 +1180,7 @@ "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz", "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.1", "@jridgewell/sourcemap-codec": "^1.4.15", @@ -1125,6 +1206,7 @@ "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.16.0.tgz", "integrity": "sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==", "dev": true, + "license": "ISC", "engines": { "node": "^12.20 || ^14.13.1 || >= 16" }, @@ -1137,6 +1219,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -1146,6 +1229,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -1205,6 +1289,7 @@ "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", "dev": true, + "license": "MIT", "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" }, diff --git a/examples/vite/package.json b/examples/vite/package.json index 5489fac4..e444c996 100644 --- a/examples/vite/package.json +++ b/examples/vite/package.json @@ -6,7 +6,7 @@ "build": "vite build" }, "dependencies": { - "carbon-components-svelte": "^0.87.7" + "carbon-components-svelte": "^0.88.1" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^3.1.2", diff --git a/examples/webpack/package-lock.json b/examples/webpack/package-lock.json index 2eb19b7d..356791de 100644 --- a/examples/webpack/package-lock.json +++ b/examples/webpack/package-lock.json @@ -5,7 +5,7 @@ "packages": { "": { "dependencies": { - "carbon-components-svelte": "^0.87.7" + "carbon-components-svelte": "^0.88.1" }, "devDependencies": { "carbon-preprocess-svelte": "^0.11.11", @@ -24,6 +24,7 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -37,6 +38,7 @@ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } @@ -45,6 +47,7 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/@ibm/telemetry-js/-/telemetry-js-1.9.1.tgz", "integrity": "sha512-qq8RPafUJHUQieXVCte1kbJEx6JctWzbA/YkXzopbfzIDRT2+hbR9QmgH+KH7bDDNRcDbdHWvHfwJKzThlMtPg==", + "license": "Apache-2.0", "bin": { "ibmtelemetry": "dist/collect.js" } @@ -54,6 +57,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -68,6 +72,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -77,6 +82,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -86,6 +92,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -95,13 +102,15 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -112,6 +121,7 @@ "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.0" }, @@ -128,6 +138,7 @@ "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.2.0.tgz", "integrity": "sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/base64": "^1.1.1", "@jsonjoy.com/util": "^1.1.2", @@ -150,6 +161,7 @@ "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz", "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.0" }, @@ -165,13 +177,15 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, + "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -182,6 +196,7 @@ "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -191,6 +206,7 @@ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -200,6 +216,7 @@ "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, + "license": "MIT", "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" @@ -210,6 +227,7 @@ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -220,6 +238,7 @@ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -229,13 +248,15 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -248,6 +269,7 @@ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -260,6 +282,7 @@ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -271,19 +294,22 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/http-proxy": { "version": "1.17.16", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -292,19 +318,22 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { "version": "22.13.10", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~6.20.0" } @@ -314,6 +343,7 @@ "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -322,25 +352,29 @@ "version": "6.9.18", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/retry": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, + "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -351,6 +385,7 @@ "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, + "license": "MIT", "dependencies": { "@types/express": "*" } @@ -360,6 +395,7 @@ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/node": "*", @@ -371,6 +407,7 @@ "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -380,6 +417,7 @@ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -389,6 +427,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" @@ -398,25 +437,29 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", @@ -427,13 +470,15 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -446,6 +491,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -455,6 +501,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } @@ -463,13 +510,15 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -486,6 +535,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", @@ -499,6 +549,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -511,6 +562,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", @@ -525,6 +577,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" @@ -535,6 +588,7 @@ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -548,6 +602,7 @@ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -561,6 +616,7 @@ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -578,19 +634,22 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -604,6 +663,7 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -613,6 +673,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -625,6 +686,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -641,6 +703,7 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -658,6 +721,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -673,6 +737,7 @@ "engines": [ "node >= 0.8.0" ], + "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } @@ -682,6 +747,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -691,6 +757,7 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -704,6 +771,7 @@ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">= 0.4" } @@ -712,13 +780,15 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">= 0.4" } @@ -727,13 +797,15 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -743,6 +815,7 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -755,6 +828,7 @@ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -779,6 +853,7 @@ "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" @@ -788,13 +863,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -821,6 +898,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -838,13 +916,15 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/bundle-name": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, + "license": "MIT", "dependencies": { "run-applescript": "^7.0.0" }, @@ -860,6 +940,7 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -869,6 +950,7 @@ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -882,6 +964,7 @@ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -898,15 +981,16 @@ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, + "license": "MIT", "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001703", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001703.tgz", - "integrity": "sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==", + "version": "1.0.30001706", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001706.tgz", + "integrity": "sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==", "dev": true, "funding": [ { @@ -921,13 +1005,15 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/carbon-components-svelte": { - "version": "0.87.7", - "resolved": "https://registry.npmjs.org/carbon-components-svelte/-/carbon-components-svelte-0.87.7.tgz", - "integrity": "sha512-c9CJdZZZIzqEm7gaJu0Gvw2ZbEM5DZ9WrzA9Gp6bOhoqMGFKU8NRHK10Dj5ZsxuDJ3IgR4zy2/qTZi9q8TvDbQ==", + "version": "0.88.1", + "resolved": "https://registry.npmjs.org/carbon-components-svelte/-/carbon-components-svelte-0.88.1.tgz", + "integrity": "sha512-R5bJ4I3eTB1BSOCP/HAH/iNsltiNcKvY8EwNkUluuZD+s2J+D6DVlDOQyaa96UtGW9tJareVUuZE/r6E+4DwQA==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "@ibm/telemetry-js": "^1.5.0", "flatpickr": "4.6.9" @@ -938,6 +1024,7 @@ "resolved": "https://registry.npmjs.org/carbon-preprocess-svelte/-/carbon-preprocess-svelte-0.11.11.tgz", "integrity": "sha512-F8dZ+evXjmGG/l7gZKHwX5vwJ5CngPFIIWyTsxoBKZqIyCgGZJh83X61q2ZE+jG1vhktZCAd18Z6Yyw1WQMN/Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "estree-walker": "^2.0.2", "magic-string": "^0.30.17", @@ -950,6 +1037,7 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -974,6 +1062,7 @@ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0" } @@ -983,6 +1072,7 @@ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dev": true, + "license": "MIT", "dependencies": { "source-map": "~0.6.0" }, @@ -995,6 +1085,7 @@ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -1009,6 +1100,7 @@ "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "@types/estree": "^1.0.1", @@ -1022,6 +1114,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -1030,13 +1123,15 @@ "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12" } @@ -1046,6 +1141,7 @@ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -1058,6 +1154,7 @@ "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", @@ -1076,6 +1173,7 @@ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" } @@ -1085,6 +1183,7 @@ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -1097,6 +1196,7 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1106,6 +1206,7 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1114,19 +1215,22 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1141,6 +1245,7 @@ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "dev": true, + "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", @@ -1176,6 +1281,7 @@ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", @@ -1192,6 +1298,7 @@ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, + "license": "MIT", "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" @@ -1205,6 +1312,7 @@ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -1217,6 +1325,7 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -1229,6 +1338,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -1238,6 +1348,7 @@ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", "dev": true, + "license": "MIT", "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" @@ -1254,6 +1365,7 @@ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -1266,6 +1378,7 @@ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -1278,6 +1391,7 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -1287,6 +1401,7 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -1296,13 +1411,15 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, + "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -1315,6 +1432,7 @@ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dev": true, + "license": "MIT", "dependencies": { "utila": "~0.4" } @@ -1324,6 +1442,7 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, + "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -1343,13 +1462,15 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause" }, "node_modules/domhandler": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" }, @@ -1365,6 +1486,7 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -1379,6 +1501,7 @@ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -1389,6 +1512,7 @@ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -1402,19 +1526,22 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.113", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.113.tgz", - "integrity": "sha512-wjT2O4hX+wdWPJ76gWSkMhcHAV2PTMX+QetUCPYEdCIe+cxmgzzSSiGRCKW8nuh4mwKZlpv0xvoW7OF2X+wmHg==", - "dev": true + "version": "1.5.120", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.120.tgz", + "integrity": "sha512-oTUp3gfX1gZI+xfD2djr2rzQdHCwHzPQrrK0CD7WpTdF0nPdQ/INcRVjWgLdCT4a9W3jFObR9DAfsuyFQnI8CQ==", + "dev": true, + "license": "ISC" }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -1424,6 +1551,7 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -1433,6 +1561,7 @@ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -1446,6 +1575,7 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, + "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -1455,6 +1585,7 @@ "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", "dev": true, + "license": "MIT", "bin": { "envinfo": "dist/cli.js" }, @@ -1467,6 +1598,7 @@ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -1476,6 +1608,7 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -1484,13 +1617,15 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -1503,6 +1638,7 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1511,13 +1647,15 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -1531,6 +1669,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -1543,6 +1682,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -1552,6 +1692,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -1560,13 +1701,15 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1575,13 +1718,15 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -1591,6 +1736,7 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -1636,7 +1782,8 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-uri": { "version": "3.0.6", @@ -1652,13 +1799,15 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.9.1" } @@ -1668,6 +1817,7 @@ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -1680,6 +1830,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1692,6 +1843,7 @@ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", @@ -1710,6 +1862,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -1723,6 +1876,7 @@ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, + "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } @@ -1730,7 +1884,8 @@ "node_modules/flatpickr": { "version": "4.6.9", "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.9.tgz", - "integrity": "sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw==" + "integrity": "sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw==", + "license": "MIT" }, "node_modules/follow-redirects": { "version": "1.15.9", @@ -1743,6 +1898,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -1757,6 +1913,7 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1766,6 +1923,7 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1776,6 +1934,7 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1789,6 +1948,7 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1798,6 +1958,7 @@ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -1822,6 +1983,7 @@ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -1835,6 +1997,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -1846,13 +2009,15 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1864,19 +2029,22 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1886,6 +2054,7 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1898,6 +2067,7 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -1910,6 +2080,7 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, + "license": "MIT", "bin": { "he": "bin/he" } @@ -1919,6 +2090,7 @@ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -1931,6 +2103,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -1945,13 +2118,15 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -1961,6 +2136,7 @@ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "dev": true, + "license": "MIT", "dependencies": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", @@ -1982,6 +2158,7 @@ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", "dev": true, + "license": "MIT", "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -2021,6 +2198,7 @@ "url": "https://github.com/sponsors/fb55" } ], + "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", @@ -2032,13 +2210,15 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -2054,13 +2234,15 @@ "version": "0.5.9", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz", "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, + "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -2075,6 +2257,7 @@ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -2099,6 +2282,7 @@ "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.18" } @@ -2108,6 +2292,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -2120,6 +2305,7 @@ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -2132,6 +2318,7 @@ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, + "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -2150,13 +2337,15 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/interpret": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } @@ -2166,6 +2355,7 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } @@ -2175,6 +2365,7 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -2187,6 +2378,7 @@ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -2202,6 +2394,7 @@ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -2217,6 +2410,7 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2226,6 +2420,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -2238,6 +2433,7 @@ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^3.0.0" }, @@ -2256,6 +2452,7 @@ "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -2268,6 +2465,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -2277,6 +2475,7 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -2289,6 +2488,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -2301,6 +2501,7 @@ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.6" } @@ -2310,6 +2511,7 @@ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dev": true, + "license": "MIT", "dependencies": { "is-inside-container": "^1.0.0" }, @@ -2324,19 +2526,22 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2346,6 +2551,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -2359,19 +2565,22 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -2384,6 +2593,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2393,6 +2603,7 @@ "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", "dev": true, + "license": "MIT", "dependencies": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" @@ -2403,6 +2614,7 @@ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.11.5" } @@ -2412,6 +2624,7 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -2425,13 +2638,15 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -2443,13 +2658,15 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.3" } @@ -2459,6 +2676,7 @@ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } @@ -2468,6 +2686,7 @@ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -2476,13 +2695,15 @@ "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2492,6 +2713,7 @@ "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.0.tgz", "integrity": "sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/json-pack": "^1.0.3", "@jsonjoy.com/util": "^1.3.0", @@ -2511,6 +2733,7 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -2519,13 +2742,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2535,6 +2760,7 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -2548,6 +2774,7 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -2560,6 +2787,7 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2569,6 +2797,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -2581,6 +2810,7 @@ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", "dev": true, + "license": "MIT", "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" @@ -2600,19 +2830,22 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/multicast-dns": { "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, + "license": "MIT", "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -2622,9 +2855,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz", - "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -2632,6 +2865,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -2644,6 +2878,7 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2652,13 +2887,15 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, + "license": "MIT", "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" @@ -2669,6 +2906,7 @@ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } @@ -2677,13 +2915,15 @@ "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2693,6 +2933,7 @@ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -2705,6 +2946,7 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2716,13 +2958,15 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -2735,6 +2979,7 @@ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -2744,6 +2989,7 @@ "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", "dev": true, + "license": "MIT", "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", @@ -2762,6 +3008,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -2777,6 +3024,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -2789,6 +3037,7 @@ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/retry": "0.12.2", "is-network-error": "^1.0.0", @@ -2806,6 +3055,7 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -2815,6 +3065,7 @@ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, + "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -2825,6 +3076,7 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -2834,6 +3086,7 @@ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "dev": true, + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -2844,6 +3097,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2853,6 +3107,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2861,19 +3116,22 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/periscopic": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^3.0.0", @@ -2885,6 +3143,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -2893,13 +3152,15 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -2912,6 +3173,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -2938,6 +3200,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", @@ -2952,6 +3215,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz", "integrity": "sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==", "dev": true, + "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, @@ -2964,6 +3228,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -2976,6 +3241,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "dev": true, + "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^7.0.0", @@ -2993,6 +3259,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "dev": true, + "license": "ISC", "dependencies": { "postcss-selector-parser": "^7.0.0" }, @@ -3008,6 +3275,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, + "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" }, @@ -3023,6 +3291,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3035,13 +3304,15 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dev": true, + "license": "MIT", "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" @@ -3051,13 +3322,15 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -3071,6 +3344,7 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -3080,6 +3354,7 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" }, @@ -3095,6 +3370,7 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -3104,6 +3380,7 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3113,6 +3390,7 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -3128,6 +3406,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3142,6 +3421,7 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -3154,6 +3434,7 @@ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, + "license": "MIT", "dependencies": { "resolve": "^1.20.0" }, @@ -3166,6 +3447,7 @@ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -3175,6 +3457,7 @@ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, + "license": "MIT", "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", @@ -3188,6 +3471,7 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3196,13 +3480,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", @@ -3223,6 +3509,7 @@ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, + "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -3235,6 +3522,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3244,6 +3532,7 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -3253,6 +3542,7 @@ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -3278,19 +3568,22 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/schema-utils": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -3309,13 +3602,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/selfsigned": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/node-forge": "^1.3.0", "node-forge": "^1" @@ -3329,6 +3624,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -3341,6 +3637,7 @@ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -3365,6 +3662,7 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3373,13 +3671,15 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -3389,6 +3689,7 @@ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -3407,6 +3708,7 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3416,6 +3718,7 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, + "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -3430,19 +3733,22 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3452,6 +3758,7 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, + "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", @@ -3466,13 +3773,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -3485,6 +3794,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -3497,6 +3807,7 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3506,6 +3817,7 @@ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3518,6 +3830,7 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -3537,6 +3850,7 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -3553,6 +3867,7 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -3571,6 +3886,7 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -3590,6 +3906,7 @@ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, + "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -3601,6 +3918,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -3610,6 +3928,7 @@ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -3619,6 +3938,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -3629,6 +3949,7 @@ "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -3645,6 +3966,7 @@ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -3659,6 +3981,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -3675,13 +3998,15 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/spdy/node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -3698,13 +4023,15 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3714,6 +4041,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } @@ -3723,6 +4051,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3735,6 +4064,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3750,6 +4080,7 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3762,6 +4093,7 @@ "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz", "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.1", "@jridgewell/sourcemap-codec": "^1.4.15", @@ -3786,13 +4118,15 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/svelte-dev-helper/-/svelte-dev-helper-1.1.9.tgz", "integrity": "sha512-oU+Xv7Dl4kRU2kdFjsoPLfJfnt5hUhsFUZtuzI3Ku/f2iAFZqBoEuXOqK3N9ngD4dxQOmN4OKWPHVi3NeAeAfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/svelte-hmr": { "version": "0.14.12", "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.12.tgz", "integrity": "sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==", "dev": true, + "license": "ISC", "engines": { "node": "^12.20 || ^14.13.1 || >= 16" }, @@ -3805,6 +4139,7 @@ "resolved": "https://registry.npmjs.org/svelte-loader/-/svelte-loader-3.2.4.tgz", "integrity": "sha512-e0HdDnkYH/MDx4/IfTSka5AOFg9yYJcPuoZJB5x0l60fkHjVjNvrrxr+rJegDG9J7ZymmdHt00/hdLw+QF299w==", "dev": true, + "license": "MIT", "dependencies": { "loader-utils": "^2.0.4", "svelte-dev-helper": "^1.1.9", @@ -3819,6 +4154,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -3828,6 +4164,7 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3837,6 +4174,7 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -3855,6 +4193,7 @@ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", @@ -3888,13 +4227,15 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/thingies": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", "dev": true, + "license": "Unlicense", "engines": { "node": ">=10.18" }, @@ -3906,13 +4247,15 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -3925,6 +4268,7 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6" } @@ -3934,6 +4278,7 @@ "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.0" }, @@ -3949,13 +4294,15 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -3968,13 +4315,15 @@ "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3998,6 +4347,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" @@ -4013,19 +4363,22 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -4035,6 +4388,7 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -4044,6 +4398,7 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -4053,6 +4408,7 @@ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -4066,6 +4422,7 @@ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, + "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -4075,6 +4432,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -4121,6 +4479,7 @@ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -4166,6 +4525,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } @@ -4175,6 +4535,7 @@ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", "dev": true, + "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^4.6.0", @@ -4204,6 +4565,7 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.0.tgz", "integrity": "sha512-90SqqYXA2SK36KcT6o1bvwvZfJFcmoamqeJY7+boioffX9g9C0wjjJRGUrQIuh43pb0ttX7+ssavmj/WN2RHtA==", "dev": true, + "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", @@ -4260,6 +4622,7 @@ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, + "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", @@ -4274,6 +4637,7 @@ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } @@ -4283,6 +4647,7 @@ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -4297,6 +4662,7 @@ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } @@ -4306,6 +4672,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -4320,13 +4687,15 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ws": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, diff --git a/examples/webpack/package.json b/examples/webpack/package.json index 18af0e0e..a036acb1 100644 --- a/examples/webpack/package.json +++ b/examples/webpack/package.json @@ -5,7 +5,7 @@ "build": "NODE_ENV=production webpack" }, "dependencies": { - "carbon-components-svelte": "^0.87.7" + "carbon-components-svelte": "^0.88.1" }, "devDependencies": { "carbon-preprocess-svelte": "^0.11.11", From be9c13fbc66e79b87ed8e22df9a99dee861da27f Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Wed, 19 Mar 2025 12:52:48 -0700 Subject: [PATCH 030/211] v0.88.2 --- CHANGELOG.md | 10 ++++++++++ COMPONENT_INDEX.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 143edd7d..594e1c11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,16 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.88.2](https://github.com/carbon-design-system/carbon-components-svelte/compare/v0.88.1...v0.88.2) (2025-03-19) + +### Bug Fixes + +- **combo-box:** fix typing when refocusing input ([9e3d830](https://github.com/carbon-design-system/carbon-components-svelte/commit/9e3d83031e69889472c4e84be256ea242854cf81)) +- **list-box:** use `aria-disabled` instead of invalid `disabled` attribute ([#2125](https://github.com/carbon-design-system/carbon-components-svelte/issues/2125)) ([e1b3ef2](https://github.com/carbon-design-system/carbon-components-svelte/commit/e1b3ef22c9ee09474bacadbb0b22b41326566bab)) +- **multi-select:** fix keyboard navigation for disabled items ([#2129](https://github.com/carbon-design-system/carbon-components-svelte/issues/2129)) ([e7939ff](https://github.com/carbon-design-system/carbon-components-svelte/commit/e7939ff0e21c3430c9eea74c503b7c35f6823445)), closes [#2128](https://github.com/carbon-design-system/carbon-components-svelte/issues/2128) +- **notification:** remove invalid `kind` prop from markup ([#2126](https://github.com/carbon-design-system/carbon-components-svelte/issues/2126)) ([e85d7ef](https://github.com/carbon-design-system/carbon-components-svelte/commit/e85d7efc5ed15f5236d074fd7981ae527d9e5ab5)) +- **theme:** remove invalid `themes` prop from markup ([#2127](https://github.com/carbon-design-system/carbon-components-svelte/issues/2127)) ([5987b61](https://github.com/carbon-design-system/carbon-components-svelte/commit/5987b61a5522fff09468bddd586eed4a537edcc8)) + ### [0.88.1](https://github.com/carbon-design-system/carbon-components-svelte/compare/v0.88.0...v0.88.1) (2025-03-12) ### Bug Fixes diff --git a/COMPONENT_INDEX.md b/COMPONENT_INDEX.md index b97158aa..b2c72de3 100644 --- a/COMPONENT_INDEX.md +++ b/COMPONENT_INDEX.md @@ -1,6 +1,6 @@ # Component Index -> 165 components exported from carbon-components-svelte@0.88.1. +> 165 components exported from carbon-components-svelte@0.88.2. ## Components diff --git a/package-lock.json b/package-lock.json index 01a204ba..3ad4f3f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "carbon-components-svelte", - "version": "0.88.1", + "version": "0.88.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "carbon-components-svelte", - "version": "0.88.1", + "version": "0.88.2", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index 97239e25..ab100279 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "carbon-components-svelte", - "version": "0.88.1", + "version": "0.88.2", "license": "Apache-2.0", "description": "Svelte implementation of the Carbon Design System", "type": "module", From 199bb0eb8e27c485de46295dcf0ee25f8cbccf5f Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Wed, 19 Mar 2025 13:05:28 -0700 Subject: [PATCH 031/211] Revert "fix(list-box): use `aria-disabled` instead of invalid `disabled` attribute" (#2130) This reverts commit e1b3ef22c9ee09474bacadbb0b22b41326566bab. --- src/ListBox/ListBoxMenuItem.svelte | 2 +- tests/ComboBox/ComboBox.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ListBox/ListBoxMenuItem.svelte b/src/ListBox/ListBoxMenuItem.svelte index 569f0e9e..dd2ff422 100644 --- a/src/ListBox/ListBoxMenuItem.svelte +++ b/src/ListBox/ListBoxMenuItem.svelte @@ -25,7 +25,7 @@ class:bx--list-box__menu-item--active={active} class:bx--list-box__menu-item--highlighted={highlighted || active} aria-selected={active} - aria-disabled={disabled ? true : undefined} + disabled={disabled ? true : undefined} {...$$restProps} on:click on:mouseenter diff --git a/tests/ComboBox/ComboBox.test.ts b/tests/ComboBox/ComboBox.test.ts index 697031a8..2ac7534f 100644 --- a/tests/ComboBox/ComboBox.test.ts +++ b/tests/ComboBox/ComboBox.test.ts @@ -165,7 +165,7 @@ describe("ComboBox", () => { await user.click(screen.getByRole("textbox")); const disabledOption = screen.getByText(/Fax/).closest('[role="option"]'); assert(disabledOption); - expect(disabledOption).toHaveAttribute("aria-disabled", "true"); + expect(disabledOption).toHaveAttribute("disabled", "true"); await user.click(disabledOption); expect(screen.getByRole("textbox")).toHaveValue(""); From 0e082e495098b90b7d44f82b3ffd1fabc2dec858 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Wed, 19 Mar 2025 13:06:20 -0700 Subject: [PATCH 032/211] v0.88.3 --- CHANGELOG.md | 2 ++ COMPONENT_INDEX.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 594e1c11..4241b3cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [0.88.3](https://github.com/carbon-design-system/carbon-components-svelte/compare/v0.88.2...v0.88.3) (2025-03-19) + ### [0.88.2](https://github.com/carbon-design-system/carbon-components-svelte/compare/v0.88.1...v0.88.2) (2025-03-19) ### Bug Fixes diff --git a/COMPONENT_INDEX.md b/COMPONENT_INDEX.md index b2c72de3..9a14e927 100644 --- a/COMPONENT_INDEX.md +++ b/COMPONENT_INDEX.md @@ -1,6 +1,6 @@ # Component Index -> 165 components exported from carbon-components-svelte@0.88.2. +> 165 components exported from carbon-components-svelte@0.88.3. ## Components diff --git a/package-lock.json b/package-lock.json index 3ad4f3f3..bd402490 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "carbon-components-svelte", - "version": "0.88.2", + "version": "0.88.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "carbon-components-svelte", - "version": "0.88.2", + "version": "0.88.3", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index ab100279..68599533 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "carbon-components-svelte", - "version": "0.88.2", + "version": "0.88.3", "license": "Apache-2.0", "description": "Svelte implementation of the Carbon Design System", "type": "module", From 49d961bbb501c7e9de2c1c7638c8d240e95669fb Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Wed, 19 Mar 2025 13:08:24 -0700 Subject: [PATCH 033/211] chore(changelog): add release notes for v0.88.3 [ci skip] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4241b3cd..12c285f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. See [standa ### [0.88.3](https://github.com/carbon-design-system/carbon-components-svelte/compare/v0.88.2...v0.88.3) (2025-03-19) +### Bug Fixes + +- Revert **list-box:** use `aria-disabled` instead of invalid `disabled` attribute ([#2125](https://github.com/carbon-design-system/carbon-components-svelte/issues/2125)) ([e1b3ef2](https://github.com/carbon-design-system/carbon-components-svelte/commit/e1b3ef22c9ee09474bacadbb0b22b41326566bab)) + ### [0.88.2](https://github.com/carbon-design-system/carbon-components-svelte/compare/v0.88.1...v0.88.2) (2025-03-19) ### Bug Fixes From d67b3e0a844a7df517ef02ce5b7aa37625422d13 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Wed, 19 Mar 2025 13:21:14 -0700 Subject: [PATCH 034/211] docs(code-snippet): remove note on compatibility --- docs/src/pages/components/CodeSnippet.svx | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/src/pages/components/CodeSnippet.svx b/docs/src/pages/components/CodeSnippet.svx index f29d59b1..394becc4 100644 --- a/docs/src/pages/components/CodeSnippet.svx +++ b/docs/src/pages/components/CodeSnippet.svx @@ -29,8 +29,6 @@ let comment = ` This component uses the native, asynchronous [Clipboard API](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard/writeText) to copy text. -Please note that the `clipboard.writeText` API is not supported in [IE 11 nor Safari iOS version 13.3 or lower](https://caniuse.com/mdn-api_clipboard_writetext). - You can override the default copy functionality with your own implementation. See [Overriding copy functionality](#overriding-copy-functionality). From 7317192e90b1fc6dbc6ca51b16150f49bc55fd2f Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 20 Mar 2025 12:20:46 -0700 Subject: [PATCH 035/211] test(inline-notification): add unit tests --- tests/InlineNotification.test.svelte | 49 ------ .../InlineNotification.close.test.svelte | 12 ++ .../InlineNotification.test.svelte | 29 ++++ .../InlineNotification.test.ts | 156 ++++++++++++++++++ .../InlineNotificationCustom.test.svelte | 14 ++ 5 files changed, 211 insertions(+), 49 deletions(-) delete mode 100644 tests/InlineNotification.test.svelte create mode 100644 tests/InlineNotification/InlineNotification.close.test.svelte create mode 100644 tests/InlineNotification/InlineNotification.test.svelte create mode 100644 tests/InlineNotification/InlineNotification.test.ts create mode 100644 tests/InlineNotification/InlineNotificationCustom.test.svelte diff --git a/tests/InlineNotification.test.svelte b/tests/InlineNotification.test.svelte deleted file mode 100644 index 856bc2b8..00000000 --- a/tests/InlineNotification.test.svelte +++ /dev/null @@ -1,49 +0,0 @@ - - - - - { - console.log(e.detail.timeout); - }} -/> - - -
- Learn more -
-
- -Learn more - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/InlineNotification/InlineNotification.close.test.svelte b/tests/InlineNotification/InlineNotification.close.test.svelte new file mode 100644 index 00000000..6f66810c --- /dev/null +++ b/tests/InlineNotification/InlineNotification.close.test.svelte @@ -0,0 +1,12 @@ + + + { + e.preventDefault(); + console.log("close", e.detail); + }} +/> diff --git a/tests/InlineNotification/InlineNotification.test.svelte b/tests/InlineNotification/InlineNotification.test.svelte new file mode 100644 index 00000000..320683d2 --- /dev/null +++ b/tests/InlineNotification/InlineNotification.test.svelte @@ -0,0 +1,29 @@ + + + { + console.log("close", e.detail); + }} +/> diff --git a/tests/InlineNotification/InlineNotification.test.ts b/tests/InlineNotification/InlineNotification.test.ts new file mode 100644 index 00000000..d7d3b6de --- /dev/null +++ b/tests/InlineNotification/InlineNotification.test.ts @@ -0,0 +1,156 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import InlineNotification from "./InlineNotification.test.svelte"; +import InlineNotificationCustom from "./InlineNotificationCustom.test.svelte"; +import InlineNotificationClose from "./InlineNotification.close.test.svelte"; + +describe("InlineNotification", () => { + beforeEach(() => { + vi.restoreAllMocks(); + }); + + it("should render with default props", () => { + render(InlineNotification); + + expect(screen.getByRole("alert")).toHaveClass( + "bx--inline-notification--error", + ); + expect(screen.getByText("Error:")).toBeInTheDocument(); + expect( + screen.getByText("An internal server error occurred."), + ).toBeInTheDocument(); + }); + + it("should handle different kinds", () => { + ( + [ + "error", + "info", + "info-square", + "success", + "warning", + "warning-alt", + ] as const + ).forEach((kind) => { + const { container } = render(InlineNotification, { + props: { kind }, + }); + + expect( + container.querySelector(`.bx--inline-notification--${kind}`), + ).toBeInTheDocument(); + container.remove(); + }); + }); + + it("should handle low contrast variant", () => { + render(InlineNotification, { + props: { lowContrast: true }, + }); + + expect(screen.getByRole("alert")).toHaveClass( + "bx--inline-notification--low-contrast", + ); + }); + + it("should handle close button click", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(InlineNotification); + + await user.click(screen.getByRole("button")); + + expect(consoleLog).toHaveBeenCalledWith("close", { timeout: false }); + expect(screen.queryByRole("alert")).not.toBeInTheDocument(); + }); + + it("should hide close button", () => { + render(InlineNotification, { + props: { hideCloseButton: true }, + }); + + expect( + screen.queryByLabelText("Close notification"), + ).not.toBeInTheDocument(); + expect(screen.getByRole("alert")).toHaveClass( + "bx--inline-notification--hide-close-button", + ); + }); + + it("should handle custom icon descriptions", () => { + render(InlineNotification, { + props: { + statusIconDescription: "Custom status", + closeButtonDescription: "Custom close", + }, + }); + + expect(screen.getByText("Custom status")).toBeInTheDocument(); + expect(screen.getByRole("button")).toHaveAttribute( + "aria-label", + "Custom close", + ); + }); + + it("should handle custom role", () => { + render(InlineNotification, { + props: { role: "status" }, + }); + + expect(screen.getByRole("status")).toBeInTheDocument(); + }); + + it("should handle timeout", async () => { + vi.useFakeTimers(); + const consoleLog = vi.spyOn(console, "log"); + render(InlineNotification, { props: { timeout: 1000 } }); + + expect(screen.getByRole("alert")).toBeInTheDocument(); + await vi.advanceTimersByTimeAsync(1000); + + expect(consoleLog).toHaveBeenCalledWith("close", { timeout: true }); + expect(screen.queryByRole("alert")).not.toBeInTheDocument(); + vi.useRealTimers(); + }); + + it("should handle custom slots", () => { + render(InlineNotificationCustom); + + const title = screen.getByText("Custom Title:"); + expect(title).not.toHaveClass("bx--inline-notification__title"); + expect(title.tagName).toBe("STRONG"); + + const subtitle = screen.getByText("Custom subtitle content."); + expect(subtitle).not.toHaveClass("bx--inline-notification__subtitle"); + expect(subtitle.tagName).toBe("STRONG"); + }); + + it("should render action button", () => { + render(InlineNotificationCustom); + + expect( + screen.getByRole("button", { name: "Learn more" }), + ).toBeInTheDocument(); + }); + + it("should cleanup timeout on unmount", () => { + vi.useFakeTimers(); + const clearTimeoutSpy = vi.spyOn(window, "clearTimeout"); + + const { unmount } = render(InlineNotification, { + props: { timeout: 1_000 }, + }); + + unmount(); + expect(clearTimeoutSpy).toHaveBeenCalled(); + vi.useRealTimers(); + }); + + it("should prevent default close behavior", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(InlineNotificationClose); + + await user.click(screen.getByRole("button")); + expect(consoleLog).toHaveBeenCalledWith("close", { timeout: false }); + expect(screen.getByRole("alert")).toBeInTheDocument(); + }); +}); diff --git a/tests/InlineNotification/InlineNotificationCustom.test.svelte b/tests/InlineNotification/InlineNotificationCustom.test.svelte new file mode 100644 index 00000000..4186595f --- /dev/null +++ b/tests/InlineNotification/InlineNotificationCustom.test.svelte @@ -0,0 +1,14 @@ + + + + Custom Title: + Custom subtitle content. + + Learn more + + From 7c436bd747c736c9ceac719fac4d094e5c6f4a59 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 20 Mar 2025 12:27:37 -0700 Subject: [PATCH 036/211] test(toast-notification): add unit tests --- tests/ToastNotification.test.svelte | 38 ----- .../ToastNotification.close.test.svelte | 13 ++ .../ToastNotification.test.svelte | 33 ++++ .../ToastNotification.test.ts | 159 ++++++++++++++++++ .../ToastNotificationCustom.test.svelte | 9 + 5 files changed, 214 insertions(+), 38 deletions(-) delete mode 100644 tests/ToastNotification.test.svelte create mode 100644 tests/ToastNotification/ToastNotification.close.test.svelte create mode 100644 tests/ToastNotification/ToastNotification.test.svelte create mode 100644 tests/ToastNotification/ToastNotification.test.ts create mode 100644 tests/ToastNotification/ToastNotificationCustom.test.svelte diff --git a/tests/ToastNotification.test.svelte b/tests/ToastNotification.test.svelte deleted file mode 100644 index 7610e7c9..00000000 --- a/tests/ToastNotification.test.svelte +++ /dev/null @@ -1,38 +0,0 @@ - - - - - { - console.log(e.detail.timeout); - }} -/> - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/ToastNotification/ToastNotification.close.test.svelte b/tests/ToastNotification/ToastNotification.close.test.svelte new file mode 100644 index 00000000..28293b17 --- /dev/null +++ b/tests/ToastNotification/ToastNotification.close.test.svelte @@ -0,0 +1,13 @@ + + + { + e.preventDefault(); + console.log("close", e.detail); + }} +/> diff --git a/tests/ToastNotification/ToastNotification.test.svelte b/tests/ToastNotification/ToastNotification.test.svelte new file mode 100644 index 00000000..068e4cd2 --- /dev/null +++ b/tests/ToastNotification/ToastNotification.test.svelte @@ -0,0 +1,33 @@ + + + { + console.log("close", e.detail); + }} +/> diff --git a/tests/ToastNotification/ToastNotification.test.ts b/tests/ToastNotification/ToastNotification.test.ts new file mode 100644 index 00000000..2fdb8659 --- /dev/null +++ b/tests/ToastNotification/ToastNotification.test.ts @@ -0,0 +1,159 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import ToastNotification from "./ToastNotification.test.svelte"; +import ToastNotificationCustom from "./ToastNotificationCustom.test.svelte"; +import ToastNotificationClose from "./ToastNotification.close.test.svelte"; + +describe("ToastNotification", () => { + beforeEach(() => { + vi.restoreAllMocks(); + }); + + it("should render with default props", () => { + render(ToastNotification); + + expect(screen.getByRole("alert")).toHaveClass( + "bx--toast-notification--error", + ); + expect(screen.getByText("Error")).toBeInTheDocument(); + expect( + screen.getByText("An internal server error occurred."), + ).toBeInTheDocument(); + expect(screen.getByText("2024-03-21 12:00:00")).toBeInTheDocument(); + }); + + it("should handle different kinds", () => { + const kinds = [ + "error", + "info", + "info-square", + "success", + "warning", + "warning-alt", + ] as const; + + kinds.forEach((kind) => { + const { container } = render(ToastNotification, { + props: { kind }, + }); + + expect( + container.querySelector(`.bx--toast-notification--${kind}`), + ).toBeInTheDocument(); + container.remove(); + }); + }); + + it("should handle low contrast variant", () => { + render(ToastNotification, { + props: { lowContrast: true }, + }); + + expect(screen.getByRole("alert")).toHaveClass( + "bx--toast-notification--low-contrast", + ); + }); + + it("should handle close button click", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(ToastNotification); + + await user.click(screen.getByRole("button")); + + expect(consoleLog).toHaveBeenCalledWith("close", { timeout: false }); + expect(screen.queryByRole("alert")).not.toBeInTheDocument(); + }); + + it("should hide close button", () => { + render(ToastNotification, { + props: { hideCloseButton: true }, + }); + + expect( + screen.queryByLabelText("Close notification"), + ).not.toBeInTheDocument(); + }); + + it("should handle custom icon descriptions", () => { + render(ToastNotification, { + props: { + statusIconDescription: "Custom status", + closeButtonDescription: "Custom close", + }, + }); + + expect(screen.getByText("Custom status")).toBeInTheDocument(); + expect(screen.getByRole("button")).toHaveAttribute( + "aria-label", + "Custom close", + ); + }); + + it("should handle custom role", () => { + render(ToastNotification, { + props: { role: "status" }, + }); + + expect(screen.getByRole("status")).toBeInTheDocument(); + }); + + it("should handle timeout", async () => { + vi.useFakeTimers(); + const consoleLog = vi.spyOn(console, "log"); + + render(ToastNotification, { props: { timeout: 1000 } }); + + expect(screen.getByRole("alert")).toBeInTheDocument(); + + await vi.advanceTimersByTimeAsync(1000); + + expect(consoleLog).toHaveBeenCalledWith("close", { timeout: true }); + expect(screen.queryByRole("alert")).not.toBeInTheDocument(); + vi.useRealTimers(); + }); + + it("should handle custom slots", () => { + render(ToastNotificationCustom); + + const title = screen.getByText("Custom Title:"); + expect(title).not.toHaveClass("bx--toast-notification__title"); + expect(title.tagName).toBe("STRONG"); + + const subtitle = screen.getByText("Custom subtitle content."); + expect(subtitle).not.toHaveClass("bx--toast-notification__subtitle"); + expect(subtitle.tagName).toBe("STRONG"); + + const caption = screen.getByText("Custom caption content."); + expect(caption).not.toHaveClass("bx--toast-notification__caption"); + expect(caption.tagName).toBe("STRONG"); + }); + + it("should handle full width", () => { + render(ToastNotification, { props: { fullWidth: true } }); + + const notification = screen.getByRole("alert"); + expect(notification).toHaveStyle({ width: "100%" }); + }); + + it("should cleanup timeout on unmount", () => { + vi.useFakeTimers(); + const clearTimeoutSpy = vi.spyOn(window, "clearTimeout"); + + const { unmount } = render(ToastNotification, { + props: { timeout: 1000 }, + }); + + unmount(); + expect(clearTimeoutSpy).toHaveBeenCalled(); + vi.useRealTimers(); + }); + + it("should prevent default close behavior", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(ToastNotificationClose); + + await user.click(screen.getByRole("button")); + expect(consoleLog).toHaveBeenCalledWith("close", { timeout: false }); + expect(screen.getByRole("alert")).toBeInTheDocument(); + }); +}); diff --git a/tests/ToastNotification/ToastNotificationCustom.test.svelte b/tests/ToastNotification/ToastNotificationCustom.test.svelte new file mode 100644 index 00000000..9b2b2436 --- /dev/null +++ b/tests/ToastNotification/ToastNotificationCustom.test.svelte @@ -0,0 +1,9 @@ + + + + Custom Title: + Custom subtitle content. + Custom caption content. + From e35a25de819bd9db985e966a0a6bd4cb6eceacfb Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 20 Mar 2025 12:35:26 -0700 Subject: [PATCH 037/211] test(text-area): add unit tests --- tests/TextArea.test.svelte | 19 --- tests/TextArea/TextArea.test.svelte | 49 +++++++ tests/TextArea/TextArea.test.ts | 153 ++++++++++++++++++++++ tests/TextArea/TextAreaCustom.test.svelte | 7 + 4 files changed, 209 insertions(+), 19 deletions(-) delete mode 100644 tests/TextArea.test.svelte create mode 100644 tests/TextArea/TextArea.test.svelte create mode 100644 tests/TextArea/TextArea.test.ts create mode 100644 tests/TextArea/TextAreaCustom.test.svelte diff --git a/tests/TextArea.test.svelte b/tests/TextArea.test.svelte deleted file mode 100644 index 104dea23..00000000 --- a/tests/TextArea.test.svelte +++ /dev/null @@ -1,19 +0,0 @@ - - - From eb413a1fbac54503f9ab1464e6dc1538bb685b84 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 20 Mar 2025 12:39:51 -0700 Subject: [PATCH 038/211] test(text-input): add unit tests --- tests/TextInput.test.svelte | 45 ----- tests/TextInput/TextInput.test.svelte | 55 ++++++ tests/TextInput/TextInput.test.ts | 198 ++++++++++++++++++++ tests/TextInput/TextInputCustom.test.svelte | 7 + 4 files changed, 260 insertions(+), 45 deletions(-) delete mode 100644 tests/TextInput.test.svelte create mode 100644 tests/TextInput/TextInput.test.svelte create mode 100644 tests/TextInput/TextInput.test.ts create mode 100644 tests/TextInput/TextInputCustom.test.svelte diff --git a/tests/TextInput.test.svelte b/tests/TextInput.test.svelte deleted file mode 100644 index 63b5dd87..00000000 --- a/tests/TextInput.test.svelte +++ /dev/null @@ -1,45 +0,0 @@ - - - console.log(e.detail)} - on:change={(e) => (value = e.detail)} - on:paste={(e) => console.log(e)} -/> - - - - - - - - - - - - - - - - - - - - diff --git a/tests/TextInput/TextInput.test.svelte b/tests/TextInput/TextInput.test.svelte new file mode 100644 index 00000000..5dc88aac --- /dev/null +++ b/tests/TextInput/TextInput.test.svelte @@ -0,0 +1,55 @@ + + + + +
{value}
diff --git a/tests/TextInput/TextInput.test.ts b/tests/TextInput/TextInput.test.ts new file mode 100644 index 00000000..74271739 --- /dev/null +++ b/tests/TextInput/TextInput.test.ts @@ -0,0 +1,198 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import TextInput from "./TextInput.test.svelte"; +import TextInputCustom from "./TextInputCustom.test.svelte"; + +describe("TextInput", () => { + it("should render with default props", () => { + render(TextInput); + + expect(screen.getByLabelText("User name")).toBeInTheDocument(); + }); + + it("should handle placeholder text", () => { + render(TextInput, { + props: { placeholder: "Enter user name..." }, + }); + + expect( + screen.getByPlaceholderText("Enter user name..."), + ).toBeInTheDocument(); + }); + + it("should handle different sizes", () => { + (["sm", "xl"] as const).forEach((size) => { + const { container } = render(TextInput, { + props: { size }, + }); + + const input = container.querySelector("input"); + expect(input).toHaveClass(`bx--text-input--${size}`); + container.remove(); + }); + }); + + it("should handle light variant", () => { + render(TextInput, { props: { light: true } }); + + expect(screen.getByRole("textbox")).toHaveClass("bx--text-input--light"); + }); + + it("should handle disabled state", () => { + render(TextInput, { props: { disabled: true } }); + + const input = screen.getByRole("textbox"); + expect(input).toBeDisabled(); + expect(screen.getByText("User name")).toHaveClass("bx--label--disabled"); + }); + + it("should handle helper text", () => { + render(TextInput, { props: { helperText: "Helper text" } }); + + expect(screen.getByText("Helper text")).toHaveClass( + "bx--form__helper-text", + ); + }); + + it("should handle invalid state", () => { + render(TextInput, { + props: { invalid: true, invalidText: "Invalid input" }, + }); + + const input = screen.getByRole("textbox"); + expect(input).toHaveClass("bx--text-input--invalid"); + expect(input).toHaveAttribute("aria-invalid", "true"); + expect(screen.getByText("Invalid input")).toHaveClass( + "bx--form-requirement", + ); + }); + + it("should handle warning state", () => { + render(TextInput, { + props: { warn: true, warnText: "Warning message" }, + }); + + const input = screen.getByRole("textbox"); + expect(input).toHaveClass("bx--text-input--warning"); + expect(screen.getByText("Warning message")).toHaveClass( + "bx--form-requirement", + ); + }); + + it("should handle hidden label", () => { + render(TextInput, { props: { hideLabel: true } }); + + expect(screen.getByText("User name")).toHaveClass("bx--visually-hidden"); + }); + + it("should handle custom id", () => { + render(TextInput, { props: { id: "custom-id" } }); + + const input = screen.getByRole("textbox"); + expect(input).toHaveAttribute("id", "custom-id"); + expect(screen.getByText("User name")).toHaveAttribute("for", "custom-id"); + }); + + it("should handle custom name", () => { + render(TextInput, { props: { name: "custom-name" } }); + + expect(screen.getByRole("textbox")).toHaveAttribute("name", "custom-name"); + }); + + it("should handle required state", () => { + render(TextInput, { props: { required: true } }); + + expect(screen.getByRole("textbox")).toHaveAttribute("required"); + }); + + it("should handle inline variant", () => { + render(TextInput, { props: { inline: true } }); + + expect(screen.getByText("User name")).toHaveClass("bx--label--inline"); + }); + + it("should handle readonly state", () => { + render(TextInput, { + props: { readonly: true }, + }); + + expect(screen.getByRole("textbox")).toHaveAttribute("readonly"); + }); + + it("should handle custom slots", () => { + render(TextInputCustom); + + expect(screen.getByText("Custom Label Text").tagName).toBe("SPAN"); + }); + + it("should handle value binding", async () => { + render(TextInput); + + const input = screen.getByRole("textbox"); + await user.type(input, "Test value"); + expect(screen.getByTestId("value").textContent).toBe("Test value"); + }); + + it("should handle number type input", async () => { + render(TextInput, { props: { type: "number" } }); + + const input = screen.getByLabelText("User name"); + await user.type(input, "123"); + expect(input).toHaveValue(123); + + await user.clear(input); + expect(input).toHaveValue(null); + }); + + it("should not show helper text when invalid", () => { + render(TextInput, { + props: { + invalid: true, + invalidText: "Invalid input", + helperText: "Helper text", + }, + }); + + expect(screen.queryByText("Helper text")).not.toBeInTheDocument(); + expect(screen.getByText("Invalid input")).toBeInTheDocument(); + }); + + it("should not show helper text when warning", () => { + render(TextInput, { + props: { + warn: true, + warnText: "Warning message", + helperText: "Helper text", + }, + }); + + expect(screen.queryByText("Helper text")).not.toBeInTheDocument(); + expect(screen.getByText("Warning message")).toBeInTheDocument(); + }); + + it("should handle disabled helper text", () => { + render(TextInput, { + props: { + disabled: true, + helperText: "Helper text", + }, + }); + + expect(screen.getByText("Helper text")).toHaveClass( + "bx--form__helper-text--disabled", + ); + }); + + it("should handle inline helper text", () => { + render(TextInput, { + props: { + inline: true, + helperText: "Helper text", + }, + }); + + expect(screen.getByText("Helper text")).toHaveClass( + "bx--form__helper-text--inline", + ); + }); +}); diff --git a/tests/TextInput/TextInputCustom.test.svelte b/tests/TextInput/TextInputCustom.test.svelte new file mode 100644 index 00000000..2eea26dc --- /dev/null +++ b/tests/TextInput/TextInputCustom.test.svelte @@ -0,0 +1,7 @@ + + + + Custom Label Text + From 6dccd5cbe2040ab1e47d0f2ac8386cd25e9e137a Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 20 Mar 2025 12:52:19 -0700 Subject: [PATCH 039/211] test(number-input): add unit tests --- tests/NumberInput.test.svelte | 51 ---- tests/NumberInput/NumberInput.test.svelte | 59 +++++ tests/NumberInput/NumberInput.test.ts | 237 ++++++++++++++++++ .../NumberInput/NumberInputCustom.test.svelte | 7 + 4 files changed, 303 insertions(+), 51 deletions(-) delete mode 100644 tests/NumberInput.test.svelte create mode 100644 tests/NumberInput/NumberInput.test.svelte create mode 100644 tests/NumberInput/NumberInput.test.ts create mode 100644 tests/NumberInput/NumberInputCustom.test.svelte diff --git a/tests/NumberInput.test.svelte b/tests/NumberInput.test.svelte deleted file mode 100644 index c1176783..00000000 --- a/tests/NumberInput.test.svelte +++ /dev/null @@ -1,51 +0,0 @@ - - -{value} - - { - console.log({ input: e.detail }); // null | number - }} - on:change={(e) => { - console.log({ change: e.detail }); // null | number - }} - on:keydown - on:keyup - on:paste -/> - - { - console.log({ input: e.detail }); // null | number - }} - on:change={(e) => { - console.log(e.detail); // null | number - }} - on:keydown - on:keyup - on:paste -/> - - diff --git a/tests/NumberInput/NumberInput.test.svelte b/tests/NumberInput/NumberInput.test.svelte new file mode 100644 index 00000000..9794540c --- /dev/null +++ b/tests/NumberInput/NumberInput.test.svelte @@ -0,0 +1,59 @@ + + + + +
{value}
diff --git a/tests/NumberInput/NumberInput.test.ts b/tests/NumberInput/NumberInput.test.ts new file mode 100644 index 00000000..769a9f7c --- /dev/null +++ b/tests/NumberInput/NumberInput.test.ts @@ -0,0 +1,237 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import NumberInput from "./NumberInput.test.svelte"; +import NumberInputCustom from "./NumberInputCustom.test.svelte"; + +describe("NumberInput", () => { + it("should render with default props", () => { + render(NumberInput); + + expect(screen.getByLabelText("Clusters")).toBeInTheDocument(); + expect(screen.getByRole("spinbutton")).toHaveValue(0); + }); + + it("should handle step value", () => { + render(NumberInput, { props: { step: 0.1 } }); + + expect(screen.getByRole("spinbutton")).toHaveAttribute("step", "0.1"); + }); + + it("should handle min and max values", () => { + render(NumberInput, { props: { min: 4, max: 20 } }); + + const input = screen.getByRole("spinbutton"); + expect(input).toHaveAttribute("min", "4"); + expect(input).toHaveAttribute("max", "20"); + }); + + it("should handle different sizes", () => { + (["sm", "xl"] as const).forEach((size) => { + const { container } = render(NumberInput, { + props: { size }, + }); + + const input = container.querySelector("input"); + expect(input?.closest(".bx--number")).toHaveClass(`bx--number--${size}`); + container.remove(); + }); + }); + + it("should handle light variant", () => { + render(NumberInput, { props: { light: true } }); + + expect(screen.getByRole("spinbutton").closest(".bx--number")).toHaveClass( + "bx--number--light", + ); + }); + + it("should handle disabled state", () => { + render(NumberInput, { + props: { disabled: true }, + }); + + const input = screen.getByRole("spinbutton"); + expect(input).toBeDisabled(); + expect(screen.getByText("Clusters")).toHaveClass("bx--label--disabled"); + }); + + it("should handle helper text", () => { + render(NumberInput, { + props: { helperText: "Helper text" }, + }); + + expect(screen.getByText("Helper text")).toHaveClass( + "bx--form__helper-text", + ); + }); + + it("should handle invalid state", () => { + render(NumberInput, { + props: { invalid: true, invalidText: "Invalid input" }, + }); + + const input = screen.getByRole("spinbutton"); + expect(input).toHaveAttribute("aria-invalid", "true"); + expect(screen.getByText("Invalid input")).toBeInTheDocument(); + + expect(input.closest(".bx--number")).toHaveAttribute( + "data-invalid", + "true", + ); + }); + + it("should handle warning state", () => { + render(NumberInput, { + props: { warn: true, warnText: "Warning message" }, + }); + + const input = screen.getByRole("spinbutton"); + expect(input.closest(".bx--number__input-wrapper")).toHaveClass( + "bx--number__input-wrapper--warning", + ); + expect(screen.getByText("Warning message")).toBeInTheDocument(); + }); + + it("should handle hidden label", () => { + render(NumberInput, { props: { hideLabel: true } }); + + expect(screen.getByText("Clusters")).toHaveClass("bx--visually-hidden"); + }); + + it("should handle custom id", () => { + render(NumberInput, { props: { id: "custom-id" } }); + + const input = screen.getByRole("spinbutton"); + expect(input).toHaveAttribute("id", "custom-id"); + expect(screen.getByText("Clusters")).toHaveAttribute("for", "custom-id"); + }); + + it("should handle custom name", () => { + render(NumberInput, { props: { name: "custom-name" } }); + + expect(screen.getByRole("spinbutton")).toHaveAttribute( + "name", + "custom-name", + ); + }); + + it("should handle readonly state", () => { + render(NumberInput, { props: { readonly: true } }); + + expect(screen.getByRole("spinbutton")).toHaveAttribute("readonly"); + }); + + it("should handle hidden steppers", () => { + render(NumberInput, { props: { hideSteppers: true } }); + + expect( + screen.queryByRole("button", { name: "Increment number" }), + ).not.toBeInTheDocument(); + expect( + screen.queryByRole("button", { name: "Decrement number" }), + ).not.toBeInTheDocument(); + }); + + // TODO(bug): The icon descriptions are not being applied. + it.skip("should handle custom icon descriptions", () => { + render(NumberInput, { + props: { iconDescription: "Custom description" }, + }); + + screen.getAllByRole("button").forEach((button) => { + expect(button).toHaveAttribute("title", "Custom description"); + }); + }); + + it("should handle custom slots", () => { + render(NumberInputCustom); + + expect(screen.getByText("Custom Label Text")).toBeInTheDocument(); + }); + + it("should handle value binding", async () => { + render(NumberInput); + + const input = screen.getByRole("spinbutton"); + await user.type(input, "5"); + expect(screen.getByTestId("value").textContent).toBe("5"); + }); + + it("should handle increment/decrement buttons", async () => { + render(NumberInput); + + const incrementButton = screen.getByRole("button", { + name: "Increment number", + }); + const decrementButton = screen.getByRole("button", { + name: "Decrement number", + }); + + await user.click(incrementButton); + expect(screen.getByTestId("value").textContent).toBe("1"); + + await user.click(decrementButton); + expect(screen.getByTestId("value").textContent).toBe("0"); + }); + + it("should handle empty value when allowEmpty is true", async () => { + render(NumberInput, { + props: { allowEmpty: true }, + }); + + const input = screen.getByRole("spinbutton"); + await user.clear(input); + expect(input).toHaveValue(null); + }); + + it("should handle min/max validation", async () => { + render(NumberInput, { props: { min: 4, max: 20 } }); + + const input = screen.getByRole("spinbutton"); + await user.type(input, "25"); + expect(screen.getByTestId("value").textContent).toBe("25"); + expect(screen.getByRole("spinbutton")).toHaveAttribute( + "aria-invalid", + "true", + ); + }); + + it("should not show helper text when invalid", () => { + render(NumberInput, { + props: { + invalid: true, + invalidText: "Invalid input", + helperText: "Helper text", + }, + }); + + expect(screen.queryByText("Helper text")).not.toBeInTheDocument(); + expect(screen.getByText("Invalid input")).toBeInTheDocument(); + }); + + it("should not show helper text when warning", () => { + render(NumberInput, { + props: { + warn: true, + warnText: "Warning message", + helperText: "Helper text", + }, + }); + + expect(screen.queryByText("Helper text")).not.toBeInTheDocument(); + expect(screen.getByText("Warning message")).toBeInTheDocument(); + }); + + it("should handle disabled helper text", () => { + render(NumberInput, { + props: { + disabled: true, + helperText: "Helper text", + }, + }); + + expect(screen.getByText("Helper text")).toHaveClass( + "bx--form__helper-text--disabled", + ); + }); +}); diff --git a/tests/NumberInput/NumberInputCustom.test.svelte b/tests/NumberInput/NumberInputCustom.test.svelte new file mode 100644 index 00000000..4fa329a9 --- /dev/null +++ b/tests/NumberInput/NumberInputCustom.test.svelte @@ -0,0 +1,7 @@ + + + + Custom Label Text + From ec7d79878355826efe5253a16c4be15d72b5daf2 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 20 Mar 2025 13:03:15 -0700 Subject: [PATCH 040/211] test(radio-button): add unit tests --- tests/RadioButton.test.svelte | 35 ----- tests/RadioButton/RadioButton.test.svelte | 32 +++++ tests/RadioButton/RadioButton.test.ts | 128 ++++++++++++++++++ .../RadioButton/RadioButtonCustom.test.svelte | 7 + 4 files changed, 167 insertions(+), 35 deletions(-) delete mode 100644 tests/RadioButton.test.svelte create mode 100644 tests/RadioButton/RadioButton.test.svelte create mode 100644 tests/RadioButton/RadioButton.test.ts create mode 100644 tests/RadioButton/RadioButtonCustom.test.svelte diff --git a/tests/RadioButton.test.svelte b/tests/RadioButton.test.svelte deleted file mode 100644 index e22109ce..00000000 --- a/tests/RadioButton.test.svelte +++ /dev/null @@ -1,35 +0,0 @@ - - - { - console.log(e.detail); // string - }} -> - - - - - - - - - - - - - - - - diff --git a/tests/RadioButton/RadioButton.test.svelte b/tests/RadioButton/RadioButton.test.svelte new file mode 100644 index 00000000..166c4b42 --- /dev/null +++ b/tests/RadioButton/RadioButton.test.svelte @@ -0,0 +1,32 @@ + + + { + console.log("change"); + }} +/> diff --git a/tests/RadioButton/RadioButton.test.ts b/tests/RadioButton/RadioButton.test.ts new file mode 100644 index 00000000..6103c8d8 --- /dev/null +++ b/tests/RadioButton/RadioButton.test.ts @@ -0,0 +1,128 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import RadioButton from "./RadioButton.test.svelte"; +import RadioButtonCustom from "./RadioButtonCustom.test.svelte"; + +describe("RadioButton", () => { + it("should render with default props", () => { + render(RadioButton); + + const input = screen.getByRole("radio"); + expect(input).toBeInTheDocument(); + expect(input).toHaveAttribute("name", "test-group"); + expect(input).toHaveAttribute("value", ""); + expect(input).not.toBeChecked(); + expect(screen.getByText("Option 1")).toBeInTheDocument(); + }); + + it("should handle checked state", () => { + render(RadioButton, { props: { checked: true } }); + + expect(screen.getByRole("radio")).toBeChecked(); + }); + + it("should handle disabled state", () => { + render(RadioButton, { props: { disabled: true } }); + + expect(screen.getByRole("radio")).toBeDisabled(); + }); + + it("should handle required state", () => { + render(RadioButton, { props: { required: true } }); + + expect(screen.getByRole("radio")).toHaveAttribute("required"); + }); + + it("should handle label position", () => { + render(RadioButton, { props: { labelPosition: "left" } }); + + expect( + screen.getByText("Option 1").closest(".bx--radio-button-wrapper"), + ).toHaveClass("bx--radio-button-wrapper--label-left"); + }); + + it("should handle hidden label", () => { + render(RadioButton, { props: { hideLabel: true } }); + + expect(screen.getByText("Option 1")).toHaveClass("bx--visually-hidden"); + }); + + it("should handle custom id", () => { + render(RadioButton, { props: { id: "custom-id" } }); + + expect(screen.getByRole("radio")).toHaveAttribute("id", "custom-id"); + + const radioButton = screen + .getByText("Option 1") + .closest(".bx--radio-button-wrapper"); + assert(radioButton); + expect(radioButton.querySelector("label")).toHaveAttribute( + "for", + "custom-id", + ); + }); + + it("should handle custom name", () => { + render(RadioButton, { props: { name: "custom-name" } }); + + expect(screen.getByRole("radio")).toHaveAttribute("name", "custom-name"); + }); + + it("should handle custom value", () => { + render(RadioButton, { props: { value: "custom-value" } }); + + expect(screen.getByRole("radio")).toHaveAttribute("value", "custom-value"); + }); + + it("should handle custom slots", () => { + render(RadioButtonCustom); + + expect(screen.getByText("Custom Label Text")).toBeInTheDocument(); + }); + + it("should handle change event", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(RadioButton); + + const input = screen.getByRole("radio"); + await user.click(input); + + expect(input).toBeChecked(); + expect(consoleLog).toHaveBeenCalledWith("change"); + }); + + // TODO(bug): forward focus/blur events. + it.skip("should handle focus and blur events", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(RadioButton); + + const input = screen.getByRole("radio"); + await user.tab(); + expect(input).toHaveFocus(); + expect(consoleLog).toHaveBeenCalledWith("focus"); + + await user.tab(); + expect(input).not.toHaveFocus(); + expect(consoleLog).toHaveBeenCalledWith("blur"); + }); + + it("should handle disabled state with events", async () => { + render(RadioButton, { props: { disabled: true } }); + + const input = screen.getByRole("radio"); + await user.click(input); + expect(input).not.toBeChecked(); + }); + + it("should handle required state with form validation", () => { + render(RadioButton, { props: { required: true } }); + + expect(screen.getByRole("radio")).toHaveAttribute("required"); + }); + + it("should handle label text slot", () => { + render(RadioButtonCustom); + + expect(screen.getByText("Custom Label Text").tagName).toBe("SPAN"); + }); +}); diff --git a/tests/RadioButton/RadioButtonCustom.test.svelte b/tests/RadioButton/RadioButtonCustom.test.svelte new file mode 100644 index 00000000..5913e719 --- /dev/null +++ b/tests/RadioButton/RadioButtonCustom.test.svelte @@ -0,0 +1,7 @@ + + + + Custom Label Text + From 6e62ce5416487e7938ce8ad6b0c883f319365240 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 20 Mar 2025 13:10:59 -0700 Subject: [PATCH 041/211] test(time-picker): add unit tests --- tests/TimePicker.test.svelte | 67 ------- tests/TimePicker/TimePicker.test.svelte | 68 +++++++ tests/TimePicker/TimePicker.test.ts | 182 ++++++++++++++++++ tests/TimePicker/TimePickerCustom.test.svelte | 19 ++ 4 files changed, 269 insertions(+), 67 deletions(-) delete mode 100644 tests/TimePicker.test.svelte create mode 100644 tests/TimePicker/TimePicker.test.svelte create mode 100644 tests/TimePicker/TimePicker.test.ts create mode 100644 tests/TimePicker/TimePickerCustom.test.svelte diff --git a/tests/TimePicker.test.svelte b/tests/TimePicker.test.svelte deleted file mode 100644 index 8f25bf81..00000000 --- a/tests/TimePicker.test.svelte +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/TimePicker/TimePicker.test.svelte b/tests/TimePicker/TimePicker.test.svelte new file mode 100644 index 00000000..e2b06eb3 --- /dev/null +++ b/tests/TimePicker/TimePicker.test.svelte @@ -0,0 +1,68 @@ + + + { + console.log("change"); + }} + on:input={() => { + console.log("input"); + }} + on:keydown={() => { + console.log("keydown"); + }} + on:keyup={() => { + console.log("keyup"); + }} + on:focus={() => { + console.log("focus"); + }} + on:blur={() => { + console.log("blur"); + }} +> + + + + + + + + + diff --git a/tests/TimePicker/TimePicker.test.ts b/tests/TimePicker/TimePicker.test.ts new file mode 100644 index 00000000..43cdbcdf --- /dev/null +++ b/tests/TimePicker/TimePicker.test.ts @@ -0,0 +1,182 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import TimePicker from "./TimePicker.test.svelte"; +import TimePickerCustom from "./TimePickerCustom.test.svelte"; + +describe("TimePicker", () => { + it("should render with default props", () => { + render(TimePicker); + + const input = screen.getByRole("textbox"); + expect(input).toBeInTheDocument(); + expect(input).toHaveAttribute("name", "test-time"); + expect(input).toHaveAttribute("placeholder", "hh:mm"); + expect(input).toHaveAttribute("pattern", "(1[012]|[1-9]):[0-5][0-9](\\s)?"); + expect(input).toHaveAttribute("maxlength", "5"); + expect(screen.getByText("Time")).toBeInTheDocument(); + expect(screen.getByText("AM")).toBeInTheDocument(); + expect(screen.getByText("PM")).toBeInTheDocument(); + expect(screen.getByText("PDT")).toBeInTheDocument(); + expect(screen.getByText("GMT")).toBeInTheDocument(); + }); + + it("should handle different sizes", () => { + (["sm", "xl"] as const).forEach((size) => { + const { container } = render(TimePicker, { + props: { size }, + }); + + expect(container.querySelector(".bx--time-picker")).toHaveClass( + `bx--time-picker--${size}`, + ); + container.remove(); + }); + }); + + it("should handle light variant", () => { + render(TimePicker, { props: { light: true } }); + + const timePicker = screen.getByRole("textbox").closest(".bx--time-picker"); + expect(timePicker).toHaveClass("bx--time-picker--light"); + }); + + it("should handle disabled state", () => { + render(TimePicker, { props: { disabled: true } }); + + const input = screen.getByRole("textbox"); + expect(input).toBeDisabled(); + expect(screen.getByText("Time")).toHaveClass("bx--label--disabled"); + }); + + it("should handle invalid state", () => { + render(TimePicker, { + props: { invalid: true, invalidText: "Invalid time" }, + }); + + const input = screen.getByRole("textbox"); + expect(input).toHaveClass("bx--text-input--invalid"); + expect(input).toHaveAttribute("data-invalid"); + expect(screen.getByText("Invalid time")).toHaveClass( + "bx--form-requirement", + ); + }); + + it("should handle hidden label", () => { + render(TimePicker, { props: { hideLabel: true } }); + + expect(screen.getByText("Time")).toHaveClass("bx--visually-hidden"); + }); + + it("should handle custom id", () => { + render(TimePicker, { props: { id: "custom-id" } }); + + const input = screen.getByRole("textbox"); + expect(input).toHaveAttribute("id", "custom-id"); + expect(screen.getByText("Time")).toHaveAttribute("for", "custom-id"); + }); + + it("should handle custom name", () => { + render(TimePicker, { props: { name: "custom-name" } }); + + expect(screen.getByRole("textbox")).toHaveAttribute("name", "custom-name"); + }); + + it("should handle custom placeholder", () => { + render(TimePicker, { props: { placeholder: "Enter time" } }); + + expect(screen.getByRole("textbox")).toHaveAttribute( + "placeholder", + "Enter time", + ); + }); + + it("should handle custom pattern", () => { + render(TimePicker, { props: { pattern: "custom-pattern" } }); + + expect(screen.getByRole("textbox")).toHaveAttribute( + "pattern", + "custom-pattern", + ); + }); + + it("should handle custom maxlength", () => { + render(TimePicker, { props: { maxlength: 10 } }); + + expect(screen.getByRole("textbox")).toHaveAttribute("maxlength", "10"); + }); + + it("should handle value binding", async () => { + render(TimePicker); + + const input = screen.getByRole("textbox"); + await user.type(input, "10:30"); + expect(input).toHaveValue("10:30"); + }); + + it("should handle change event", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(TimePicker); + + const input = screen.getByRole("textbox"); + await user.type(input, "10:30"); + expect(consoleLog).toHaveBeenCalledWith("focus"); + expect(consoleLog).toHaveBeenCalledWith("input"); + await user.keyboard("{Enter}"); + expect(consoleLog).toHaveBeenCalledWith("keydown"); + expect(consoleLog).toHaveBeenCalledWith("input"); + + expect(input).toHaveValue("10:30"); + await user.keyboard("{Tab}"); + expect(consoleLog).toHaveBeenCalledWith("change"); + }); + + it("should handle focus and blur events", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(TimePicker); + + const input = screen.getByRole("textbox"); + await user.tab(); + expect(input).toHaveFocus(); + expect(consoleLog).toHaveBeenCalledWith("focus"); + + await user.tab(); + expect(input).not.toHaveFocus(); + expect(consoleLog).toHaveBeenCalledWith("blur"); + }); + + it("should handle disabled state with events", async () => { + render(TimePicker, { props: { disabled: true } }); + + const input = screen.getByRole("textbox"); + await user.type(input, "10:30"); + expect(input).toHaveValue(""); + }); + + it("should handle invalid state with helper text", () => { + render(TimePicker, { + props: { + invalid: true, + invalidText: "Invalid time", + }, + }); + + expect(screen.getByText("Invalid time")).toBeInTheDocument(); + }); + + it("should handle label text slot", () => { + render(TimePickerCustom); + + const label = screen.getByText("Custom Label Text"); + expect(label).toBeInTheDocument(); + expect(label.tagName).toBe("SPAN"); + }); + + it("should handle TimePickerSelect components", () => { + render(TimePicker); + + const selects = screen.getAllByRole("combobox"); + expect(selects).toHaveLength(2); + expect(selects[0]).toHaveValue("pm"); + expect(selects[1]).toHaveValue("pdt"); + }); +}); diff --git a/tests/TimePicker/TimePickerCustom.test.svelte b/tests/TimePicker/TimePickerCustom.test.svelte new file mode 100644 index 00000000..3e9c4867 --- /dev/null +++ b/tests/TimePicker/TimePickerCustom.test.svelte @@ -0,0 +1,19 @@ + + + + Custom Label Text + + + + + + + + + From 490d3b42ea510aab3de3e89a5bcf47ad38a67931 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 20 Mar 2025 13:28:01 -0700 Subject: [PATCH 042/211] test(radio-tile): add unit tests --- tests/RadioTile.test.svelte | 17 -- tests/RadioTile/RadioTile.group.test.svelte | 25 +++ tests/RadioTile/RadioTile.single.test.svelte | 7 + tests/RadioTile/RadioTile.test.svelte | 43 ++++ tests/RadioTile/RadioTile.test.ts | 197 +++++++++++++++++++ tests/RadioTile/RadioTileCustom.test.svelte | 9 + 6 files changed, 281 insertions(+), 17 deletions(-) delete mode 100644 tests/RadioTile.test.svelte create mode 100644 tests/RadioTile/RadioTile.group.test.svelte create mode 100644 tests/RadioTile/RadioTile.single.test.svelte create mode 100644 tests/RadioTile/RadioTile.test.svelte create mode 100644 tests/RadioTile/RadioTile.test.ts create mode 100644 tests/RadioTile/RadioTileCustom.test.svelte diff --git a/tests/RadioTile.test.svelte b/tests/RadioTile.test.svelte deleted file mode 100644 index 45356d3b..00000000 --- a/tests/RadioTile.test.svelte +++ /dev/null @@ -1,17 +0,0 @@ - - - { - console.log(e.detail); // string - }} -> - Lite plan - Standard plan - Plus plan - diff --git a/tests/RadioTile/RadioTile.group.test.svelte b/tests/RadioTile/RadioTile.group.test.svelte new file mode 100644 index 00000000..defafb8a --- /dev/null +++ b/tests/RadioTile/RadioTile.group.test.svelte @@ -0,0 +1,25 @@ + + + + {#each values as value} + {value} + {/each} + + +
+ Selected: {selected} +
+ + diff --git a/tests/RadioTile/RadioTile.single.test.svelte b/tests/RadioTile/RadioTile.single.test.svelte new file mode 100644 index 00000000..6a986a02 --- /dev/null +++ b/tests/RadioTile/RadioTile.single.test.svelte @@ -0,0 +1,7 @@ + + + +
Custom content
+
diff --git a/tests/RadioTile/RadioTile.test.svelte b/tests/RadioTile/RadioTile.test.svelte new file mode 100644 index 00000000..84d734e4 --- /dev/null +++ b/tests/RadioTile/RadioTile.test.svelte @@ -0,0 +1,43 @@ + + + + { + console.log("change"); + }} + on:keydown + on:click + on:mouseover + on:mouseenter + on:mouseleave + > + Test content + + diff --git a/tests/RadioTile/RadioTile.test.ts b/tests/RadioTile/RadioTile.test.ts new file mode 100644 index 00000000..351c01dc --- /dev/null +++ b/tests/RadioTile/RadioTile.test.ts @@ -0,0 +1,197 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import RadioTile from "./RadioTile.test.svelte"; +import RadioTileCustom from "./RadioTileCustom.test.svelte"; +import RadioTileSingle from "./RadioTile.single.test.svelte"; +import RadioTileGroup from "./RadioTile.group.test.svelte"; + +describe("RadioTile", () => { + it("should render with default props", () => { + render(RadioTile); + + const input = screen.getByRole("radio"); + expect(input).toBeInTheDocument(); + expect(input).toHaveAttribute("name", "test-group"); + expect(input).toHaveAttribute("value", "test"); + expect(input).not.toBeChecked(); + expect(screen.getByText("Test content")).toBeInTheDocument(); + expect(screen.getByTitle("Tile checkmark")).toBeInTheDocument(); + }); + + it("should handle checked state", () => { + render(RadioTile, { + props: { checked: true }, + }); + + const input = screen.getByRole("radio"); + expect(input).toBeChecked(); + expect(screen.getByText("Test content").closest(".bx--tile")).toHaveClass( + "bx--tile--is-selected", + ); + }); + + it("should handle light variant", () => { + render(RadioTile, { + props: { light: true }, + }); + + expect(screen.getByText("Test content").closest(".bx--tile")).toHaveClass( + "bx--tile--light", + ); + }); + + it("should handle disabled state", () => { + render(RadioTile, { + props: { disabled: true }, + }); + + const input = screen.getByRole("radio"); + expect(input).toBeDisabled(); + expect(screen.getByText("Test content").closest(".bx--tile")).toHaveClass( + "bx--tile--disabled", + ); + }); + + it("should handle required state", () => { + render(RadioTile, { + props: { required: true }, + }); + + expect(screen.getByRole("radio")).toHaveAttribute("required"); + }); + + it("should handle custom value", () => { + render(RadioTile, { + props: { value: "custom-value" }, + }); + + expect(screen.getByRole("radio")).toHaveAttribute("value", "custom-value"); + }); + + it("should handle custom tabindex", () => { + render(RadioTile, { + props: { tabindex: "1" }, + }); + + expect(screen.getByRole("radio")).toHaveAttribute("tabindex", "1"); + }); + + it("should handle custom icon description", () => { + render(RadioTile, { + props: { iconDescription: "Custom checkmark" }, + }); + + expect(screen.getByTitle("Custom checkmark")).toBeInTheDocument(); + }); + + it("should handle custom id", () => { + render(RadioTile, { props: { id: "custom-id" } }); + + expect(screen.getByRole("radio")).toHaveAttribute("id", "custom-id"); + + const radioTileLabel = screen.getByText("Test content").closest("label"); + assert(radioTileLabel); + expect(radioTileLabel).toHaveAttribute("for", "custom-id"); + }); + + // TODO(bug): support standalone radio tile. + it.skip("should handle custom name", () => { + render(RadioTileSingle); + + expect(screen.getByRole("radio")).toHaveAttribute("name", "custom-name"); + }); + + it("should handle custom slots", () => { + render(RadioTileCustom); + + expect(screen.getByText("Custom content")).toBeInTheDocument(); + }); + + it("should handle change event", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(RadioTile); + + const input = screen.getByRole("radio"); + await user.click(input); + + expect(input).toBeChecked(); + expect(consoleLog).toHaveBeenCalledWith("change"); + }); + + it("should handle keyboard events", async () => { + render(RadioTileGroup); + + const inputs = screen.getAllByRole("radio"); + + expect(inputs[1]).not.toHaveFocus(); + expect(inputs[1]).toBeChecked(); + + await user.tab(); + expect(inputs[1]).toHaveFocus(); + + await user.keyboard("{ArrowDown}"); + expect(inputs[2]).toHaveFocus(); + expect(inputs[2]).toBeChecked(); + + await user.keyboard("{ArrowDown}"); + expect(inputs[0]).toHaveFocus(); + expect(inputs[0]).toBeChecked(); + }); + + it("supports programmatic selection", async () => { + render(RadioTileGroup); + + const inputs = screen.getAllByRole("radio"); + expect(inputs[1]).not.toHaveFocus(); + expect(inputs[1]).toBeChecked(); + expect(screen.getByText(/Selected: Standard plan/)).toBeInTheDocument(); + + await user.click(inputs[2]); + expect(inputs[2]).toHaveFocus(); + expect(inputs[2]).toBeChecked(); + expect(screen.getByText(/Selected: Plus plan/)).toBeInTheDocument(); + + await user.click(screen.getByRole("button")); + expect(inputs[1]).not.toHaveFocus(); + expect(inputs[1]).toBeChecked(); + expect(screen.getByText(/Selected: Standard plan/)).toBeInTheDocument(); + }); + + it("should handle disabled state with events", async () => { + render(RadioTile, { + props: { disabled: true }, + }); + + const input = screen.getByRole("radio"); + await user.click(input); + expect(input).not.toBeChecked(); + }); + + it("should handle mouse events", async () => { + render(RadioTile); + + const tile = screen.getByText("Test content").closest(".bx--tile"); + assert(tile); + await user.hover(tile); + await user.unhover(tile); + }); + + it("should handle custom content slot", () => { + render(RadioTileCustom); + + const content = screen.getByText("Custom content"); + expect(content).toBeInTheDocument(); + expect(content.tagName).toBe("DIV"); + }); + + it("should handle TileGroup context", () => { + render(RadioTile, { props: { checked: true } }); + + const input = screen.getByRole("radio"); + expect(input).toBeChecked(); + expect(screen.getByText("Test content").closest(".bx--tile")).toHaveClass( + "bx--tile--is-selected", + ); + expect(input).toHaveAttribute("name", "test-group"); + }); +}); diff --git a/tests/RadioTile/RadioTileCustom.test.svelte b/tests/RadioTile/RadioTileCustom.test.svelte new file mode 100644 index 00000000..9d97ddf9 --- /dev/null +++ b/tests/RadioTile/RadioTileCustom.test.svelte @@ -0,0 +1,9 @@ + + + + +
Custom content
+
+
From f89e9df8f01ac8f0ca48df690e0b16da0093801b Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 20 Mar 2025 15:50:54 -0700 Subject: [PATCH 043/211] test(expandable-tile): add unit tests --- tests/ExpandableTile.test.svelte | 22 --- .../ExpandableTile/ExpandableTile.test.svelte | 46 ++++++ tests/ExpandableTile/ExpandableTile.test.ts | 149 ++++++++++++++++++ .../ExpandableTileCustom.test.svelte | 31 ++++ tests/setup-tests.ts | 37 +++++ 5 files changed, 263 insertions(+), 22 deletions(-) delete mode 100644 tests/ExpandableTile.test.svelte create mode 100644 tests/ExpandableTile/ExpandableTile.test.svelte create mode 100644 tests/ExpandableTile/ExpandableTile.test.ts create mode 100644 tests/ExpandableTile/ExpandableTileCustom.test.svelte diff --git a/tests/ExpandableTile.test.svelte b/tests/ExpandableTile.test.svelte deleted file mode 100644 index 53927f6d..00000000 --- a/tests/ExpandableTile.test.svelte +++ /dev/null @@ -1,22 +0,0 @@ - - - -
Above the fold content here
-
Below the fold content here
-
- - -
Above the fold content here
-
Below the fold content here
-
- - -
Above the fold content here
-
Below the fold content here
-
diff --git a/tests/ExpandableTile/ExpandableTile.test.svelte b/tests/ExpandableTile/ExpandableTile.test.svelte new file mode 100644 index 00000000..9592038f --- /dev/null +++ b/tests/ExpandableTile/ExpandableTile.test.svelte @@ -0,0 +1,46 @@ + + + +
+ Above the fold content here +
+
+ Below the fold content here +
+
diff --git a/tests/ExpandableTile/ExpandableTile.test.ts b/tests/ExpandableTile/ExpandableTile.test.ts new file mode 100644 index 00000000..471722aa --- /dev/null +++ b/tests/ExpandableTile/ExpandableTile.test.ts @@ -0,0 +1,149 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import ExpandableTile from "./ExpandableTile.test.svelte"; +import ExpandableTileCustom from "./ExpandableTileCustom.test.svelte"; + +describe("ExpandableTile", () => { + it("should render with default props", () => { + render(ExpandableTile); + + const tile = screen.getByRole("button"); + expect(tile).toBeInTheDocument(); + expect(tile).toHaveAttribute("aria-expanded", "false"); + expect(tile).toHaveAttribute("title", "Interact to expand Tile"); + expect(screen.getByTestId("above-content")).toBeInTheDocument(); + expect(screen.getByTestId("below-content")).toBeInTheDocument(); + }); + + it("should handle expanded state", () => { + render(ExpandableTile, { props: { expanded: true } }); + + const tile = screen.getByRole("button"); + expect(tile).toHaveAttribute("aria-expanded", "true"); + expect(tile).toHaveAttribute("title", "Interact to collapse Tile"); + expect(tile).toHaveClass("bx--tile--is-expanded"); + }); + + it("should handle light variant", () => { + render(ExpandableTile, { props: { light: true } }); + + expect(screen.getByRole("button")).toHaveClass("bx--tile--light"); + }); + + it("should handle custom icon text", async () => { + render(ExpandableTile, { + props: { + tileCollapsedIconText: "Custom collapsed text", + tileExpandedIconText: "Custom expanded text", + }, + }); + + const tile = screen.getByRole("button"); + expect(tile).toHaveAttribute("title", "Custom collapsed text"); + + await user.click(tile); + expect(tile).toHaveAttribute("title", "Custom expanded text"); + }); + + it("should handle custom labels", async () => { + render(ExpandableTile, { + props: { + tileCollapsedLabel: "Show more", + tileExpandedLabel: "Show less", + }, + }); + + expect(screen.getByText("Show more")).toBeInTheDocument(); + + await user.click(screen.getByRole("button")); + expect(screen.getByText("Show less")).toBeInTheDocument(); + }); + + it("should handle custom tabindex", () => { + render(ExpandableTile, { props: { tabindex: "1" } }); + + expect(screen.getByRole("button")).toHaveAttribute("tabindex", "1"); + }); + + it("should handle custom id", () => { + render(ExpandableTile, { props: { id: "custom-id" } }); + + expect(screen.getByRole("button")).toHaveAttribute("id", "custom-id"); + }); + + it("should toggle expanded state on click", async () => { + render(ExpandableTile); + + const tile = screen.getByRole("button"); + expect(tile).toHaveAttribute("aria-expanded", "false"); + + await user.click(tile); + expect(tile).toHaveAttribute("aria-expanded", "true"); + + await user.click(tile); + expect(tile).toHaveAttribute("aria-expanded", "false"); + }); + + it("should handle keyboard events", async () => { + render(ExpandableTile); + + const tile = screen.getByRole("button"); + await user.tab(); + expect(tile).toHaveFocus(); + + await user.keyboard("{Enter}"); + expect(tile).toHaveAttribute("aria-expanded", "true"); + + await user.keyboard(" "); + expect(tile).toHaveAttribute("aria-expanded", "false"); + }); + + it("should handle interactive content without toggling", async () => { + render(ExpandableTileCustom); + + const tileButton = screen.getAllByRole("button")[0]; + const link = screen.getByTestId("test-link"); + const button = screen.getByTestId("test-button"); + + expect(tileButton).toHaveAttribute("aria-expanded", "false"); + + await user.click(link); + expect(tileButton).toHaveAttribute("aria-expanded", "false"); + + await user.click(button); + expect(tileButton).toHaveAttribute("aria-expanded", "false"); + }); + + it("should handle mouse events", async () => { + render(ExpandableTile); + + const tile = screen.getByRole("button"); + await user.hover(tile); + await user.unhover(tile); + }); + + it("should handle custom content slots", () => { + render(ExpandableTile); + + const aboveContent = screen.getByTestId("above-content"); + const belowContent = screen.getByTestId("below-content"); + + expect(aboveContent).toHaveTextContent("Above the fold content here"); + expect(belowContent).toHaveTextContent("Below the fold content here"); + }); + + it("should handle max height and padding", async () => { + render(ExpandableTile, { + props: { + tileMaxHeight: 200, + tilePadding: 20, + }, + }); + + const tile = screen.getByRole("button"); + expect(tile.getAttribute("style")).toBe("max-height: 105px;"); + + await user.click(tile); + expect(tile.getAttribute("style")).toBe("max-height: none;"); + }); +}); diff --git a/tests/ExpandableTile/ExpandableTileCustom.test.svelte b/tests/ExpandableTile/ExpandableTileCustom.test.svelte new file mode 100644 index 00000000..035b59bf --- /dev/null +++ b/tests/ExpandableTile/ExpandableTileCustom.test.svelte @@ -0,0 +1,31 @@ + + + +
+ { + linkClicked = true; + }} + > + Test link + +

+ +
+
Below the fold content here
+
diff --git a/tests/setup-tests.ts b/tests/setup-tests.ts index c69af710..8f22aad9 100644 --- a/tests/setup-tests.ts +++ b/tests/setup-tests.ts @@ -6,4 +6,41 @@ import "../css/all.css"; // Mock scrollIntoView since it's not implemented in JSDOM Element.prototype.scrollIntoView = vi.fn(); +// Mock ResizeObserver since it's not implemented in JSDOM +class ResizeObserverMock { + callback: ResizeObserverCallback; + elements: Element[]; + + constructor(callback: ResizeObserverCallback) { + this.callback = callback; + this.elements = []; + } + + observe(element: Element) { + this.elements.push(element); + this.callback( + [ + { + target: element, + contentRect: { height: 100 } as DOMRectReadOnly, + borderBoxSize: [], + contentBoxSize: [], + devicePixelContentBoxSize: [], + }, + ], + this, + ); + } + + unobserve(element: Element) { + this.elements = this.elements.filter((el) => el !== element); + } + + disconnect() { + this.elements = []; + } +} + +global.ResizeObserver = ResizeObserverMock; + export const user = userEvent.setup(); From f5342d4b96ffc8cd9cf3479c51e308b31627dfd2 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 20 Mar 2025 16:02:16 -0700 Subject: [PATCH 044/211] test(structured-list): add unit tests --- tests/StructuredList.test.svelte | 100 ------------- .../StructuredList/StructuredList.test.svelte | 79 +++++++++++ tests/StructuredList/StructuredList.test.ts | 131 ++++++++++++++++++ .../StructuredListCustom.test.svelte | 26 ++++ 4 files changed, 236 insertions(+), 100 deletions(-) delete mode 100644 tests/StructuredList.test.svelte create mode 100644 tests/StructuredList/StructuredList.test.svelte create mode 100644 tests/StructuredList/StructuredList.test.ts create mode 100644 tests/StructuredList/StructuredListCustom.test.svelte diff --git a/tests/StructuredList.test.svelte b/tests/StructuredList.test.svelte deleted file mode 100644 index f04ece1f..00000000 --- a/tests/StructuredList.test.svelte +++ /dev/null @@ -1,100 +0,0 @@ - - - { - console.log(e.detail); // string - }} -> - - - Column A - Column B - Column C - - - - - Row 1 - Row 1 - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc dui magna, - finibus id tortor sed, aliquet bibendum augue. Aenean posuere sem vel - euismod dignissim. Nulla ut cursus dolor. Pellentesque vulputate nisl a - porttitor interdum. - - - - Row 2 - Row 2 - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc dui magna, - finibus id tortor sed, aliquet bibendum augue. Aenean posuere sem vel - euismod dignissim. Nulla ut cursus dolor. Pellentesque vulputate nisl a - porttitor interdum. - - - - Row 3 - Row 3 - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc dui magna, - finibus id tortor sed, aliquet bibendum augue. Aenean posuere sem vel - euismod dignissim. Nulla ut cursus dolor. Pellentesque vulputate nisl a - porttitor interdum. - - - - - - - - - ColumnA - ColumnB - ColumnC - {""} - - - - {#each [1, 2, 3] as item} - - Row {item} - Row {item} - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc dui - magna, finibus id tortor sed, aliquet bibendum augue. Aenean posuere - sem vel euismod dignissim. Nulla ut cursus dolor. Pellentesque - vulputate nisl a porttitor interdum. - - - - - - - {/each} - - - - diff --git a/tests/StructuredList/StructuredList.test.svelte b/tests/StructuredList/StructuredList.test.svelte new file mode 100644 index 00000000..cacf5f64 --- /dev/null +++ b/tests/StructuredList/StructuredList.test.svelte @@ -0,0 +1,79 @@ + + + { + console.log("click"); + }} + on:mouseover={() => { + console.log("mouseover"); + }} + on:mouseenter={() => { + console.log("mouseenter"); + }} + on:mouseleave={() => { + console.log("mouseleave"); + }} + on:change={(e) => { + console.log("change", e.detail); + }} +> + + + Column A + Column B + Column C + {#if selection} + {""} + {/if} + + + + {#each ["1", "2", "3"] as item} + + Row {item} + Row {item} + Content {item} + {#if selection} + + + + + {/if} + + {/each} + + + +
{selected}
diff --git a/tests/StructuredList/StructuredList.test.ts b/tests/StructuredList/StructuredList.test.ts new file mode 100644 index 00000000..c11e7c89 --- /dev/null +++ b/tests/StructuredList/StructuredList.test.ts @@ -0,0 +1,131 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import StructuredList from "./StructuredList.test.svelte"; +import StructuredListCustom from "./StructuredListCustom.test.svelte"; + +describe("StructuredList", () => { + it("should render with default props", () => { + render(StructuredList); + + const list = screen.getByRole("table"); + expect(list).toBeInTheDocument(); + expect(list).toHaveClass("bx--structured-list"); + + // Check header cells + const headerCells = screen.getAllByRole("columnheader"); + expect(headerCells).toHaveLength(3); + expect(headerCells[0]).toHaveTextContent("Column A"); + expect(headerCells[1]).toHaveTextContent("Column B"); + expect(headerCells[2]).toHaveTextContent("Column C"); + + // Check body cells + const cells = screen.getAllByRole("cell"); + expect(cells).toHaveLength(9); // 3 rows x 3 columns + expect(cells[0]).toHaveTextContent("Row 1"); + expect(cells[1]).toHaveTextContent("Row 1"); + expect(cells[2]).toHaveTextContent("Content 1"); + }); + + it("should handle condensed variant", () => { + render(StructuredList, { props: { condensed: true } }); + + expect(screen.getByRole("table")).toHaveClass( + "bx--structured-list--condensed", + ); + }); + + it("should handle flush variant", () => { + render(StructuredList, { props: { flush: true } }); + + expect(screen.getByRole("table")).toHaveClass("bx--structured-list--flush"); + }); + + it("should handle selection variant", () => { + render(StructuredList, { props: { selection: true } }); + + const list = screen.getByRole("table"); + expect(list).toHaveClass("bx--structured-list--selection"); + + const inputs = screen.getAllByRole("radio"); + expect(inputs).toHaveLength(3); + + const checkmarks = screen.getAllByTitle("select an option"); + expect(checkmarks).toHaveLength(3); + }); + + it("should handle selected state", async () => { + render(StructuredList, { + props: { selection: true, selected: "row-1-value" }, + }); + + const selectedInput = screen.getByRole("radio", { checked: true }); + expect(selectedInput.closest("label")).toHaveTextContent("Row 1"); + + await user.click(screen.getAllByRole("radio")[1]); + expect( + screen.getByRole("radio", { checked: true }).closest("label"), + ).toHaveTextContent("Row 2"); + }); + + it("should handle selection change", async () => { + render(StructuredList, { props: { selection: true } }); + + const secondInput = screen.getAllByRole("radio")[1]; + await user.click(secondInput); + + expect(screen.getByTestId("value").textContent).toBe("row-2-value"); + }); + + it("should handle custom content", () => { + render(StructuredListCustom); + + expect(screen.getByTestId("custom-header")).toHaveTextContent( + "Custom Header", + ); + expect(screen.getByTestId("custom-content")).toHaveTextContent( + "Custom Content", + ); + }); + + it("should handle mouse events", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(StructuredList); + + const list = screen.getByRole("table"); + + await user.click(list); + expect(consoleLog).toHaveBeenCalledWith("click"); + await user.hover(list); + expect(consoleLog).toHaveBeenCalledWith("mouseover"); + await user.unhover(list); + expect(consoleLog).toHaveBeenCalledWith("mouseleave"); + }); + + it("should handle noWrap cells", () => { + render(StructuredList); + + const noWrapCells = screen + .getAllByRole("cell") + .filter( + (cell) => + cell.textContent?.startsWith("Row") && cell.textContent?.length === 5, + ); + + noWrapCells.forEach((cell) => { + expect(cell).toHaveClass("bx--structured-list-td"); + }); + }); + + it("should emit change event on selection", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(StructuredList, { props: { selection: true } }); + + expect(consoleLog).not.toHaveBeenCalled(); + + await user.click(screen.getAllByRole("radio")[1]); + expect(consoleLog).toHaveBeenCalledWith("change", "row-2-value"); + + await user.click(screen.getAllByRole("radio")[0]); + expect(consoleLog).toHaveBeenCalledWith("change", "row-1-value"); + }); +}); diff --git a/tests/StructuredList/StructuredListCustom.test.svelte b/tests/StructuredList/StructuredListCustom.test.svelte new file mode 100644 index 00000000..3ef8a400 --- /dev/null +++ b/tests/StructuredList/StructuredListCustom.test.svelte @@ -0,0 +1,26 @@ + + + + + + +
Custom Header
+
+
+
+ + + +
Custom Content
+
+
+
+
From a4b10500a30d5f7fc6edcd7a915ade3f09a4af5c Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 20 Mar 2025 16:05:12 -0700 Subject: [PATCH 045/211] test(skeleton-text): add unit tests --- tests/SkeletonText.test.svelte | 15 ---- tests/SkeletonText/SkeletonText.test.svelte | 27 +++++++ tests/SkeletonText/SkeletonText.test.ts | 90 +++++++++++++++++++++ 3 files changed, 117 insertions(+), 15 deletions(-) delete mode 100644 tests/SkeletonText.test.svelte create mode 100644 tests/SkeletonText/SkeletonText.test.svelte create mode 100644 tests/SkeletonText/SkeletonText.test.ts diff --git a/tests/SkeletonText.test.svelte b/tests/SkeletonText.test.svelte deleted file mode 100644 index 9a96f2bd..00000000 --- a/tests/SkeletonText.test.svelte +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - diff --git a/tests/SkeletonText/SkeletonText.test.svelte b/tests/SkeletonText/SkeletonText.test.svelte new file mode 100644 index 00000000..1caddcfc --- /dev/null +++ b/tests/SkeletonText/SkeletonText.test.svelte @@ -0,0 +1,27 @@ + + + { + console.log("click"); + }} + on:mouseover={() => { + console.log("mouseover"); + }} + on:mouseenter={() => { + console.log("mouseenter"); + }} + on:mouseleave={() => { + console.log("mouseleave"); + }} +/> diff --git a/tests/SkeletonText/SkeletonText.test.ts b/tests/SkeletonText/SkeletonText.test.ts new file mode 100644 index 00000000..7796b09a --- /dev/null +++ b/tests/SkeletonText/SkeletonText.test.ts @@ -0,0 +1,90 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import SkeletonText from "./SkeletonText.test.svelte"; + +describe("SkeletonText", () => { + it("should render with default props", () => { + render(SkeletonText); + const element = screen.getByRole("paragraph"); + expect(element).toHaveClass("bx--skeleton__text"); + expect(element).toHaveStyle({ width: "100%" }); + }); + + it("should render heading variant", () => { + render(SkeletonText, { props: { heading: true } }); + const element = screen.getByRole("paragraph"); + expect(element).toHaveClass("bx--skeleton__text", "bx--skeleton__heading"); + }); + + it("should render paragraph variant with default lines", () => { + render(SkeletonText, { props: { paragraph: true } }); + + const elements = screen.getAllByRole("paragraph"); + expect(elements).toHaveLength(3); // default lines is 3 + elements.forEach((element) => { + expect(element).toHaveClass("bx--skeleton__text"); + }); + }); + + it("should render paragraph with custom line count", () => { + render(SkeletonText, { props: { paragraph: true, lines: 8 } }); + + const elements = screen.getAllByRole("paragraph"); + expect(elements).toHaveLength(8); + }); + + it("should render with custom width", () => { + render(SkeletonText, { props: { width: "50%" } }); + + const element = screen.getByRole("paragraph"); + expect(element).toHaveStyle({ width: "50%" }); + }); + + it("should render paragraph with pixel width", () => { + render(SkeletonText, { props: { paragraph: true, width: "200px" } }); + + const elements = screen.getAllByRole("paragraph"); + elements.forEach((element) => { + const width = element.style.width; + expect(width).toMatch(/^\d+px$/); + const numWidth = parseInt(width); + expect(numWidth).toBeGreaterThanOrEqual(125); // 200 - 75 + expect(numWidth).toBeLessThanOrEqual(200); + }); + }); + + it("should handle mouse events", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(SkeletonText); + + const element = screen.getByRole("paragraph"); + + await user.click(element); + expect(consoleLog).toHaveBeenCalledWith("click"); + + await user.hover(element); + expect(consoleLog).toHaveBeenCalledWith("mouseover"); + + await user.unhover(element); + expect(consoleLog).toHaveBeenCalledWith("mouseleave"); + }); + + it("should handle paragraph mouse events", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(SkeletonText, { props: { paragraph: true } }); + + const container = screen.getAllByRole("paragraph")[0].parentElement; + expect(container).toBeTruthy(); + + if (container) { + await user.click(container); + expect(consoleLog).toHaveBeenCalledWith("click"); + + await user.hover(container); + expect(consoleLog).toHaveBeenCalledWith("mouseover"); + + await user.unhover(container); + expect(consoleLog).toHaveBeenCalledWith("mouseleave"); + } + }); +}); From 3607c70070accca0578102ab497b878d841d6cd8 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 20 Mar 2025 16:09:09 -0700 Subject: [PATCH 046/211] test(skeleton-placeholder): add unit tests --- tests/SkeletonPlaceholder.test.svelte | 7 --- .../SkeletonPlaceholder.test.svelte | 20 +++++++ .../SkeletonPlaceholder.test.ts | 58 +++++++++++++++++++ 3 files changed, 78 insertions(+), 7 deletions(-) delete mode 100644 tests/SkeletonPlaceholder.test.svelte create mode 100644 tests/SkeletonPlaceholder/SkeletonPlaceholder.test.svelte create mode 100644 tests/SkeletonPlaceholder/SkeletonPlaceholder.test.ts diff --git a/tests/SkeletonPlaceholder.test.svelte b/tests/SkeletonPlaceholder.test.svelte deleted file mode 100644 index 46ceb881..00000000 --- a/tests/SkeletonPlaceholder.test.svelte +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/tests/SkeletonPlaceholder/SkeletonPlaceholder.test.svelte b/tests/SkeletonPlaceholder/SkeletonPlaceholder.test.svelte new file mode 100644 index 00000000..c79dc33b --- /dev/null +++ b/tests/SkeletonPlaceholder/SkeletonPlaceholder.test.svelte @@ -0,0 +1,20 @@ + + + { + console.log("click"); + }} + on:mouseover={() => { + console.log("mouseover"); + }} + on:mouseenter={() => { + console.log("mouseenter"); + }} + on:mouseleave={() => { + console.log("mouseleave"); + }} +/> diff --git a/tests/SkeletonPlaceholder/SkeletonPlaceholder.test.ts b/tests/SkeletonPlaceholder/SkeletonPlaceholder.test.ts new file mode 100644 index 00000000..0df9df0a --- /dev/null +++ b/tests/SkeletonPlaceholder/SkeletonPlaceholder.test.ts @@ -0,0 +1,58 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import SkeletonPlaceholder from "./SkeletonPlaceholder.test.svelte"; + +describe("SkeletonPlaceholder", () => { + it("should render with default props", () => { + render(SkeletonPlaceholder); + + const element = screen.getByTestId("skeleton-placeholder"); + expect(element).toHaveClass("bx--skeleton__placeholder"); + }); + + it("should render with custom size", () => { + render(SkeletonPlaceholder, { + props: { style: "height: 12rem; width: 12rem;" }, + }); + + const element = screen.getByTestId("skeleton-placeholder"); + expect(element).toHaveStyle({ height: "12rem", width: "12rem" }); + }); + + it("should handle mouse events", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(SkeletonPlaceholder); + + const element = screen.getByTestId("skeleton-placeholder"); + + await user.click(element); + expect(consoleLog).toHaveBeenCalledWith("click"); + + await user.hover(element); + expect(consoleLog).toHaveBeenCalledWith("mouseover"); + + await user.unhover(element); + expect(consoleLog).toHaveBeenCalledWith("mouseleave"); + }); + + it("should accept additional attributes", () => { + render(SkeletonPlaceholder, { + props: { + "data-testid": "custom-placeholder", + "aria-label": "Loading placeholder", + }, + }); + + const element = screen.getByTestId("custom-placeholder"); + expect(element).toHaveAttribute("aria-label", "Loading placeholder"); + }); + + it("should accept additional classes", () => { + render(SkeletonPlaceholder, { + props: { class: "custom-class" }, + }); + + const element = screen.getByTestId("skeleton-placeholder"); + expect(element).toHaveClass("bx--skeleton__placeholder", "custom-class"); + }); +}); From 0b799d64b7ec5a7d774f239b42b854810b03fdc9 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 20 Mar 2025 16:28:46 -0700 Subject: [PATCH 047/211] test(dropdown): add unit tests --- tests/Dropdown.test.svelte | 115 ---------- tests/Dropdown/Dropdown.test.svelte | 53 +++++ tests/Dropdown/Dropdown.test.ts | 266 ++++++++++++++++++++++++ tests/Dropdown/DropdownSlot.test.svelte | 25 +++ 4 files changed, 344 insertions(+), 115 deletions(-) delete mode 100644 tests/Dropdown.test.svelte create mode 100644 tests/Dropdown/Dropdown.test.svelte create mode 100644 tests/Dropdown/Dropdown.test.ts create mode 100644 tests/Dropdown/DropdownSlot.test.svelte diff --git a/tests/Dropdown.test.svelte b/tests/Dropdown.test.svelte deleted file mode 100644 index 3ba410d6..00000000 --- a/tests/Dropdown.test.svelte +++ /dev/null @@ -1,115 +0,0 @@ - - - { - console.log(e.detail.selectedId); - }} - translateWithId={(id) => { - console.log(id); // "open" | "close" - return id; - }} - let:item - let:index -> - {item.id} - {index} - - - { - return item.text + " (" + item.id + ")"; - }} - titleText="Contact" - selectedId="0" - items={itemsWithoutConst} -/> - - - - - - - - - - - - diff --git a/tests/Dropdown/Dropdown.test.svelte b/tests/Dropdown/Dropdown.test.svelte new file mode 100644 index 00000000..6e5663f9 --- /dev/null +++ b/tests/Dropdown/Dropdown.test.svelte @@ -0,0 +1,53 @@ + + + diff --git a/tests/Dropdown/Dropdown.test.ts b/tests/Dropdown/Dropdown.test.ts new file mode 100644 index 00000000..4154d81e --- /dev/null +++ b/tests/Dropdown/Dropdown.test.ts @@ -0,0 +1,266 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import Dropdown from "./Dropdown.test.svelte"; +import DropdownSlot from "./DropdownSlot.test.svelte"; + +const items = [ + { id: "0", text: "Slack" }, + { id: "1", text: "Email" }, + { id: "2", text: "Fax" }, +] as const; + +describe("Dropdown", () => { + it("should render with default props", () => { + render(Dropdown, { + props: { items, selectedId: "0", titleText: "Contact" }, + }); + + expect(screen.getByText("Contact")).toBeInTheDocument(); + const button = screen.getByRole("button"); + expect(button.querySelector(".bx--list-box__label")).toHaveTextContent( + "Slack", + ); + }); + + it("should handle custom item display text", () => { + render(Dropdown, { + props: { + items, + selectedId: "0", + titleText: "Contact", + itemToString: (item) => `${item.text} (${item.id})`, + }, + }); + + const button = screen.getByRole("button"); + expect(button.querySelector(".bx--list-box__label")).toHaveTextContent( + "Slack (0)", + ); + }); + + it("should handle hidden label", () => { + render(Dropdown, { + props: { + items, + selectedId: "0", + titleText: "Contact", + hideLabel: true, + }, + }); + + const label = screen.getByText("Contact"); + expect(label).toHaveClass("bx--visually-hidden"); + }); + + it("should handle light variant", () => { + render(Dropdown, { + props: { + items, + selectedId: "0", + light: true, + }, + }); + + const button = screen.getByRole("button"); + expect(button.closest(".bx--dropdown")).toHaveClass("bx--dropdown--light"); + }); + + it("should handle inline variant", () => { + render(Dropdown, { + props: { + items, + selectedId: "0", + type: "inline", + }, + }); + + const button = screen.getByRole("button"); + expect(button).toBeEnabled(); + expect(button).toHaveTextContent("Slack"); + expect(button.closest(".bx--dropdown__wrapper")).toHaveClass( + "bx--dropdown__wrapper--inline", + ); + }); + + it("should handle size variants", async () => { + const { rerender } = render(Dropdown, { + props: { + items, + selectedId: "0", + size: "sm", + }, + }); + + const button = screen.getByRole("button"); + expect(button.closest(".bx--dropdown")).toHaveClass("bx--dropdown--sm"); + + await rerender({ items, selectedId: "0", size: "xl" }); + expect(button.closest(".bx--dropdown")).toHaveClass("bx--dropdown--xl"); + }); + + it("should handle invalid state", () => { + render(Dropdown, { + props: { + items, + selectedId: "0", + invalid: true, + invalidText: "Invalid selection", + }, + }); + + const button = screen.getByRole("button"); + expect(button).toBeEnabled(); + expect(button).toHaveTextContent("Slack"); + expect(button.closest(".bx--dropdown")).toHaveAttribute( + "data-invalid", + "true", + ); + expect(screen.getByText("Invalid selection")).toBeInTheDocument(); + }); + + it("should handle warning state", () => { + render(Dropdown, { + props: { + items, + selectedId: "0", + warn: true, + warnText: "Warning message", + }, + }); + + const button = screen.getByRole("button"); + expect(button).toBeEnabled(); + expect(button).toHaveTextContent("Slack"); + expect(button.closest(".bx--dropdown")).toHaveClass( + "bx--dropdown--warning", + ); + expect(screen.getByText("Warning message")).toBeInTheDocument(); + }); + + it("should handle disabled state", () => { + render(Dropdown, { + props: { + items, + selectedId: "0", + disabled: true, + }, + }); + + expect(screen.queryByRole("listbox")).not.toBeInTheDocument(); + expect(screen.getByRole("button")).toHaveAttribute("disabled"); + expect(screen.getByRole("button")).toHaveTextContent("Slack"); + }); + + it("should handle helper text", () => { + render(Dropdown, { + props: { + items, + selectedId: "0", + helperText: "Help text", + }, + }); + + expect(screen.getByText("Help text")).toHaveClass("bx--form__helper-text"); + }); + + it("should handle item selection", async () => { + const { component } = render(Dropdown, { + props: { + items, + selectedId: "0", + }, + }); + + const selectHandler = vi.fn(); + component.$on("select", selectHandler); + + const button = screen.getByRole("button"); + await user.click(button); + + const menuItemText = screen.getByText("Email"); + const menuItem = menuItemText.closest(".bx--list-box__menu-item"); + expect(menuItem).not.toBeNull(); + await user.click(menuItem!); + + expect(selectHandler).toHaveBeenCalledWith( + expect.objectContaining({ + detail: { selectedId: "1", selectedItem: items[1] }, + }), + ); + }); + + it("should handle keyboard navigation", async () => { + render(Dropdown, { + props: { + items, + selectedId: "0", + }, + }); + + const button = screen.getByRole("button"); + await user.tab(); + expect(button).toHaveFocus(); + + await user.keyboard("{Enter}"); + expect(screen.getByRole("listbox")).toBeVisible(); + expect(screen.getByRole("option", { selected: true })).toHaveTextContent( + "Slack", + ); + + await user.keyboard("{ArrowDown}{ArrowDown}"); + await user.keyboard("{Enter}"); + + expect(screen.queryByRole("listbox")).not.toBeInTheDocument(); + expect(button).toHaveTextContent("Email"); + }); + + it("should handle disabled items", async () => { + const itemsWithDisabled = [ + { id: "0", text: "Slack" }, + { id: "1", text: "Email", disabled: true }, + { id: "2", text: "Fax" }, + ]; + + render(Dropdown, { + props: { + items: itemsWithDisabled, + selectedId: "0", + }, + }); + + const button = screen.getByRole("button"); + await user.click(button); + + const menuItemText = screen.getByText("Email"); + const menuItem = menuItemText.closest(".bx--list-box__menu-item"); + expect(menuItem).not.toBeNull(); + expect(menuItem).toHaveAttribute("disabled"); + }); + + it("should handle custom slot content", async () => { + render(DropdownSlot); + + await user.click(screen.getByRole("button")); + + const customItems = screen.getAllByTestId("custom-item"); + expect(customItems).toHaveLength(3); + expect(customItems[0]).toHaveTextContent("Item 1: Option 1"); + expect(customItems[1]).toHaveTextContent("Item 2: Option 2"); + expect(customItems[2]).toHaveTextContent("Item 3: Option 3"); + }); + + it("should close on outside click", async () => { + render(Dropdown, { + props: { + items, + selectedId: "0", + }, + }); + + await user.click(screen.getByRole("button")); + expect(screen.getByRole("listbox")).toBeVisible(); + + await user.click(document.body); + expect(screen.queryByRole("listbox")).not.toBeInTheDocument(); + }); +}); diff --git a/tests/Dropdown/DropdownSlot.test.svelte b/tests/Dropdown/DropdownSlot.test.svelte new file mode 100644 index 00000000..7be8caad --- /dev/null +++ b/tests/Dropdown/DropdownSlot.test.svelte @@ -0,0 +1,25 @@ + + + + + Item {index + 1}: {item.text} + + From f200dadb97603998f13b897bd863627d2ff61f83 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 20 Mar 2025 16:42:13 -0700 Subject: [PATCH 048/211] test(multi-select): more unit tests --- tests/MultiSelect/MultiSelect.test.ts | 367 +++++++++++++++++++++----- 1 file changed, 297 insertions(+), 70 deletions(-) diff --git a/tests/MultiSelect/MultiSelect.test.ts b/tests/MultiSelect/MultiSelect.test.ts index aed26b4a..7d2b8fae 100644 --- a/tests/MultiSelect/MultiSelect.test.ts +++ b/tests/MultiSelect/MultiSelect.test.ts @@ -2,7 +2,13 @@ import { render, screen } from "@testing-library/svelte"; import { MultiSelect } from "carbon-components-svelte"; import { user } from "../setup-tests"; -describe("MultiSelect sorts items correctly", () => { +const items = [ + { id: "0", text: "Slack" }, + { id: "1", text: "Email" }, + { id: "2", text: "Fax" }, +] as const; + +describe("MultiSelect", () => { /** Opens the dropdown. */ const openMenu = async () => await user.click( @@ -29,96 +35,317 @@ describe("MultiSelect sorts items correctly", () => { const nthRenderedOptionText = (index: number) => screen.queryAllByRole("option").at(index)?.textContent?.trim(); - it("initially sorts items alphabetically", async () => { - render(MultiSelect, { - items: [ - { id: "1", text: "C" }, - { id: "3", text: "A" }, - { id: "2", text: "B" }, - ], + describe("sorting behavior", () => { + it("initially sorts items alphabetically", async () => { + render(MultiSelect, { + items: [ + { id: "1", text: "C" }, + { id: "3", text: "A" }, + { id: "2", text: "B" }, + ], + }); + + // Initially, items should be sorted alphabetically. + await openMenu(); + expect(nthRenderedOptionText(0)).toBe("A"); + expect(nthRenderedOptionText(1)).toBe("B"); + expect(nthRenderedOptionText(2)).toBe("C"); }); - await openMenu(); - expect(nthRenderedOptionText(0)).toBe("A"); - expect(nthRenderedOptionText(1)).toBe("B"); - expect(nthRenderedOptionText(2)).toBe("C"); + it("immediately moves selected items to the top (with selectionFeedback: top)", async () => { + render(MultiSelect, { + items: [ + { id: "3", text: "C" }, + { id: "1", text: "A" }, + { id: "2", text: "B" }, + ], + selectionFeedback: "top", + }); + + // Initially, items should be sorted alphabetically. + await openMenu(); + expect(nthRenderedOptionText(0)).toBe("A"); + + await toggleOption("C"); + expect(nthRenderedOptionText(0)).toBe("C"); + + await toggleOption("C"); + expect(nthRenderedOptionText(0)).toBe("A"); + }); + + it("sorts newly-toggled items only after the dropdown is reoponed (with selectionFeedback: top-after-reopen)", async () => { + render(MultiSelect, { + items: [ + { id: "3", text: "C" }, + { id: "1", text: "A" }, + { id: "2", text: "B" }, + ], + }); + + // Initially, items should be sorted alphabetically. + await openMenu(); + expect(nthRenderedOptionText(0)).toBe("A"); + + // While the menu is still open, a newly-selected item should not move. + await toggleOption("C"); + expect(nthRenderedOptionText(0)).toBe("A"); + + // The newly-selected item should move after the menu is closed and + // re-opened. + await closeMenu(); + await openMenu(); + expect(nthRenderedOptionText(0)).toBe("C"); + + // A deselected item should not move while the dropdown is still open. + await toggleOption("C"); + expect(nthRenderedOptionText(0)).toBe("C"); + + // The deselected item should move after closing and re-opening the dropdown. + await closeMenu(); + await openMenu(); + expect(nthRenderedOptionText(0)).toBe("A"); + }); + + it("never moves selected items to the top (with selectionFeedback: fixed)", async () => { + render(MultiSelect, { + items: [ + { id: "3", text: "C" }, + { id: "1", text: "A" }, + { id: "2", text: "B" }, + ], + selectionFeedback: "fixed", + }); + + // Items should be sorted alphabetically. + await openMenu(); + expect(nthRenderedOptionText(0)).toBe("A"); + + // A newly-selected item should not move after the selection is made. + await toggleOption("C"); + expect(nthRenderedOptionText(0)).toBe("A"); + + // The newly-selected item also shouldn’t move after the dropdown is closed + // and reopened. + await closeMenu(); + await openMenu(); + expect(nthRenderedOptionText(0)).toBe("A"); + }); }); - it("immediately moves selected items to the top (with selectionFeedback: top)", async () => { - render(MultiSelect, { - items: [ - { id: "3", text: "C" }, - { id: "1", text: "A" }, - { id: "2", text: "B" }, - ], - selectionFeedback: "top", + describe("filtering behavior", () => { + it("should filter items based on input value", async () => { + render(MultiSelect, { + items, + filterable: true, + placeholder: "Filter items...", + }); + + await openMenu(); + const input = screen.getByPlaceholderText("Filter items..."); + await user.type(input, "em"); + + expect(screen.queryByText("Slack")).not.toBeInTheDocument(); + expect(screen.getByText("Email")).toBeInTheDocument(); + expect(screen.queryByText("Fax")).not.toBeInTheDocument(); }); - await openMenu(); - expect(nthRenderedOptionText(0)).toBe("A"); + it("should use custom filter function", async () => { + render(MultiSelect, { + items, + filterable: true, + filterItem: (item, value) => + item.text.toLowerCase().startsWith(value.toLowerCase()), + }); - await toggleOption("C"); - expect(nthRenderedOptionText(0)).toBe("C"); + await openMenu(); + const input = screen.getByRole("combobox"); + await user.type(input, "e"); - await toggleOption("C"); - expect(nthRenderedOptionText(0)).toBe("A"); + expect(screen.queryByText("Slack")).not.toBeInTheDocument(); + expect(screen.getByText("Email")).toBeInTheDocument(); + expect(screen.queryByText("Fax")).not.toBeInTheDocument(); + }); + + // TODO(bug): ListBoxSelection aria-labels should be user-friendly + it.skip("should clear filter on selection clear", async () => { + render(MultiSelect, { + items, + filterable: true, + selectedIds: ["0"], + }); + + const clearButton = screen.getByLabelText("Clear all"); + await user.click(clearButton); + + const input = screen.getByRole("combobox"); + expect(input).toHaveValue(""); + }); }); - it("sorts newly-toggled items only after the dropdown is reoponed (with selectionFeedback: top-after-reopen)", async () => { - render(MultiSelect, { - items: [ - { id: "3", text: "C" }, - { id: "1", text: "A" }, - { id: "2", text: "B" }, - ], + describe("keyboard navigation", () => { + it("should handle arrow keys for navigation", async () => { + render(MultiSelect, { items }); + + await openMenu(); + await user.keyboard("{ArrowDown}"); + + const options = screen.getAllByRole("option"); + expect(options[0]).toHaveClass("bx--list-box__menu-item--highlighted"); }); - // Initially, items should be sorted alphabetically. - await openMenu(); - expect(nthRenderedOptionText(0)).toBe("A"); + it("should select item with Enter key", async () => { + const { component } = render(MultiSelect, { items }); + const selectHandler = vi.fn(); + component.$on("select", selectHandler); - // While the menu is still open, a newly-selected item should not move. - await toggleOption("C"); - expect(nthRenderedOptionText(0)).toBe("A"); + await openMenu(); + await user.keyboard("{ArrowDown}"); + await user.keyboard("{Enter}"); - // The newly-selected item should move after the menu is closed and - // re-opened. - await closeMenu(); - await openMenu(); - expect(nthRenderedOptionText(0)).toBe("C"); + expect(selectHandler).toHaveBeenCalled(); + }); - // A deselected item should not move while the dropdown is still open. - await toggleOption("C"); - expect(nthRenderedOptionText(0)).toBe("C"); + it("should close menu with Escape key", async () => { + render(MultiSelect, { items }); - // The deselected item should move after closing and re-opening the dropdown. - await closeMenu(); - await openMenu(); - expect(nthRenderedOptionText(0)).toBe("A"); + await openMenu(); + await user.keyboard("{Escape}"); + + const button = screen.getByRole("button"); + expect(button).toHaveAttribute("aria-expanded", "false"); + }); }); - it("never moves selected items to the top (with selectionFeedback: fixed)", async () => { - render(MultiSelect, { - items: [ - { id: "3", text: "C" }, - { id: "1", text: "A" }, - { id: "2", text: "B" }, - ], - selectionFeedback: "fixed", + describe("accessibility", () => { + it("should handle hidden label", () => { + render(MultiSelect, { + items, + titleText: "Contact methods", + hideLabel: true, + }); + + const label = screen.getByText("Contact methods"); + expect(label).toHaveClass("bx--visually-hidden"); }); - // Items should be sorted alphabetically. - await openMenu(); - expect(nthRenderedOptionText(0)).toBe("A"); + it("should handle custom aria-label", async () => { + render(MultiSelect, { + items, + "aria-label": "Custom label", + }); - // A newly-selected item should not move after the selection is made. - await toggleOption("C"); - expect(nthRenderedOptionText(0)).toBe("A"); + await openMenu(); + const menu = screen.getByLabelText("Custom label"); + expect(menu).toBeInTheDocument(); + }); + }); - // The newly-selected item also shouldn’t move after the dropdown is closed - // and reopened. - await closeMenu(); - await openMenu(); - expect(nthRenderedOptionText(0)).toBe("A"); + describe("variants and states", () => { + it("should render in light variant", async () => { + render(MultiSelect, { + items, + light: true, + }); + + await openMenu(); + const listBox = screen.getByRole("listbox").closest(".bx--list-box"); + expect(listBox).toHaveClass("bx--list-box--light"); + }); + + it("should render in inline variant", () => { + render(MultiSelect, { + items, + type: "inline", + }); + + const wrapper = screen + .getByRole("button") + .closest(".bx--multi-select__wrapper"); + expect(wrapper).toHaveClass("bx--multi-select__wrapper--inline"); + }); + + it("should handle invalid state", () => { + render(MultiSelect, { + items, + invalid: true, + invalidText: "Invalid selection", + }); + + expect(screen.getByText("Invalid selection")).toBeInTheDocument(); + const wrapper = screen.getByRole("button").closest(".bx--list-box"); + expect(wrapper).toHaveClass("bx--multi-select--invalid"); + }); + + it("should handle warning state", () => { + render(MultiSelect, { + items, + warn: true, + warnText: "Warning message", + }); + + expect(screen.getByText("Warning message")).toBeInTheDocument(); + const wrapper = screen.getByRole("button").closest(".bx--list-box"); + expect(wrapper).toHaveClass("bx--list-box--warning"); + }); + + it("should handle disabled state", () => { + render(MultiSelect, { items, disabled: true }); + + const field = screen.getByRole("button"); + expect(field).toHaveAttribute("aria-disabled", "true"); + expect(field).toHaveAttribute("tabindex", "-1"); + expect(field.closest(".bx--multi-select")).toHaveAttribute( + "tabindex", + "-1", + ); + }); + + it("should handle disabled items", async () => { + const itemsWithDisabled = [ + { id: "0", text: "Slack" }, + { id: "1", text: "Email", disabled: true }, + { id: "2", text: "Fax" }, + ]; + + render(MultiSelect, { + items: itemsWithDisabled, + }); + + await openMenu(); + const emailOption = screen + .getByText("Email") + .closest(".bx--list-box__menu-item"); + expect(emailOption).toHaveAttribute("disabled"); + }); + }); + + describe("custom formatting", () => { + it("should handle custom itemToString", () => { + render(MultiSelect, { + items, + selectedIds: ["0"], + itemToString: (item) => `${item.text} (${item.id})`, + }); + + expect(screen.getByText("Slack (0)")).toBeInTheDocument(); + }); + + it("should handle custom itemToInput", async () => { + render(MultiSelect, { + items, + itemToInput: (item) => ({ + name: `contact_${item.id}`, + value: item.text.toLowerCase(), + }), + }); + + await openMenu(); + const checkbox = screen.getByText("Slack"); + const checkboxWrapper = checkbox.closest(".bx--checkbox-wrapper"); + assert(checkboxWrapper); + + const checkboxInput = checkboxWrapper.querySelector("input"); + expect(checkboxInput).toHaveAttribute("name", "contact_0"); + }); }); }); From 1478486d8ff20ec505f43fbaa435897dbc40fe19 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 20 Mar 2025 16:54:42 -0700 Subject: [PATCH 049/211] test(password-input): add unit tests --- tests/PasswordInput.test.svelte | 30 --- tests/PasswordInput/PasswordInput.test.svelte | 66 ++++++ tests/PasswordInput/PasswordInput.test.ts | 196 ++++++++++++++++++ 3 files changed, 262 insertions(+), 30 deletions(-) delete mode 100644 tests/PasswordInput.test.svelte create mode 100644 tests/PasswordInput/PasswordInput.test.svelte create mode 100644 tests/PasswordInput/PasswordInput.test.ts diff --git a/tests/PasswordInput.test.svelte b/tests/PasswordInput.test.svelte deleted file mode 100644 index d690c514..00000000 --- a/tests/PasswordInput.test.svelte +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/tests/PasswordInput/PasswordInput.test.svelte b/tests/PasswordInput/PasswordInput.test.svelte new file mode 100644 index 00000000..2f451be2 --- /dev/null +++ b/tests/PasswordInput/PasswordInput.test.svelte @@ -0,0 +1,66 @@ + + + { + console.log("focus"); + }} + on:blur={() => { + console.log("blur"); + }} + on:paste +/> + +
{value}
diff --git a/tests/PasswordInput/PasswordInput.test.ts b/tests/PasswordInput/PasswordInput.test.ts new file mode 100644 index 00000000..33605239 --- /dev/null +++ b/tests/PasswordInput/PasswordInput.test.ts @@ -0,0 +1,196 @@ +import { render, screen } from "@testing-library/svelte"; +import PasswordInput from "./PasswordInput.test.svelte"; +import { user } from "../setup-tests"; + +describe("PasswordInput", () => { + describe("Default", () => { + it("should render with a label", () => { + render(PasswordInput, { + labelText: "Password", + placeholder: "Enter password...", + }); + + expect(screen.getByLabelText("Password")).toBeInTheDocument(); + expect( + screen.getByPlaceholderText("Enter password..."), + ).toBeInTheDocument(); + }); + + it("should toggle password visibility", async () => { + render(PasswordInput, { labelText: "Password", value: "secret123" }); + + const input = screen.getByLabelText("Password"); + expect(input).toHaveAttribute("type", "password"); + + await user.click(screen.getByText("Show password")); + expect(input).toHaveAttribute("type", "text"); + + await user.click(screen.getByText("Hide password")); + expect(input).toHaveAttribute("type", "password"); + }); + + it("should handle custom visibility labels", async () => { + render(PasswordInput, { + labelText: "Password", + hidePasswordLabel: "Custom hide", + showPasswordLabel: "Custom show", + }); + + expect(screen.getByLabelText("Password")).toBeInTheDocument(); + await user.click(screen.getByText("Custom show")); + expect(screen.getByText("Custom hide")).toBeInTheDocument(); + await user.click(screen.getByText("Custom hide")); + expect(screen.getByText("Custom show")).toBeInTheDocument(); + }); + }); + + describe("Tooltip", () => { + it("should handle custom tooltip alignment", () => { + render(PasswordInput, { + labelText: "Password", + tooltipAlignment: "start", + tooltipPosition: "left", + }); + + const button = screen.getByRole("button"); + expect(button).toHaveClass("bx--tooltip--align-start"); + expect(button).toHaveClass("bx--tooltip--left"); + }); + }); + + describe("States", () => { + it("should handle invalid state", () => { + render(PasswordInput, { + labelText: "Password", + invalid: true, + invalidText: "Password must be at least 8 characters", + }); + + expect( + screen.getByText("Password must be at least 8 characters"), + ).toBeInTheDocument(); + const wrapper = screen + .getByLabelText("Password") + .closest(".bx--text-input__field-wrapper"); + expect(wrapper).toHaveAttribute("data-invalid"); + }); + + it("should handle warning state", () => { + render(PasswordInput, { + labelText: "Password", + warn: true, + warnText: "Password will expire soon", + }); + + expect(screen.getByText("Password will expire soon")).toBeInTheDocument(); + const input = screen.getByLabelText("Password"); + expect(input).toHaveClass("bx--text-input--warning"); + }); + + it("should handle disabled state", () => { + render(PasswordInput, { + labelText: "Password", + disabled: true, + value: "disabled-password", + }); + + const input = screen.getByLabelText("Password"); + expect(input).toBeDisabled(); + expect(input).toHaveValue("disabled-password"); + + const toggleButton = screen.getByRole("button"); + expect(toggleButton).toBeDisabled(); + expect(toggleButton).toHaveClass("bx--btn--disabled"); + }); + + it("should handle helper text", () => { + render(PasswordInput, { + labelText: "Password", + helperText: "Your password should be hard to guess", + }); + + expect( + screen.getByText("Your password should be hard to guess"), + ).toBeInTheDocument(); + }); + }); + + describe("Variants", () => { + it("should render light variant", () => { + render(PasswordInput, { labelText: "Password", light: true }); + + const wrapper = screen + .getByLabelText("Password") + .closest(".bx--text-input-wrapper"); + expect(wrapper).toHaveClass("bx--text-input-wrapper--light"); + }); + + it("should render inline variant", () => { + render(PasswordInput, { + labelText: "Password", + inline: true, + }); + + const wrapper = screen + .getByLabelText("Password") + .closest(".bx--text-input-wrapper"); + expect(wrapper).toHaveClass("bx--text-input-wrapper--inline"); + }); + + it("should render in small size", () => { + render(PasswordInput, { labelText: "Password", size: "sm" }); + + const input = screen.getByLabelText("Password"); + expect(input).toHaveClass("bx--text-input--sm"); + }); + + it("should render in extra-large size", () => { + render(PasswordInput, { + labelText: "Password", + size: "xl", + }); + + const input = screen.getByLabelText("Password"); + expect(input).toHaveClass("bx--text-input--xl"); + }); + }); + + describe("Label handling", () => { + it("should handle hidden label", () => { + render(PasswordInput, { labelText: "Password", hideLabel: true }); + + const label = screen.getByText("Password"); + expect(label).toHaveClass("bx--visually-hidden"); + }); + + it("should handle custom id", () => { + render(PasswordInput, { labelText: "Password", id: "custom-id" }); + + const input = screen.getByLabelText("Password"); + expect(input).toHaveAttribute("id", "custom-id"); + }); + }); + + describe("Events", () => { + it("should handle input events", async () => { + render(PasswordInput, { labelText: "Password" }); + + const input = screen.getByLabelText("Password"); + await user.type(input, "test123"); + expect(screen.getByTestId("value")).toHaveTextContent("test123"); + }); + + it("should handle focus and blur events", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(PasswordInput, { labelText: "Password" }); + + expect(consoleLog).not.toHaveBeenCalled(); + const input = screen.getByLabelText("Password"); + await user.click(input); + expect(consoleLog).toHaveBeenCalledWith("focus"); + + await user.tab(); + expect(consoleLog).toHaveBeenCalledWith("blur"); + }); + }); +}); From f7ac0e3f224317ef8664be718bc6ff75ce37e821 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 20 Mar 2025 17:05:24 -0700 Subject: [PATCH 050/211] test(progress-indicator): add unit tests --- tests/ProgressIndicator.test.svelte | 83 ------ .../ProgressIndicator.test.svelte | 35 +++ .../ProgressIndicator.test.ts | 247 ++++++++++++++++++ 3 files changed, 282 insertions(+), 83 deletions(-) delete mode 100644 tests/ProgressIndicator.test.svelte create mode 100644 tests/ProgressIndicator/ProgressIndicator.test.svelte create mode 100644 tests/ProgressIndicator/ProgressIndicator.test.ts diff --git a/tests/ProgressIndicator.test.svelte b/tests/ProgressIndicator.test.svelte deleted file mode 100644 index 0f1e5cc7..00000000 --- a/tests/ProgressIndicator.test.svelte +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/ProgressIndicator/ProgressIndicator.test.svelte b/tests/ProgressIndicator/ProgressIndicator.test.svelte new file mode 100644 index 00000000..4f8a4d06 --- /dev/null +++ b/tests/ProgressIndicator/ProgressIndicator.test.svelte @@ -0,0 +1,35 @@ + + + { + console.log("change", e.detail); + }} +> + {#each steps as step} + + {/each} + diff --git a/tests/ProgressIndicator/ProgressIndicator.test.ts b/tests/ProgressIndicator/ProgressIndicator.test.ts new file mode 100644 index 00000000..649d37cb --- /dev/null +++ b/tests/ProgressIndicator/ProgressIndicator.test.ts @@ -0,0 +1,247 @@ +import { render, screen } from "@testing-library/svelte"; +import ProgressIndicator from "./ProgressIndicator.test.svelte"; +import { user } from "../setup-tests"; + +describe("ProgressIndicator", () => { + describe("Default (horizontal)", () => { + it("should render steps with correct states", () => { + render(ProgressIndicator, { + currentIndex: 2, + steps: [ + { label: "Step 1", description: "First step", complete: true }, + { label: "Step 2", description: "Second step", complete: true }, + { label: "Step 3", description: "Third step", complete: true }, + { label: "Step 4", description: "Fourth step", complete: false }, + ], + }); + + const listItems = screen.getAllByRole("listitem"); + + // Check if all steps are rendered + expect(listItems).toHaveLength(4); + + // Check completed steps + const completedSteps = listItems.filter((step) => + step.classList.contains("bx--progress-step--complete"), + ); + expect(completedSteps).toHaveLength(3); + + // Check current step + expect(listItems[2]).toHaveTextContent("Step 3"); + + // Check incomplete step + const incompleteStep = screen.getByText("Step 4"); + expect(incompleteStep).toBeInTheDocument(); + expect(incompleteStep.closest("li")).not.toHaveClass( + "bx--progress-step--complete", + ); + }); + + it("should update currentIndex when clicking on completed steps", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(ProgressIndicator, { + currentIndex: 2, + steps: [ + { label: "Step 1", description: "First step", complete: true }, + { label: "Step 2", description: "Second step", complete: true }, + { label: "Step 3", description: "Third step", complete: true }, + { label: "Step 4", description: "Fourth step", complete: false }, + ], + }); + + expect(consoleLog).not.toHaveBeenCalled(); + + // Click on a completed step + await user.click(screen.getByText("Step 1")); + expect(consoleLog).toHaveBeenCalledWith("change", 0); + }); + + it("should not update currentIndex when preventChangeOnClick is true", async () => { + const { component } = render(ProgressIndicator, { + currentIndex: 2, + preventChangeOnClick: true, + steps: [ + { label: "Step 1", description: "First step", complete: true }, + { label: "Step 2", description: "Second step", complete: true }, + { label: "Step 3", description: "Third step", complete: true }, + { label: "Step 4", description: "Fourth step", complete: false }, + ], + }); + + const changeHandler = vi.fn(); + component.$on("change", changeHandler); + + // Click on a completed step + await user.click(screen.getByText("Step 1")); + expect(changeHandler).not.toHaveBeenCalled(); + }); + }); + + describe("Invalid and disabled states", () => { + it("should render invalid step", () => { + render(ProgressIndicator, { + steps: [ + { label: "Step 1", description: "First step", complete: true }, + { + label: "Step 2", + description: "Second step", + complete: false, + invalid: true, + disabled: false, + }, + { label: "Step 3", description: "Third step", complete: false }, + ], + }); + + const invalidStep = screen.getByText("Step 2").closest("li"); + expect(invalidStep).toHaveClass("bx--progress-step--incomplete"); + }); + + it("should render disabled steps", () => { + render(ProgressIndicator, { + steps: [ + { label: "Step 1", description: "First step", complete: true }, + { + label: "Step 2", + description: "Second step", + complete: false, + invalid: false, + disabled: true, + }, + { + label: "Step 3", + description: "Third step", + complete: false, + invalid: false, + disabled: true, + }, + ], + }); + + const disabledSteps = screen.getAllByRole("listitem").slice(1); + disabledSteps.forEach((step) => { + expect(step).toHaveClass("bx--progress-step--disabled"); + }); + }); + }); + + describe("Variants", () => { + it("should render vertical variant", () => { + render(ProgressIndicator, { + vertical: true, + steps: [ + { label: "Step 1", description: "First step", complete: false }, + { label: "Step 2", description: "Second step", complete: false }, + { label: "Step 3", description: "Third step", complete: false }, + ], + }); + + const progressIndicator = screen.getByRole("list"); + expect(progressIndicator).toHaveClass("bx--progress--vertical"); + }); + + it("should render with equal spacing", () => { + render(ProgressIndicator, { + spaceEqually: true, + steps: [ + { label: "Step 1", description: "First step", complete: false }, + { label: "Step 2", description: "Second step", complete: false }, + { label: "Step 3", description: "Third step", complete: false }, + ], + }); + + const progressIndicator = screen.getByRole("list"); + expect(progressIndicator).toHaveClass("bx--progress--space-equal"); + }); + + it("should not apply equal spacing in vertical variant", () => { + render(ProgressIndicator, { + vertical: true, + spaceEqually: true, + steps: [ + { label: "Step 1", description: "First step", complete: false }, + { label: "Step 2", description: "Second step", complete: false }, + { label: "Step 3", description: "Third step", complete: false }, + ], + }); + + const progressIndicator = screen.getByRole("list"); + expect(progressIndicator).not.toHaveClass("bx--progress--space-equal"); + }); + }); + + describe("Accessibility", () => { + it("should have correct button attributes for different states", () => { + render(ProgressIndicator, { + currentIndex: 1, + steps: [ + { label: "Step 1", description: "First step", complete: true }, + { label: "Step 2", description: "Second step", complete: false }, + { label: "Step 3", description: "Third step", complete: false }, + ], + }); + + const buttons = screen.getAllByRole("button"); + + // Complete step button should be clickable + expect(buttons[0]).toHaveAttribute("tabindex", "0"); + expect(buttons[0]).toHaveAttribute("aria-disabled", "false"); + expect(buttons[0]).not.toHaveClass( + "bx--progress-step-button--unclickable", + ); + + // Current step button should be unclickable + expect(buttons[1]).toHaveAttribute("tabindex", "-1"); + expect(buttons[1]).toHaveAttribute("aria-disabled", "false"); + expect(buttons[1]).toHaveClass("bx--progress-step-button--unclickable"); + + // Incomplete step button should be unclickable + expect(buttons[2]).toHaveAttribute("tabindex", "0"); + expect(buttons[2]).toHaveAttribute("aria-disabled", "false"); + expect(buttons[2]).not.toHaveClass( + "bx--progress-step-button--unclickable", + ); + }); + + it("should have correct button attributes for disabled state", () => { + render(ProgressIndicator, { + steps: [ + { label: "Step 1", description: "First step", complete: true }, + { + label: "Step 2", + description: "Second step", + complete: false, + disabled: true, + }, + ], + }); + + const disabledButton = screen.getAllByRole("button")[1]; + expect(disabledButton).toHaveAttribute("disabled"); + expect(disabledButton).toHaveAttribute("aria-disabled", "true"); + expect(disabledButton).toHaveAttribute("tabindex", "-1"); + }); + + it("should support keyboard navigation for complete steps", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(ProgressIndicator, { + currentIndex: 1, + steps: [ + { label: "Step 1", description: "First step", complete: true }, + { label: "Step 2", description: "Second step", complete: false }, + ], + }); + + expect(consoleLog).not.toHaveBeenCalled(); + const completeStepButton = screen.getAllByRole("button")[0]; + await user.tab(); + expect(completeStepButton).toHaveFocus(); + + await user.keyboard("{Enter}"); + expect(consoleLog).toHaveBeenCalledWith("change", 0); + + await user.keyboard(" "); + expect(consoleLog).toHaveBeenCalledWith("change", 0); + }); + }); +}); From d45409c7f3245565c117b290718534e828fd164e Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 20 Mar 2025 17:19:33 -0700 Subject: [PATCH 051/211] test(grid): add unit tests --- tests/FullWidthGrid.test.svelte | 12 --- tests/Grid.test.svelte | 12 --- tests/Grid/Grid.test.svelte | 44 ++++++++++ tests/Grid/Grid.test.ts | 137 ++++++++++++++++++++++++++++++++ tests/NarrowGrid.test.svelte | 12 --- 5 files changed, 181 insertions(+), 36 deletions(-) delete mode 100644 tests/FullWidthGrid.test.svelte delete mode 100644 tests/Grid.test.svelte create mode 100644 tests/Grid/Grid.test.svelte create mode 100644 tests/Grid/Grid.test.ts delete mode 100644 tests/NarrowGrid.test.svelte diff --git a/tests/FullWidthGrid.test.svelte b/tests/FullWidthGrid.test.svelte deleted file mode 100644 index 40157f83..00000000 --- a/tests/FullWidthGrid.test.svelte +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Column - Column - Column - Column - - diff --git a/tests/Grid.test.svelte b/tests/Grid.test.svelte deleted file mode 100644 index b6a74224..00000000 --- a/tests/Grid.test.svelte +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Column - Column - Column - Column - - diff --git a/tests/Grid/Grid.test.svelte b/tests/Grid/Grid.test.svelte new file mode 100644 index 00000000..96cf0199 --- /dev/null +++ b/tests/Grid/Grid.test.svelte @@ -0,0 +1,44 @@ + + +{#if as} + +
+ +
+
+{:else} + + + +{/if} diff --git a/tests/Grid/Grid.test.ts b/tests/Grid/Grid.test.ts new file mode 100644 index 00000000..e9d7be1c --- /dev/null +++ b/tests/Grid/Grid.test.ts @@ -0,0 +1,137 @@ +import { render } from "@testing-library/svelte"; +import Grid from "./Grid.test.svelte"; + +describe("Grid", () => { + describe("Default", () => { + it("should render as a div by default", () => { + const { container } = render(Grid); + const grid = container.querySelector("div.bx--grid"); + expect(grid).toHaveClass("bx--grid"); + }); + + it("should support rest props", () => { + const { container } = render(Grid, { + props: { + "data-testid": "custom-grid", + "aria-label": "Grid layout", + }, + }); + const grid = container.querySelector("[data-testid='custom-grid']"); + expect(grid).toHaveClass("bx--grid"); + expect(grid).toHaveAttribute("aria-label", "Grid layout"); + }); + }); + + it("should render condensed variant", () => { + const { container } = render(Grid, { + props: { condensed: true }, + }); + const grid = container.querySelector("div.bx--grid"); + expect(grid).toHaveClass("bx--grid--condensed"); + }); + + it("should render narrow variant", () => { + const { container } = render(Grid, { + props: { narrow: true }, + }); + const grid = container.querySelector("div.bx--grid"); + expect(grid).toHaveClass("bx--grid--narrow"); + }); + + it("should render full width variant", () => { + const { container } = render(Grid, { + props: { fullWidth: true }, + }); + const grid = container.querySelector("div.bx--grid"); + expect(grid).toHaveClass("bx--grid--full-width"); + }); + + it("should render with no gutter", () => { + const { container } = render(Grid, { + props: { noGutter: true }, + }); + const grid = container.querySelector("div.bx--grid"); + expect(grid).toHaveClass("bx--no-gutter"); + }); + + it("should render with no left gutter", () => { + const { container } = render(Grid, { + props: { noGutterLeft: true }, + }); + const grid = container.querySelector("div.bx--grid"); + expect(grid).toHaveClass("bx--no-gutter--left"); + }); + + it("should render with no right gutter", () => { + const { container } = render(Grid, { + props: { + noGutterRight: true, + }, + }); + const grid = container.querySelector("div.bx--grid"); + expect(grid).toHaveClass("bx--no-gutter--right"); + }); + + it("should render with row padding", () => { + const { container } = render(Grid, { + props: { + padding: true, + }, + }); + const grid = container.querySelector("div.bx--grid"); + expect(grid).toHaveClass("bx--row-padding"); + }); + + it("should render as a custom element using the as prop", () => { + const { container } = render(Grid, { props: { as: true } }); + + const header = container.querySelector("header"); + expect(header).toHaveClass("bx--grid"); + }); + + it("should pass all variant classes and rest props to custom element", () => { + const { container } = render(Grid, { + props: { + as: true, + condensed: true, + narrow: true, + fullWidth: true, + noGutter: true, + padding: true, + "data-testid": "custom-header", + "aria-label": "Custom header grid", + }, + }); + const header = container.querySelector("[data-testid='custom-header']"); + expect(header).toHaveClass( + "bx--grid", + "bx--grid--condensed", + "bx--grid--narrow", + "bx--grid--full-width", + "bx--no-gutter", + "bx--row-padding", + ); + expect(header).toHaveAttribute("aria-label", "Custom header grid"); + }); + + it("should combine multiple variant classes", () => { + const { container } = render(Grid, { + props: { + condensed: true, + narrow: true, + noGutterLeft: true, + noGutterRight: true, + padding: true, + }, + }); + const grid = container.querySelector("div.bx--grid"); + expect(grid).toHaveClass( + "bx--grid", + "bx--grid--condensed", + "bx--grid--narrow", + "bx--no-gutter--left", + "bx--no-gutter--right", + "bx--row-padding", + ); + }); +}); diff --git a/tests/NarrowGrid.test.svelte b/tests/NarrowGrid.test.svelte deleted file mode 100644 index ff498960..00000000 --- a/tests/NarrowGrid.test.svelte +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Column - Column - Column - Column - - From 95f6c97a57594222767e7e4ec7783d252fe54644 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 20 Mar 2025 17:08:13 -0700 Subject: [PATCH 052/211] test: remove old files --- tests/CopyableCodeSnippet.test.svelte | 8 ---- tests/DynamicCodeSnippet.test.svelte | 10 ----- tests/FilterableComboBox.test.svelte | 19 ---------- tests/InlineLoadingUx.test.svelte | 54 --------------------------- 4 files changed, 91 deletions(-) delete mode 100644 tests/CopyableCodeSnippet.test.svelte delete mode 100644 tests/DynamicCodeSnippet.test.svelte delete mode 100644 tests/FilterableComboBox.test.svelte delete mode 100644 tests/InlineLoadingUx.test.svelte diff --git a/tests/CopyableCodeSnippet.test.svelte b/tests/CopyableCodeSnippet.test.svelte deleted file mode 100644 index b22b0eb6..00000000 --- a/tests/CopyableCodeSnippet.test.svelte +++ /dev/null @@ -1,8 +0,0 @@ - - - copy(code)}>{code} diff --git a/tests/DynamicCodeSnippet.test.svelte b/tests/DynamicCodeSnippet.test.svelte deleted file mode 100644 index 9c7ff1db..00000000 --- a/tests/DynamicCodeSnippet.test.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/tests/FilterableComboBox.test.svelte b/tests/FilterableComboBox.test.svelte deleted file mode 100644 index d4e216b3..00000000 --- a/tests/FilterableComboBox.test.svelte +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/tests/InlineLoadingUx.test.svelte b/tests/InlineLoadingUx.test.svelte deleted file mode 100644 index 85ee8031..00000000 --- a/tests/InlineLoadingUx.test.svelte +++ /dev/null @@ -1,54 +0,0 @@ - - - - - {#if state !== "dormant"} - - {:else} - - {/if} - From c6c80d35a90bf8b41b6c18932b6a26f6448e0cb8 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 20 Mar 2025 17:20:53 -0700 Subject: [PATCH 053/211] test: remove CSS import from set-up file --- tests/setup-tests.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/setup-tests.ts b/tests/setup-tests.ts index 8f22aad9..9b36ceec 100644 --- a/tests/setup-tests.ts +++ b/tests/setup-tests.ts @@ -1,7 +1,6 @@ /// import "@testing-library/jest-dom/vitest"; import { userEvent } from "@testing-library/user-event"; -import "../css/all.css"; // Mock scrollIntoView since it's not implemented in JSDOM Element.prototype.scrollIntoView = vi.fn(); From dd1338ffc47926a13e231d4a0f724e923f2219e2 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sat, 22 Mar 2025 12:59:16 -0700 Subject: [PATCH 054/211] fix(list-box-selection): fix `aria-label` for clear button (#2134) `ListBoxSelection`, used by `MultiSelect` and `ComboBox`, currently applies the wrong `aria-label` for the clear selection button. It uses the `translateId` (e.g., `"clearAll"`) instead of the user-friendly copy. --- src/ListBox/ListBoxSelection.svelte | 6 ++++-- tests/ComboBox/ComboBox.test.ts | 10 ++++++++++ tests/MultiSelect/MultiSelect.test.ts | 5 ++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/ListBox/ListBoxSelection.svelte b/src/ListBox/ListBoxSelection.svelte index beb800d8..f4192015 100644 --- a/src/ListBox/ListBoxSelection.svelte +++ b/src/ListBox/ListBoxSelection.svelte @@ -48,7 +48,9 @@ $: translationId = selectionCount ? translationIds.clearAll : translationIds.clearSelection; - + $: buttonLabel = + translateWithId?.(translationIds.clearAll) ?? + defaultTranslations[translationIds.clearAll]; $: description = translateWithId?.(translationId) ?? defaultTranslations[translationId]; @@ -79,7 +81,7 @@ } }} {disabled} - aria-label={translationIds.clearAll} + aria-label={buttonLabel} title={description} > diff --git a/tests/ComboBox/ComboBox.test.ts b/tests/ComboBox/ComboBox.test.ts index 2ac7534f..f14fd581 100644 --- a/tests/ComboBox/ComboBox.test.ts +++ b/tests/ComboBox/ComboBox.test.ts @@ -193,6 +193,16 @@ describe("ComboBox", () => { expect(screen.getByRole("listbox")).toHaveClass("bx--list-box--up"); }); + it("should clear filter on selection clear", async () => { + render(ComboBoxCustom, { props: { selectedId: "1" } }); + + const clearButton = screen.getByLabelText("Clear selected item"); + await user.click(clearButton); + + const input = screen.getByRole("textbox"); + expect(input).toHaveValue(""); + }); + it("should programmatically clear selection", async () => { render(ComboBoxCustom, { props: { selectedId: "1" } }); diff --git a/tests/MultiSelect/MultiSelect.test.ts b/tests/MultiSelect/MultiSelect.test.ts index 7d2b8fae..cfd668e6 100644 --- a/tests/MultiSelect/MultiSelect.test.ts +++ b/tests/MultiSelect/MultiSelect.test.ts @@ -166,15 +166,14 @@ describe("MultiSelect", () => { expect(screen.queryByText("Fax")).not.toBeInTheDocument(); }); - // TODO(bug): ListBoxSelection aria-labels should be user-friendly - it.skip("should clear filter on selection clear", async () => { + it("should clear filter on selection clear", async () => { render(MultiSelect, { items, filterable: true, selectedIds: ["0"], }); - const clearButton = screen.getByLabelText("Clear all"); + const clearButton = screen.getByLabelText("Clear all selected items"); await user.click(clearButton); const input = screen.getByRole("combobox"); From 1462e300d69f0cd7ee5476dfe3a7ea892ac8f4ad Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sat, 22 Mar 2025 13:02:28 -0700 Subject: [PATCH 055/211] fix(radio-button): forward `focus`, `blur` events (#2135) As identified in #2131, `focus` and `blur` events should be forwarded to the underlying `RadioButton` element. --- COMPONENT_INDEX.md | 2 ++ docs/src/COMPONENT_API.json | 10 ++++++++++ src/RadioButton/RadioButton.svelte | 2 ++ tests/RadioButton/RadioButton.test.svelte | 6 ++++++ tests/RadioButton/RadioButton.test.ts | 3 +-- types/RadioButton/RadioButton.svelte.d.ts | 6 +++++- 6 files changed, 26 insertions(+), 3 deletions(-) diff --git a/COMPONENT_INDEX.md b/COMPONENT_INDEX.md index 9a14e927..be19a1ca 100644 --- a/COMPONENT_INDEX.md +++ b/COMPONENT_INDEX.md @@ -2966,6 +2966,8 @@ None. | Event name | Type | Detail | | :--------- | :-------- | :----- | +| focus | forwarded | -- | +| blur | forwarded | -- | | change | forwarded | -- | ## `RadioButtonGroup` diff --git a/docs/src/COMPONENT_API.json b/docs/src/COMPONENT_API.json index d1115787..e4826601 100644 --- a/docs/src/COMPONENT_API.json +++ b/docs/src/COMPONENT_API.json @@ -11389,6 +11389,16 @@ } ], "events": [ + { + "type": "forwarded", + "name": "focus", + "element": "input" + }, + { + "type": "forwarded", + "name": "blur", + "element": "input" + }, { "type": "forwarded", "name": "change", diff --git a/src/RadioButton/RadioButton.svelte b/src/RadioButton/RadioButton.svelte index 6fecf17e..3ce9aa22 100644 --- a/src/RadioButton/RadioButton.svelte +++ b/src/RadioButton/RadioButton.svelte @@ -71,6 +71,8 @@ required={$groupRequired ?? required} {value} class:bx--radio-button={true} + on:focus + on:blur on:change on:change={() => { if (update) { diff --git a/tests/RadioButton/RadioButton.test.svelte b/tests/RadioButton/RadioButton.test.svelte index 166c4b42..59282887 100644 --- a/tests/RadioButton/RadioButton.test.svelte +++ b/tests/RadioButton/RadioButton.test.svelte @@ -26,6 +26,12 @@ {id} {name} {ref} + on:focus={() => { + console.log("focus"); + }} + on:blur={() => { + console.log("blur"); + }} on:change={() => { console.log("change"); }} diff --git a/tests/RadioButton/RadioButton.test.ts b/tests/RadioButton/RadioButton.test.ts index 6103c8d8..3b321c57 100644 --- a/tests/RadioButton/RadioButton.test.ts +++ b/tests/RadioButton/RadioButton.test.ts @@ -91,8 +91,7 @@ describe("RadioButton", () => { expect(consoleLog).toHaveBeenCalledWith("change"); }); - // TODO(bug): forward focus/blur events. - it.skip("should handle focus and blur events", async () => { + it("should handle focus and blur events", async () => { const consoleLog = vi.spyOn(console, "log"); render(RadioButton); diff --git a/types/RadioButton/RadioButton.svelte.d.ts b/types/RadioButton/RadioButton.svelte.d.ts index bc2e94d3..6933bef7 100644 --- a/types/RadioButton/RadioButton.svelte.d.ts +++ b/types/RadioButton/RadioButton.svelte.d.ts @@ -71,6 +71,10 @@ export type RadioButtonProps = Omit<$RestProps, keyof $Props> & $Props; export default class RadioButton extends SvelteComponentTyped< RadioButtonProps, - { change: WindowEventMap["change"] }, + { + focus: WindowEventMap["focus"]; + blur: WindowEventMap["blur"]; + change: WindowEventMap["change"]; + }, { labelText: {} } > {} From ca9beebaeac7eaed8079c010a86a78926b00147f Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sat, 22 Mar 2025 13:03:20 -0700 Subject: [PATCH 056/211] fix(radio-tile): allow standalone `RadioTile` usage (#2136) Although `RadioTile` is meant to be used inside a `TileGroup`, it feels unpolished for standalone usage to crash due to a missing parent context. This fixes `RadioTile` to fail open by providing a no-op `add: () => {}` when `TileGroup` context is not found. --- src/Tile/RadioTile.svelte | 1 + tests/RadioTile/RadioTile.test.ts | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Tile/RadioTile.svelte b/src/Tile/RadioTile.svelte index 5e960c89..8ded1870 100644 --- a/src/Tile/RadioTile.svelte +++ b/src/Tile/RadioTile.svelte @@ -36,6 +36,7 @@ const { add, update, selectedValue, groupName, groupRequired } = getContext( "TileGroup", ) ?? { + add: () => {}, groupName: readable(undefined), groupRequired: readable(undefined), selectedValue: readable(checked ? value : undefined), diff --git a/tests/RadioTile/RadioTile.test.ts b/tests/RadioTile/RadioTile.test.ts index 351c01dc..9697654a 100644 --- a/tests/RadioTile/RadioTile.test.ts +++ b/tests/RadioTile/RadioTile.test.ts @@ -94,8 +94,7 @@ describe("RadioTile", () => { expect(radioTileLabel).toHaveAttribute("for", "custom-id"); }); - // TODO(bug): support standalone radio tile. - it.skip("should handle custom name", () => { + it("should handle custom name", () => { render(RadioTileSingle); expect(screen.getByRole("radio")).toHaveAttribute("name", "custom-name"); From 43511e09ecf312c1b8e9339856b9d7d0785036de Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sat, 22 Mar 2025 13:03:52 -0700 Subject: [PATCH 057/211] fix(text-area): allow visually hidden label (#2137) This fixes an accessibility issue with `TextArea`. Currently, if `hideLabel` is `true`, the label is not rendered at all. The expected behavior is that it should be visually hidden while still being available to screen readers. --- src/TextArea/TextArea.svelte | 2 +- tests/TextArea/TextArea.test.ts | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/TextArea/TextArea.svelte b/src/TextArea/TextArea.svelte index 5c54aeb5..77f39419 100644 --- a/src/TextArea/TextArea.svelte +++ b/src/TextArea/TextArea.svelte @@ -71,7 +71,7 @@ on:mouseleave class:bx--form-item={true} > - {#if (labelText || $$slots.labelText) && !hideLabel} + {#if labelText || $$slots.labelText}