diff --git a/sources/vonage_video_react_app-feature-config/.astro/content-modules.mjs b/sources/vonage_video_react_app-feature-config/.astro/content-modules.mjs index 1d922d92..4773f6ec 100644 --- a/sources/vonage_video_react_app-feature-config/.astro/content-modules.mjs +++ b/sources/vonage_video_react_app-feature-config/.astro/content-modules.mjs @@ -1,11 +1,10 @@ export default new Map([ -["src/content/docs/index.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Findex.mdx&astroContentModuleFlag=true")], -["src/content/docs/reference.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Freference.mdoc&astroContentModuleFlag=true")], ["src/content/docs/01-backend-setup.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F01-backend-setup.mdoc&astroContentModuleFlag=true")], ["src/content/docs/01-config-file-overview.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F01-config-file-overview.mdoc&astroContentModuleFlag=true")], ["src/content/docs/02-feature-flags.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F02-feature-flags.mdoc&astroContentModuleFlag=true")], ["src/content/docs/03-display-defaults.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F03-display-defaults.mdoc&astroContentModuleFlag=true")], ["src/content/docs/04-apply-changes.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F04-apply-changes.mdoc&astroContentModuleFlag=true")], -["src/content/docs/05-whats-next.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F05-whats-next.mdoc&astroContentModuleFlag=true")]]); +["src/content/docs/05-whats-next.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F05-whats-next.mdoc&astroContentModuleFlag=true")], +["src/content/docs/index.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Findex.mdx&astroContentModuleFlag=true")]]); \ No newline at end of file diff --git a/sources/vonage_video_react_app-feature-config/.astro/data-store.json b/sources/vonage_video_react_app-feature-config/.astro/data-store.json index e8ac27a8..618653e2 100644 --- a/sources/vonage_video_react_app-feature-config/.astro/data-store.json +++ b/sources/vonage_video_react_app-feature-config/.astro/data-store.json @@ -1 +1 @@ -[["Map",1,2,9,10],"meta::meta",["Map",3,4,5,6,7,8],"astro-version","5.18.1","content-config-digest","a30a942a2ceda2e1","astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"compressHTML\":true,\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"static\",\"scopedStyleStrategy\":\"where\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":false,\"port\":4321,\"streaming\":true,\"allowedHosts\":[]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":false,\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[null,null,null],\"rehypePlugins\":[[null,{\"experimentalHeadingIdCompat\":false}],null,[null,{\"themes\":[{\"name\":\"Night Owl No Italics\",\"type\":\"dark\",\"colors\":{\"focusBorder\":\"#122d42\",\"foreground\":\"#d6deeb\",\"disabledForeground\":\"#cccccc80\",\"descriptionForeground\":\"#d6deebb3\",\"errorForeground\":\"#ef5350\",\"icon.foreground\":\"#c5c5c5\",\"contrastActiveBorder\":null,\"contrastBorder\":\"#122d42\",\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#4f4f4f\",\"textLink.activeForeground\":\"#3794ff\",\"textLink.foreground\":\"#3794ff\",\"textPreformat.foreground\":\"#d7ba7d\",\"textSeparator.foreground\":\"#ffffff2e\",\"editor.background\":\"#23262f\",\"editor.foreground\":\"#d6deeb\",\"editorLineNumber.foreground\":\"#4b6479\",\"editorLineNumber.activeForeground\":\"#c5e4fd\",\"editorActiveLineNumber.foreground\":\"#c6c6c6\",\"editor.selectionBackground\":\"#1d3b53\",\"editor.inactiveSelectionBackground\":\"#7e57c25a\",\"editor.selectionHighlightBackground\":\"#5f7e9779\",\"editorError.foreground\":\"#ef5350\",\"editorWarning.foreground\":\"#b39554\",\"editorInfo.foreground\":\"#3794ff\",\"editorHint.foreground\":\"#eeeeeeb2\",\"problemsErrorIcon.foreground\":\"#ef5350\",\"problemsWarningIcon.foreground\":\"#b39554\",\"problemsInfoIcon.foreground\":\"#3794ff\",\"editor.findMatchBackground\":\"#5f7e9779\",\"editor.findMatchHighlightBackground\":\"#1085bb5d\",\"editor.findRangeHighlightBackground\":\"#3a3d4166\",\"editorLink.activeForeground\":\"#4e94ce\",\"editorLightBulb.foreground\":\"#ffcc00\",\"editorLightBulbAutoFix.foreground\":\"#75beff\",\"diffEditor.insertedTextBackground\":\"#99b76d23\",\"diffEditor.insertedTextBorder\":\"#c5e47833\",\"diffEditor.removedTextBackground\":\"#ef535033\",\"diffEditor.removedTextBorder\":\"#ef53504d\",\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#011627\",\"editorStickyScrollHover.background\":\"#2a2d2e\",\"editorInlayHint.background\":\"#5f7e97cc\",\"editorInlayHint.foreground\":\"#ffffff\",\"editorInlayHint.typeBackground\":\"#5f7e97cc\",\"editorInlayHint.typeForeground\":\"#ffffff\",\"editorInlayHint.parameterBackground\":\"#5f7e97cc\",\"editorInlayHint.parameterForeground\":\"#ffffff\",\"editorPane.background\":\"#011627\",\"editorGroup.emptyBackground\":\"#011627\",\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-black)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#011627\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#011627\",\"editorGroup.dropBackground\":\"#7e57c273\",\"editorGroup.dropIntoPromptForeground\":\"#d6deeb\",\"editorGroup.dropIntoPromptBackground\":\"#021320\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#011627\",\"sideBySideEditor.verticalBorder\":\"#011627\",\"scrollbar.shadow\":\"#010b14\",\"scrollbarSlider.background\":\"#ffffff17\",\"scrollbarSlider.hoverBackground\":\"#ffffff40\",\"scrollbarSlider.activeBackground\":\"#084d8180\",\"panel.background\":\"#011627\",\"panel.border\":\"#5f7e97\",\"panelTitle.activeBorder\":\"#5f7e97\",\"panelTitle.activeForeground\":\"#ffffffcc\",\"panelTitle.inactiveForeground\":\"#d6deeb80\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#011627\",\"widget.shadow\":\"#011627\",\"editorWidget.background\":\"#021320\",\"editorWidget.foreground\":\"#d6deeb\",\"editorWidget.border\":\"#5f7e97\",\"quickInput.background\":\"#021320\",\"quickInput.foreground\":\"#d6deeb\",\"quickInputTitle.background\":\"#ffffff1a\",\"pickerGroup.foreground\":\"#d1aaff\",\"pickerGroup.border\":\"#011627\",\"editor.hoverHighlightBackground\":\"#7e57c25a\",\"editorHoverWidget.background\":\"#011627\",\"editorHoverWidget.foreground\":\"#d6deeb\",\"editorHoverWidget.border\":\"#5f7e97\",\"editorHoverWidget.statusBarBackground\":\"#011a2f\",\"titleBar.activeBackground\":\"var(--sl-color-black)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#010e1a\",\"titleBar.inactiveForeground\":\"#eeefff99\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#5a5d5e50\",\"toolbar.activeBackground\":\"#63666750\",\"tab.activeBackground\":\"#0b2942\",\"tab.unfocusedActiveBackground\":\"#0b2942\",\"tab.inactiveBackground\":\"#01111d\",\"tab.unfocusedInactiveBackground\":\"#01111d\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#5f7e97\",\"tab.unfocusedActiveForeground\":\"#5f7e97\",\"tab.unfocusedInactiveForeground\":\"#5f7e97\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#272b3b\",\"tab.lastPinnedBorder\":\"#585858\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":\"#262a39\",\"tab.activeBorderTop\":\"var(--sl-color-accent-high)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#3399cc\",\"tab.inactiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedActiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedInactiveModifiedBorder\":\"#3399cc40\",\"badge.background\":\"#5f7e97\",\"badge.foreground\":\"#ffffff\",\"button.background\":\"#7e57c2cc\",\"button.foreground\":\"#ffffffcc\",\"button.border\":\"#122d42\",\"button.separator\":\"#ffffff52\",\"button.hoverBackground\":\"#7e57c2\",\"button.secondaryBackground\":\"#3a3d41\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#46494e\",\"dropdown.background\":\"#011627\",\"dropdown.foreground\":\"#ffffffcc\",\"dropdown.border\":\"#5f7e97\",\"list.activeSelectionBackground\":\"#234d708c\",\"list.activeSelectionForeground\":\"#ffffff\",\"tree.indentGuidesStroke\":\"#585858\",\"input.background\":\"#0b253a\",\"input.foreground\":\"#ffffffcc\",\"input.placeholderForeground\":\"#5f7e97\",\"inputOption.activeBorder\":\"#ffffffcc\",\"inputOption.hoverBackground\":\"#5a5d5e80\",\"inputOption.activeBackground\":\"#122d4266\",\"inputOption.activeForeground\":\"#ffffff\",\"inputValidation.infoBackground\":\"#00589ef2\",\"inputValidation.infoBorder\":\"#64b5f6\",\"inputValidation.warningBackground\":\"#675700f2\",\"inputValidation.warningBorder\":\"#ffca28\",\"inputValidation.errorBackground\":\"#ab0300f2\",\"inputValidation.errorBorder\":\"#ef5350\",\"keybindingLabel.background\":\"#8080802b\",\"keybindingLabel.foreground\":\"#cccccc\",\"keybindingLabel.border\":\"#33333399\",\"keybindingLabel.bottomBorder\":\"#44444499\",\"menu.foreground\":\"#ffffffcc\",\"menu.background\":\"#011627\",\"menu.selectionForeground\":\"#ffffff\",\"menu.selectionBackground\":\"#234d708c\",\"menu.separatorBackground\":\"#606060\",\"editor.snippetTabstopHighlightBackground\":\"#7c7c74c\",\"editor.snippetFinalTabstopHighlightBorder\":\"#525252\",\"terminal.ansiBlack\":\"#011627\",\"terminal.ansiRed\":\"#ef5350\",\"terminal.ansiGreen\":\"#22da6e\",\"terminal.ansiYellow\":\"#c5e478\",\"terminal.ansiBlue\":\"#82aaff\",\"terminal.ansiMagenta\":\"#c792ea\",\"terminal.ansiCyan\":\"#21c7a8\",\"terminal.ansiWhite\":\"#ffffff\",\"terminal.ansiBrightBlack\":\"#575656\",\"terminal.ansiBrightRed\":\"#ef5350\",\"terminal.ansiBrightGreen\":\"#22da6e\",\"terminal.ansiBrightYellow\":\"#ffeb95\",\"terminal.ansiBrightBlue\":\"#82aaff\",\"terminal.ansiBrightMagenta\":\"#c792ea\",\"terminal.ansiBrightCyan\":\"#7fdbca\",\"terminal.ansiBrightWhite\":\"#ffffff\",\"selection.background\":\"#4373c2\",\"input.border\":\"#5f7e97\",\"punctuation.definition.generic.begin.html\":\"#ef5350f2\",\"progress.background\":\"#7e57c2\",\"breadcrumb.foreground\":\"#a599e9\",\"breadcrumb.focusForeground\":\"#ffffff\",\"breadcrumb.activeSelectionForeground\":\"#ffffff\",\"breadcrumbPicker.background\":\"#001122\",\"list.invalidItemForeground\":\"#975f94\",\"list.dropBackground\":\"#011627\",\"list.focusBackground\":\"#010d18\",\"list.focusForeground\":\"#ffffff\",\"list.highlightForeground\":\"#ffffff\",\"list.hoverBackground\":\"#011627\",\"list.hoverForeground\":\"#ffffff\",\"list.inactiveSelectionBackground\":\"#0e293f\",\"list.inactiveSelectionForeground\":\"#5f7e97\",\"activityBar.background\":\"#011627\",\"activityBar.dropBackground\":\"#5f7e97\",\"activityBar.foreground\":\"#5f7e97\",\"activityBar.border\":\"#011627\",\"activityBarBadge.background\":\"#44596b\",\"activityBarBadge.foreground\":\"#ffffff\",\"sideBar.background\":\"#011627\",\"sideBar.foreground\":\"#89a4bb\",\"sideBar.border\":\"#011627\",\"sideBarTitle.foreground\":\"#5f7e97\",\"sideBarSectionHeader.background\":\"#011627\",\"sideBarSectionHeader.foreground\":\"#5f7e97\",\"editorCursor.foreground\":\"#80a4c2\",\"editor.wordHighlightBackground\":\"#f6bbe533\",\"editor.wordHighlightStrongBackground\":\"#e2a2f433\",\"editor.lineHighlightBackground\":\"#0003\",\"editor.rangeHighlightBackground\":\"#7e57c25a\",\"editorIndentGuide.background\":\"#5e81ce52\",\"editorIndentGuide.activeBackground\":\"#7e97ac\",\"editorRuler.foreground\":\"#5e81ce52\",\"editorCodeLens.foreground\":\"#5e82ceb4\",\"editorBracketMatch.background\":\"#5f7e974d\",\"editorOverviewRuler.currentContentForeground\":\"#7e57c2\",\"editorOverviewRuler.incomingContentForeground\":\"#7e57c2\",\"editorOverviewRuler.commonContentForeground\":\"#7e57c2\",\"editorGutter.background\":\"#011627\",\"editorGutter.modifiedBackground\":\"#e2b93d\",\"editorGutter.addedBackground\":\"#9ccc65\",\"editorGutter.deletedBackground\":\"#ef5350\",\"editorSuggestWidget.background\":\"#2c3043\",\"editorSuggestWidget.border\":\"#2b2f40\",\"editorSuggestWidget.foreground\":\"#d6deeb\",\"editorSuggestWidget.highlightForeground\":\"#ffffff\",\"editorSuggestWidget.selectedBackground\":\"#5f7e97\",\"debugExceptionWidget.background\":\"#011627\",\"debugExceptionWidget.border\":\"#5f7e97\",\"editorMarkerNavigation.background\":\"#0b2942\",\"editorMarkerNavigationError.background\":\"#ef5350\",\"editorMarkerNavigationWarning.background\":\"#ffca28\",\"peekView.border\":\"#5f7e97\",\"peekViewEditor.background\":\"#011627\",\"peekViewEditor.matchHighlightBackground\":\"#7e57c25a\",\"peekViewResult.background\":\"#011627\",\"peekViewResult.fileForeground\":\"#5f7e97\",\"peekViewResult.lineForeground\":\"#5f7e97\",\"peekViewResult.matchHighlightBackground\":\"#ffffffcc\",\"peekViewResult.selectionBackground\":\"#2e3250\",\"peekViewResult.selectionForeground\":\"#5f7e97\",\"peekViewTitle.background\":\"#011627\",\"peekViewTitleDescription.foreground\":\"#697098\",\"peekViewTitleLabel.foreground\":\"#5f7e97\",\"merge.currentHeaderBackground\":\"#5f7e97\",\"merge.incomingHeaderBackground\":\"#7e57c25a\",\"statusBar.background\":\"#011627\",\"statusBar.foreground\":\"#5f7e97\",\"statusBar.border\":\"#262a39\",\"statusBar.debuggingBackground\":\"#202431\",\"statusBar.debuggingBorder\":\"#1f2330\",\"statusBar.noFolderBackground\":\"#011627\",\"statusBar.noFolderBorder\":\"#25293a\",\"statusBarItem.activeBackground\":\"#202431\",\"statusBarItem.hoverBackground\":\"#202431\",\"statusBarItem.prominentBackground\":\"#202431\",\"statusBarItem.prominentHoverBackground\":\"#202431\",\"notifications.background\":\"#01111d\",\"notifications.border\":\"#262a39\",\"notificationCenter.border\":\"#262a39\",\"notificationToast.border\":\"#262a39\",\"notifications.foreground\":\"#ffffffcc\",\"notificationLink.foreground\":\"#80cbc4\",\"extensionButton.prominentForeground\":\"#ffffffcc\",\"extensionButton.prominentBackground\":\"#7e57c2cc\",\"extensionButton.prominentHoverBackground\":\"#7e57c2\",\"terminal.selectionBackground\":\"#1b90dd4d\",\"terminalCursor.background\":\"#234d70\",\"debugToolBar.background\":\"#011627\",\"welcomePage.buttonBackground\":\"#011627\",\"welcomePage.buttonHoverBackground\":\"#011627\",\"walkThrough.embeddedEditorBackground\":\"#011627\",\"gitDecoration.modifiedResourceForeground\":\"#a2bffc\",\"gitDecoration.deletedResourceForeground\":\"#ef535090\",\"gitDecoration.untrackedResourceForeground\":\"#c5e478ff\",\"gitDecoration.ignoredResourceForeground\":\"#395a75\",\"gitDecoration.conflictingResourceForeground\":\"#ffeb95cc\",\"source.elm\":\"#5f7e97\",\"string.quoted.single.js\":\"#ffffff\",\"meta.objectliteral.js\":\"#82aaff\"},\"fg\":\"#d6deeb\",\"bg\":\"#23262f\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#a2bffc\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#f27775fe\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#d6deeb\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#919f9f\",\"fontStyle\":\"\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#5ca7e4\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#caece6\",\"fontStyle\":\"\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"fontStyle\":\"\",\"foreground\":\"#c5e478\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"background\":\"#ff2c83\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#d3423e\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#919f9f\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#cdebf7\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#ffffff\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#80cbc4\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#57eaf1\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#fad430\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#faf39f\",\"fontStyle\":\"\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#82aaff\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Comparison, returns, imports, and Keyword Operator Ruby\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#989da0\",\"background\":\"#F78C6C\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"background\":\"#8BD649\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#ec5f67\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#ef787f\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#31e1eb\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Unquoted String Zone\",\"scope\":[\"string.unquoted.preprocessor.message.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Region\",\"scope\":[\"punctuation.separator.hash.cs\",\"keyword.preprocessor.region.cs\",\"keyword.preprocessor.endregion.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"bold\"}},{\"name\":\"C# Other Variables\",\"scope\":[\"variable.other.object.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Enum\",\"scope\":[\"entity.name.type.enum.cs\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Dart String\",\"scope\":[\"string.interpolated.single.dart\",\"string.interpolated.double.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Dart Class\",\"scope\":[\"support.class.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#ff6d6d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#dddddd\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#e0dec6\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#6ae9f0\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#78ccf0\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#8b96ea\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#c789d6\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#ff869a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#d6deeb\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#8eace3\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#d7dbe0\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-6)\",\"terminalBackground\":\"var(--sl-color-gray-6)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-6)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#ffffff17\",\"markBorderColor\":\"#ffffff40\"}}},{\"name\":\"Night Owl Light\",\"type\":\"light\",\"colors\":{\"focusBorder\":\"#93a1a1\",\"foreground\":\"#403f53\",\"disabledForeground\":\"#61616180\",\"descriptionForeground\":\"#403f53\",\"errorForeground\":\"#403f53\",\"icon.foreground\":\"#424242\",\"contrastActiveBorder\":null,\"contrastBorder\":null,\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#dcdcdc66\",\"textLink.activeForeground\":\"#006ab1\",\"textLink.foreground\":\"#006ab1\",\"textPreformat.foreground\":\"#a31515\",\"textSeparator.foreground\":\"#0000002e\",\"editor.background\":\"#f6f7f9\",\"editor.foreground\":\"#403f53\",\"editorLineNumber.foreground\":\"#90a7b2\",\"editorLineNumber.activeForeground\":\"#403f53\",\"editorActiveLineNumber.foreground\":\"#0b216f\",\"editor.selectionBackground\":\"#e0e0e0\",\"editor.inactiveSelectionBackground\":\"#e0e0e080\",\"editor.selectionHighlightBackground\":\"#339cec33\",\"editorError.foreground\":\"#e64d49\",\"editorWarning.foreground\":\"#daaa01\",\"editorInfo.foreground\":\"#1a85ff\",\"editorHint.foreground\":\"#6c6c6c\",\"problemsErrorIcon.foreground\":\"#e64d49\",\"problemsWarningIcon.foreground\":\"#daaa01\",\"problemsInfoIcon.foreground\":\"#1a85ff\",\"editor.findMatchBackground\":\"#93a1a16c\",\"editor.findMatchHighlightBackground\":\"#93a1a16c\",\"editor.findRangeHighlightBackground\":\"#7497a633\",\"editorLink.activeForeground\":\"#0000ff\",\"editorLightBulb.foreground\":\"#ddb100\",\"editorLightBulbAutoFix.foreground\":\"#007acc\",\"diffEditor.insertedTextBackground\":\"#9ccc2c40\",\"diffEditor.insertedTextBorder\":null,\"diffEditor.removedTextBackground\":\"#ff000033\",\"diffEditor.removedTextBorder\":null,\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#fbfbfb\",\"editorStickyScrollHover.background\":\"#f0f0f0\",\"editorInlayHint.background\":\"#2aa29899\",\"editorInlayHint.foreground\":\"#f0f0f0\",\"editorInlayHint.typeBackground\":\"#2aa29899\",\"editorInlayHint.typeForeground\":\"#f0f0f0\",\"editorInlayHint.parameterBackground\":\"#2aa29899\",\"editorInlayHint.parameterForeground\":\"#f0f0f0\",\"editorPane.background\":\"#fbfbfb\",\"editorGroup.emptyBackground\":null,\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-gray-6)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#f0f0f0\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#f0f0f0\",\"editorGroup.dropBackground\":\"#2677cb2d\",\"editorGroup.dropIntoPromptForeground\":\"#403f53\",\"editorGroup.dropIntoPromptBackground\":\"#f0f0f0\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#f0f0f0\",\"sideBySideEditor.verticalBorder\":\"#f0f0f0\",\"scrollbar.shadow\":\"#cccccc\",\"scrollbarSlider.background\":\"#0000001a\",\"scrollbarSlider.hoverBackground\":\"#00000055\",\"scrollbarSlider.activeBackground\":\"#00000099\",\"panel.background\":\"#f0f0f0\",\"panel.border\":\"#d9d9d9\",\"panelTitle.activeBorder\":\"#424242\",\"panelTitle.activeForeground\":\"#424242\",\"panelTitle.inactiveForeground\":\"#424242bf\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#f6f6f6\",\"widget.shadow\":\"#d9d9d9\",\"editorWidget.background\":\"#f0f0f0\",\"editorWidget.foreground\":\"#403f53\",\"editorWidget.border\":\"#d9d9d9\",\"quickInput.background\":\"#f0f0f0\",\"quickInput.foreground\":\"#403f53\",\"quickInputTitle.background\":\"#0000000f\",\"pickerGroup.foreground\":\"#403f53\",\"pickerGroup.border\":\"#d9d9d9\",\"editor.hoverHighlightBackground\":\"#339cec33\",\"editorHoverWidget.background\":\"#f0f0f0\",\"editorHoverWidget.foreground\":\"#403f53\",\"editorHoverWidget.border\":\"#d9d9d9\",\"editorHoverWidget.statusBarBackground\":\"#e4e4e4\",\"titleBar.activeBackground\":\"var(--sl-color-gray-6)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#f0f0f099\",\"titleBar.inactiveForeground\":\"#33333399\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#b8b8b850\",\"toolbar.activeBackground\":\"#a6a6a650\",\"tab.activeBackground\":\"#f6f6f6\",\"tab.unfocusedActiveBackground\":\"#f6f6f6\",\"tab.inactiveBackground\":\"#f0f0f0\",\"tab.unfocusedInactiveBackground\":\"#f0f0f0\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#403f53\",\"tab.unfocusedActiveForeground\":\"#403f53b3\",\"tab.unfocusedInactiveForeground\":\"#403f5380\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#f0f0f0\",\"tab.lastPinnedBorder\":\"#a9a9a9\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":null,\"tab.activeBorderTop\":\"var(--sl-color-accent)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#2aa298\",\"tab.inactiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedActiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedInactiveModifiedBorder\":\"#93a1a1\",\"badge.background\":\"#2aa298\",\"badge.foreground\":\"#f0f0f0\",\"button.background\":\"#2aa298\",\"button.foreground\":\"#f0f0f0\",\"button.border\":null,\"button.separator\":\"#f0f0f066\",\"button.hoverBackground\":\"#22827a\",\"button.secondaryBackground\":\"#5f6a79\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#4c5561\",\"dropdown.background\":\"#f0f0f0\",\"dropdown.foreground\":\"#403f53\",\"dropdown.border\":\"#d9d9d9\",\"list.activeSelectionBackground\":\"#d3e8f8\",\"list.activeSelectionForeground\":\"#403f53\",\"tree.indentGuidesStroke\":\"#a9a9a9\",\"input.background\":\"#f0f0f0\",\"input.foreground\":\"#403f53\",\"input.placeholderForeground\":\"#93a1a1\",\"inputOption.activeBorder\":\"#2aa298\",\"inputOption.hoverBackground\":\"#b8b8b850\",\"inputOption.activeBackground\":\"#93a1a133\",\"inputOption.activeForeground\":\"#000000\",\"inputValidation.infoBackground\":\"#f0f0f0\",\"inputValidation.infoBorder\":\"#d0d0d0\",\"inputValidation.warningBackground\":\"#daaa01\",\"inputValidation.warningBorder\":\"#e0af02\",\"inputValidation.errorBackground\":\"#f76e6e\",\"inputValidation.errorBorder\":\"#de3d3b\",\"keybindingLabel.background\":\"#dddddd66\",\"keybindingLabel.foreground\":\"#555555\",\"keybindingLabel.border\":\"#cccccc66\",\"keybindingLabel.bottomBorder\":\"#bbbbbb66\",\"menu.foreground\":\"#403f53\",\"menu.background\":\"#f0f0f0\",\"menu.selectionForeground\":\"#403f53\",\"menu.selectionBackground\":\"#d3e8f8\",\"menu.separatorBackground\":\"#d4d4d4\",\"editor.snippetTabstopHighlightBackground\":\"#0a326433\",\"editor.snippetFinalTabstopHighlightBorder\":\"#0a326480\",\"terminal.ansiBlack\":\"#403f53\",\"terminal.ansiRed\":\"#de3d3b\",\"terminal.ansiGreen\":\"#08916a\",\"terminal.ansiYellow\":\"#e0af02\",\"terminal.ansiBlue\":\"#288ed7\",\"terminal.ansiMagenta\":\"#d6438a\",\"terminal.ansiCyan\":\"#2aa298\",\"terminal.ansiWhite\":\"#f0f0f0\",\"terminal.ansiBrightBlack\":\"#403f53\",\"terminal.ansiBrightRed\":\"#de3d3b\",\"terminal.ansiBrightGreen\":\"#08916a\",\"terminal.ansiBrightYellow\":\"#daaa01\",\"terminal.ansiBrightBlue\":\"#288ed7\",\"terminal.ansiBrightMagenta\":\"#d6438a\",\"terminal.ansiBrightCyan\":\"#2aa298\",\"terminal.ansiBrightWhite\":\"#f0f0f0\",\"selection.background\":\"#7a8181ad\",\"notifications.background\":\"#f0f0f0\",\"notifications.foreground\":\"#403f53\",\"notificationLink.foreground\":\"#994cc3\",\"notifications.border\":\"#cccccc\",\"notificationCenter.border\":\"#cccccc\",\"notificationToast.border\":\"#cccccc\",\"notificationCenterHeader.foreground\":\"#403f53\",\"notificationCenterHeader.background\":\"#f0f0f0\",\"input.border\":\"#d9d9d9\",\"progressBar.background\":\"#2aa298\",\"list.inactiveSelectionBackground\":\"#e0e7ea\",\"list.inactiveSelectionForeground\":\"#403f53\",\"list.focusBackground\":\"#d3e8f8\",\"list.hoverBackground\":\"#d3e8f8\",\"list.focusForeground\":\"#403f53\",\"list.hoverForeground\":\"#403f53\",\"list.highlightForeground\":\"#403f53\",\"list.errorForeground\":\"#e64d49\",\"list.warningForeground\":\"#daaa01\",\"activityBar.background\":\"#f0f0f0\",\"activityBar.foreground\":\"#403f53\",\"activityBar.dropBackground\":\"#d0d0d0\",\"activityBarBadge.background\":\"#403f53\",\"activityBarBadge.foreground\":\"#f0f0f0\",\"activityBar.border\":\"#f0f0f0\",\"sideBar.background\":\"#f0f0f0\",\"sideBar.foreground\":\"#403f53\",\"sideBarTitle.foreground\":\"#403f53\",\"sideBar.border\":\"#f0f0f0\",\"editorGroup.background\":\"#f6f6f6\",\"editorCursor.foreground\":\"#90a7b2\",\"editor.wordHighlightBackground\":\"#339cec33\",\"editor.wordHighlightStrongBackground\":\"#007dd659\",\"editor.lineHighlightBackground\":\"#f0f0f0\",\"editor.rangeHighlightBackground\":\"#7497a633\",\"editorWhitespace.foreground\":\"#d9d9d9\",\"editorIndentGuide.background\":\"#d9d9d9\",\"editorCodeLens.foreground\":\"#403f53\",\"editorBracketMatch.background\":\"#d3e8f8\",\"editorBracketMatch.border\":\"#2aa298\",\"editorError.border\":\"#fbfbfb\",\"editorWarning.border\":\"#daaa01\",\"editorGutter.addedBackground\":\"#49d0c5\",\"editorGutter.modifiedBackground\":\"#6fbef6\",\"editorGutter.deletedBackground\":\"#f76e6e\",\"editorRuler.foreground\":\"#d9d9d9\",\"editorOverviewRuler.errorForeground\":\"#e64d49\",\"editorOverviewRuler.warningForeground\":\"#daaa01\",\"editorSuggestWidget.background\":\"#f0f0f0\",\"editorSuggestWidget.foreground\":\"#403f53\",\"editorSuggestWidget.highlightForeground\":\"#403f53\",\"editorSuggestWidget.selectedBackground\":\"#d3e8f8\",\"editorSuggestWidget.border\":\"#d9d9d9\",\"debugExceptionWidget.background\":\"#f0f0f0\",\"debugExceptionWidget.border\":\"#d9d9d9\",\"editorMarkerNavigation.background\":\"#d0d0d0\",\"editorMarkerNavigationError.background\":\"#f76e6e\",\"editorMarkerNavigationWarning.background\":\"#daaa01\",\"debugToolBar.background\":\"#f0f0f0\",\"extensionButton.prominentBackground\":\"#2aa298\",\"extensionButton.prominentForeground\":\"#f0f0f0\",\"statusBar.background\":\"#f0f0f0\",\"statusBar.border\":\"#f0f0f0\",\"statusBar.debuggingBackground\":\"#f0f0f0\",\"statusBar.debuggingForeground\":\"#403f53\",\"statusBar.foreground\":\"#403f53\",\"statusBar.noFolderBackground\":\"#f0f0f0\",\"statusBar.noFolderForeground\":\"#403f53\",\"peekView.border\":\"#d9d9d9\",\"peekViewEditor.background\":\"#f6f6f6\",\"peekViewEditorGutter.background\":\"#f6f6f6\",\"peekViewEditor.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.background\":\"#f0f0f0\",\"peekViewResult.fileForeground\":\"#403f53\",\"peekViewResult.lineForeground\":\"#403f53\",\"peekViewResult.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.selectionBackground\":\"#e0e7ea\",\"peekViewResult.selectionForeground\":\"#403f53\",\"peekViewTitle.background\":\"#f0f0f0\",\"peekViewTitleLabel.foreground\":\"#403f53\",\"peekViewTitleDescription.foreground\":\"#403f53\",\"terminal.foreground\":\"#403f53\"},\"fg\":\"#403f53\",\"bg\":\"#f6f7f9\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#556484\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#ae3c3afd\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#403f53\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#5f636f\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#3a688f\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"foreground\":\"#bb2060\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#5d6376\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#58656a\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#646464\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#286d70\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword Operator Comparison, imports, returns and Keyword Operator Ruby\",\"scope\":[\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.module.ruby\",\"keyword.control.class.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Control Conditional\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"foreground\":\"#486e26\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#a64348\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#186e73\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#984e4d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#3e697c\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#555ea2\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#111111\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#7c5686\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Symbols\",\"scope\":[\"constant.language.symbol.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#954f5a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#403f53\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\",\"variable.other.property.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#76578b\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-7)\",\"terminalBackground\":\"var(--sl-color-gray-7)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-7)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#0000001a\",\"markBorderColor\":\"#00000055\"}}}],\"defaultLocale\":\"en\",\"cascadeLayer\":\"starlight.components\",\"styleOverrides\":{\"borderRadius\":\"0px\",\"borderWidth\":\"1px\",\"codePaddingBlock\":\"0.75rem\",\"codePaddingInline\":\"1rem\",\"codeFontFamily\":\"var(--__sl-font-mono)\",\"codeFontSize\":\"var(--sl-text-code)\",\"codeLineHeight\":\"var(--sl-line-height)\",\"uiFontFamily\":\"var(--__sl-font)\",\"textMarkers\":{\"lineDiffIndicatorMarginLeft\":\"0.25rem\",\"defaultChroma\":\"45\",\"backgroundOpacity\":\"60%\"}},\"plugins\":[{\"name\":\"Starlight Plugin\",\"hooks\":{}},{\"name\":\"astro-expressive-code\",\"hooks\":{}}]}]],\"remarkRehype\":{},\"gfm\":true,\"smartypants\":true},\"security\":{\"checkOrigin\":true,\"allowedDomains\":[],\"actionBodySizeLimit\":1048576},\"env\":{\"schema\":{},\"validateSecrets\":false},\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"headingIdCompat\":false,\"preserveScriptOrder\":false,\"liveContentCollections\":false,\"csp\":false,\"staticImportMetaEnv\":false,\"chromeDevtoolsWorkspace\":false,\"failOnPrerenderConflict\":false,\"svgo\":false},\"legacy\":{\"collections\":false},\"prefetch\":{\"prefetchAll\":true},\"i18n\":{\"defaultLocale\":\"en\",\"locales\":[\"en\"],\"routing\":{\"prefixDefaultLocale\":false,\"redirectToDefaultLocale\":false,\"fallbackType\":\"redirect\"}}}","docs",["Map",11,12,28,29,39,40,49,50,59,60,69,70,79,80],"index",{"id":11,"data":13,"body":25,"filePath":26,"digest":27,"deferredRender":16},{"title":14,"description":15,"editUrl":16,"head":17,"template":18,"hero":19,"sidebar":22,"pagefind":16,"draft":23},"Vonage Video React App","Learn how to control the features and display settings of the Vonage Video React App using a single configuration file.",true,[],"splash",{"tagline":20,"actions":21},"Feature Config",[],{"hidden":23,"attrs":24},false,{},"The Vonage Video React App ships with a broad set of features — archiving, chat, screen sharing, emoji reactions, captions, and more. Every one of them can be turned on or off without touching any source code, using a single shell configuration file: **`vcrBuild.env.sh`**.\n\nIn this tutorial you will:\n\n- Understand how frontend configuration works in the app\n- Enable and disable feature flags to tailor the experience for your use case\n- Adjust display defaults such as video resolution and room layout\n- Apply your changes and verify them in the running app\n\n---\n\n## Tutorial structure\n\n| # | Page | What you'll do |\n| --- | --------------------------- | ------------------------------------------------------------- |\n| 01 | Backend credentials | Create `backend/.env` with your Vonage App ID and private key |\n| 02 | Configuration file overview | Explore `vcrBuild.env.sh` and understand its structure |\n| 03 | Feature flags | Enable and disable individual features |\n| 04 | Display settings | Adjust video resolution and default room layout |\n| 05 | Apply and verify | Rebuild the app and confirm your changes in the browser |","src/content/docs/index.mdx","bc349f319ac949f8","01-backend-setup",{"id":28,"data":30,"body":36,"filePath":37,"digest":38,"deferredRender":16},{"title":31,"editUrl":16,"head":32,"template":33,"sidebar":34,"pagefind":16,"draft":23},"Backend Credentials",[],"doc",{"hidden":23,"attrs":35},{},"Before configuring any features, the backend needs to know your Vonage application credentials. These are stored in a `.env` file inside the `backend/` folder that **you must create manually** — they cannot be generated for you.\n\n## Create the File\n\nThe repo includes a `backend/.env.example` with all the required variables already listed. Copy it to create your own `.env`:\n\n```sh\ncp backend/.env.example backend/.env\n```\n\nThen open `backend/.env` and replace the placeholder values with your own:\n\n```sh\n# backend/.env\nVONAGE_APP_ID=your-vonage-application-id\nVONAGE_PRIVATE_KEY=./private.key\n```\n\n{% aside type=\"caution\" %}\nNever commit `backend/.env` to source control. The repo's `.gitignore` already excludes it, but double-check before pushing.\n{% /aside %}\n\n## Where to Get the Values\n\n| Variable | Where to find it |\n|----------|-----------------|\n| `VONAGE_APP_ID` | [Vonage Dashboard](https://dashboard.vonage.com) → Your Applications → the app you created for this project |\n| `VONAGE_PRIVATE_KEY` | The `private.key` file downloaded when you created the Vonage Application. Place it in the `backend/` folder and set the path to `./private.key` |\n\n## Verify\n\nOnce the file is saved, confirm its contents look correct:\n\n```sh\ncat backend/.env\n```\n\nYou should see your App ID and the key path. With credentials in place, let's look at the frontend configuration file.","src/content/docs/01-backend-setup.mdoc","82e037cbc96786a5","01-config-file-overview",{"id":39,"data":41,"body":46,"filePath":47,"digest":48,"deferredRender":16},{"title":42,"editUrl":16,"head":43,"template":33,"sidebar":44,"pagefind":16,"draft":23},"The Config File",[],{"hidden":23,"attrs":45},{},"All frontend settings for the Vonage Video React App live in a single file at the project root: **`vcrBuild.env.sh`**. This is the one place you need to go to control features, display defaults, and other frontend behaviour.\n\n## Where It Lives\n\n{% filetree %}\n\n- vcrBuild.env.sh ← All frontend configuration goes here\n- backend/\n - .env ← Backend credentials (separate)\n- frontend/\n- libs/\n\n{% /filetree %}\n\n{% aside %}\nBackend credentials (`VONAGE_APP_ID`, `VONAGE_PRIVATE_KEY`) live in `backend/.env`. This tutorial covers only **frontend** configuration in `vcrBuild.env.sh`.\n{% /aside %}\n\n## How It Works\n\n`vcrBuild.env.sh` is a shell script that exports environment variables. It is loaded automatically every time you run the app or trigger a build — you never need to source it manually.\n\n```bash\n# vcrBuild.env.sh\nexport ALLOW_CHAT=true\nexport ALLOW_ARCHIVING=true\nexport DEFAULT_LAYOUT_MODE='active-speaker'\n```\n\n## Opening the File\n\nOpen `vcrBuild.env.sh` in your editor:\n\n```sh\ncode vcrBuild.env.sh\n```\n\nThe defaults work out of the box — all major features are enabled and the resolution is set to 1280×720. You only need to edit the file when you want to change a specific behaviour.\n\n{% aside type=\"caution\" %}\nAfter editing `vcrBuild.env.sh` you must restart the app (`yarn dev`) or trigger a new build for the changes to take effect.\n{% /aside %}\n\nNow let's look at the feature flags you can control.","src/content/docs/01-config-file-overview.mdoc","52ff691e61eb09f2","02-feature-flags",{"id":49,"data":51,"body":56,"filePath":57,"digest":58,"deferredRender":16},{"title":52,"editUrl":16,"head":53,"template":33,"sidebar":54,"pagefind":16,"draft":23},"Feature Flags",[],{"hidden":23,"attrs":55},{},"Feature flags let you enable or disable specific capabilities of the app without changing any source code. Each flag is a boolean `true` / `false` value in `vcrBuild.env.sh`.\n\n## Media Controls\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ALLOW_CAMERA_CONTROL` | `true` | Show the camera on/off toggle |\n| `ALLOW_VIDEO_ON_JOIN` | `true` | Start with camera enabled when joining |\n| `ALLOW_MICROPHONE_CONTROL` | `true` | Show the microphone on/off toggle |\n| `ALLOW_AUDIO_ON_JOIN` | `true` | Start with microphone enabled when joining |\n| `ALLOW_ADVANCED_NOISE_SUPPRESSION` | `true` | Enable the advanced noise-suppression toggle |\n| `ALLOW_BACKGROUND_EFFECTS` | `true` | Enable virtual background and blur effects |\n\n## Device Selection\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `WAITING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors in the waiting room |\n| `MEETING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors inside the meeting room |\n\n## In-Call Features\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ALLOW_ARCHIVING` | `true` | Enable meeting recording |\n| `ALLOW_CAPTIONS` | `true` | Enable live captions |\n| `ALLOW_CHAT` | `true` | Enable the in-call group chat |\n| `ALLOW_EMOJIS` | `true` | Enable emoji reactions |\n| `ALLOW_SCREEN_SHARE` | `true` | Enable screen sharing |\n| `SHOW_PARTICIPANT_LIST` | `true` | Show the participant list panel |\n\n## Room Behaviour\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ENABLE_REPORT_ISSUE` | `false` | Show the in-call issue reporting tool |\n| `BYPASS_WAITING_ROOM` | `false` | Skip the waiting room and join directly |\n| `AVOID_FETCHING_APP_CONFIG` | `true` | Skip fetching remote app configuration on startup |\n\n## Example: Minimal Read-Only Viewer\n\nTo create a stripped-down experience with no interactive tools, you might disable several flags at once:\n\n```bash\n# vcrBuild.env.sh\nexport ALLOW_CHAT=false\nexport ALLOW_EMOJIS=false\nexport ALLOW_SCREEN_SHARE=false\nexport ALLOW_ARCHIVING=false\nexport ALLOW_CAPTIONS=false\nexport ENABLE_REPORT_ISSUE=false\nexport SHOW_PARTICIPANT_LIST=false\n```\n\n{% aside type=\"tip\" %}\nBackground effects (`ALLOW_BACKGROUND_EFFECTS`) are only supported in Chromium-based browsers. If your audience uses Firefox or Safari, consider disabling this flag to avoid showing an unsupported feature.\n{% /aside %}\n\nYou have reviewed all the feature flags. Next, you will look at display defaults like resolution and room layout.","src/content/docs/02-feature-flags.mdoc","964d0b09d64d3f3b","03-display-defaults",{"id":59,"data":61,"body":66,"filePath":67,"digest":68,"deferredRender":16},{"title":62,"editUrl":16,"head":63,"template":33,"sidebar":64,"pagefind":16,"draft":23},"Display Defaults",[],{"hidden":23,"attrs":65},{},"Beyond feature flags, `vcrBuild.env.sh` also controls the default visual and performance settings of the video room — the starting resolution, room layout, bitrate limits, and available frame rates.\n\n## Video Resolution\n\n`DEFAULT_RESOLUTION` sets the outgoing video resolution when a participant joins.\n\n| Value | Description |\n|-------|-------------|\n| `1920x1080` | Full HD |\n| `1280x960` | HD (4:3) |\n| `1280x720` | HD 720p **(default)** |\n| `640x480` | SD (4:3) |\n| `640x360` | SD 360p |\n| `320x240` | Low (4:3) |\n| `320x180` | Low 180p |\n\n```bash\nexport DEFAULT_RESOLUTION='1280x720'\n```\n\n## Room Layout\n\n`DEFAULT_LAYOUT_MODE` controls which layout is shown when a participant first enters the room.\n\n| Value | Description |\n|-------|-------------|\n| `active-speaker` | Highlights the current speaker **(default)** |\n| `grid` | Shows all participants in an equal grid |\n\n```bash\nexport DEFAULT_LAYOUT_MODE='active-speaker'\n```\n\n{% aside type=\"caution\" %}\nChanging `DEFAULT_LAYOUT_MODE` requires the participant to **rejoin the room** to take effect — a running session does not update dynamically.\n{% /aside %}\n\n## Custom Video Bitrate Range\n\nThese settings control the minimum and maximum selectable bitrate in the **Advanced Settings** dialog.\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `MIN_CUSTOM_VIDEO_BITRATE_BPS` | `5000` | Minimum selectable bitrate in bps |\n| `MAX_CUSTOM_VIDEO_BITRATE_BPS` | `10000000` | Maximum selectable bitrate in bps |\n\n```bash\nexport MIN_CUSTOM_VIDEO_BITRATE_BPS=5000\nexport MAX_CUSTOM_VIDEO_BITRATE_BPS=10000000\n```\n\n## Supported Frame Rates\n\n`SUPPORTED_FRAME_RATES` defines the frame rate options shown in the Advanced Settings video tab. Values are positive integers separated by `|`.\n\n```bash\nexport SUPPORTED_FRAME_RATES='30|15|7|1'\n```\n\n{% aside type=\"tip\" %}\nLowering `DEFAULT_RESOLUTION` or restricting `SUPPORTED_FRAME_RATES` can significantly reduce bandwidth usage — useful when you know participants may be on slower connections.\n{% /aside %}\n\nYou have configured the display defaults. In the next step, you will apply all your changes and verify them.","src/content/docs/03-display-defaults.mdoc","4d0ef6db3474a83b","04-apply-changes",{"id":69,"data":71,"body":76,"filePath":77,"digest":78,"deferredRender":16},{"title":72,"editUrl":16,"head":73,"template":33,"sidebar":74,"pagefind":16,"draft":23},"Apply Your Changes",[],{"hidden":23,"attrs":75},{},"With your feature flags and display defaults configured, this step shows you how to apply the changes and confirm they are working in the running app.\n\n## Save and Restart\n\nAfter editing `vcrBuild.env.sh`, save the file and restart the development server:\n\n```sh\nyarn dev\n```\n\nThis reloads both the backend server (port **3345**) and the frontend Vite dev server (port **5173**) with the updated configuration.\n\n{% aside type=\"caution\" %}\nSimply saving the file is not enough — the dev server must be restarted to pick up the new environment variable values.\n{% /aside %}\n\n## Verify in the Browser\n\nOpen [http://localhost:5173](http://localhost:5173) and check that your changes are reflected:\n\n{% steps %}\n\n1. Navigate to the **waiting room** — confirm device selectors appear or are hidden based on `WAITING_ROOM_ALLOW_DEVICE_SELECTION`.\n\n2. Join a meeting room — confirm the initial layout matches `DEFAULT_LAYOUT_MODE`.\n\n3. Check the toolbar — verify that toggles for chat, screen share, emojis, and archiving match your flag settings.\n\n4. Open **Advanced Settings** — confirm the resolution options and bitrate range reflect your `DEFAULT_RESOLUTION` and bitrate values.\n\n{% /steps %}\n\n## Flags That Require a Rejoin\n\nSome settings only take effect when a participant **rejoins** the room (not on live reload):\n\n- `DEFAULT_LAYOUT_MODE`\n- `ALLOW_AUDIO_ON_JOIN`\n- `ALLOW_VIDEO_ON_JOIN`\n\nIf you changed any of these, leave the room and re-enter to see the updated behaviour.\n\n## Iterating Quickly\n\nA typical configure-test cycle:\n\n{% steps %}\n\n1. Edit `vcrBuild.env.sh`.\n\n2. Stop the server with **Ctrl+C**.\n\n3. Run `yarn dev` to restart.\n\n4. Open the app and verify.\n\n{% /steps %}\n\nYour configuration is live. Head to the final step for further resources.","src/content/docs/04-apply-changes.mdoc","d2386412057c2165","05-whats-next",{"id":79,"data":81,"body":87,"filePath":88,"digest":89,"deferredRender":16},{"title":82,"description":83,"editUrl":16,"head":84,"template":33,"sidebar":85,"pagefind":16,"draft":23},"What's Next","Further resources for configuring and extending the Vonage Video React App.",[],{"hidden":23,"attrs":86},{},"Congratulations! You have successfully configured the Vonage Video React App's features and display defaults using `vcrBuild.env.sh`. The app is now tailored to your specific use case.\n\n## What You Accomplished\n\n- Understood how all frontend configuration flows through `vcrBuild.env.sh`\n- Enabled and disabled feature flags for media controls, in-call tools, and room behaviour\n- Configured display defaults including resolution, layout mode, bitrate, and frame rates\n- Applied your changes by restarting the dev server and verified them in the browser\n\n## Resources\n\n- [Vonage Developer Portal](https://developer.vonage.com) — Documentation, guides, and API references for all Vonage products.\n- [Vonage Video API Documentation](https://developer.vonage.com/en/video/overview) — In-depth guides for the Video API.\n- [vonage-video-react-app on GitHub](https://github.com/Vonage/vonage-video-react-app) — Source code, full README with all configuration options, and contribution guidelines.\n\n{% aside type=\"tip\" %}\nThe full list of frontend environment variables — including defaults, accepted values, and descriptions — is always available in the `vcrBuild.env.sh` file itself and in the project README.\n{% /aside %}","src/content/docs/05-whats-next.mdoc","7b6c777a7dd76a59"] \ No newline at end of file +[["Map",1,2,9,10],"meta::meta",["Map",3,4,5,6,7,8],"astro-version","5.18.1","content-config-digest","a30a942a2ceda2e1","astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"compressHTML\":true,\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"static\",\"scopedStyleStrategy\":\"where\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":false,\"port\":4321,\"streaming\":true,\"allowedHosts\":[]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":false,\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[null,null,null],\"rehypePlugins\":[[null,{\"experimentalHeadingIdCompat\":false}],null,[null,{\"themes\":[{\"name\":\"Night Owl No Italics\",\"type\":\"dark\",\"colors\":{\"focusBorder\":\"#122d42\",\"foreground\":\"#d6deeb\",\"disabledForeground\":\"#cccccc80\",\"descriptionForeground\":\"#d6deebb3\",\"errorForeground\":\"#ef5350\",\"icon.foreground\":\"#c5c5c5\",\"contrastActiveBorder\":null,\"contrastBorder\":\"#122d42\",\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#4f4f4f\",\"textLink.activeForeground\":\"#3794ff\",\"textLink.foreground\":\"#3794ff\",\"textPreformat.foreground\":\"#d7ba7d\",\"textSeparator.foreground\":\"#ffffff2e\",\"editor.background\":\"#23262f\",\"editor.foreground\":\"#d6deeb\",\"editorLineNumber.foreground\":\"#4b6479\",\"editorLineNumber.activeForeground\":\"#c5e4fd\",\"editorActiveLineNumber.foreground\":\"#c6c6c6\",\"editor.selectionBackground\":\"#1d3b53\",\"editor.inactiveSelectionBackground\":\"#7e57c25a\",\"editor.selectionHighlightBackground\":\"#5f7e9779\",\"editorError.foreground\":\"#ef5350\",\"editorWarning.foreground\":\"#b39554\",\"editorInfo.foreground\":\"#3794ff\",\"editorHint.foreground\":\"#eeeeeeb2\",\"problemsErrorIcon.foreground\":\"#ef5350\",\"problemsWarningIcon.foreground\":\"#b39554\",\"problemsInfoIcon.foreground\":\"#3794ff\",\"editor.findMatchBackground\":\"#5f7e9779\",\"editor.findMatchHighlightBackground\":\"#1085bb5d\",\"editor.findRangeHighlightBackground\":\"#3a3d4166\",\"editorLink.activeForeground\":\"#4e94ce\",\"editorLightBulb.foreground\":\"#ffcc00\",\"editorLightBulbAutoFix.foreground\":\"#75beff\",\"diffEditor.insertedTextBackground\":\"#99b76d23\",\"diffEditor.insertedTextBorder\":\"#c5e47833\",\"diffEditor.removedTextBackground\":\"#ef535033\",\"diffEditor.removedTextBorder\":\"#ef53504d\",\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#011627\",\"editorStickyScrollHover.background\":\"#2a2d2e\",\"editorInlayHint.background\":\"#5f7e97cc\",\"editorInlayHint.foreground\":\"#ffffff\",\"editorInlayHint.typeBackground\":\"#5f7e97cc\",\"editorInlayHint.typeForeground\":\"#ffffff\",\"editorInlayHint.parameterBackground\":\"#5f7e97cc\",\"editorInlayHint.parameterForeground\":\"#ffffff\",\"editorPane.background\":\"#011627\",\"editorGroup.emptyBackground\":\"#011627\",\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-black)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#011627\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#011627\",\"editorGroup.dropBackground\":\"#7e57c273\",\"editorGroup.dropIntoPromptForeground\":\"#d6deeb\",\"editorGroup.dropIntoPromptBackground\":\"#021320\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#011627\",\"sideBySideEditor.verticalBorder\":\"#011627\",\"scrollbar.shadow\":\"#010b14\",\"scrollbarSlider.background\":\"#ffffff17\",\"scrollbarSlider.hoverBackground\":\"#ffffff40\",\"scrollbarSlider.activeBackground\":\"#084d8180\",\"panel.background\":\"#011627\",\"panel.border\":\"#5f7e97\",\"panelTitle.activeBorder\":\"#5f7e97\",\"panelTitle.activeForeground\":\"#ffffffcc\",\"panelTitle.inactiveForeground\":\"#d6deeb80\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#011627\",\"widget.shadow\":\"#011627\",\"editorWidget.background\":\"#021320\",\"editorWidget.foreground\":\"#d6deeb\",\"editorWidget.border\":\"#5f7e97\",\"quickInput.background\":\"#021320\",\"quickInput.foreground\":\"#d6deeb\",\"quickInputTitle.background\":\"#ffffff1a\",\"pickerGroup.foreground\":\"#d1aaff\",\"pickerGroup.border\":\"#011627\",\"editor.hoverHighlightBackground\":\"#7e57c25a\",\"editorHoverWidget.background\":\"#011627\",\"editorHoverWidget.foreground\":\"#d6deeb\",\"editorHoverWidget.border\":\"#5f7e97\",\"editorHoverWidget.statusBarBackground\":\"#011a2f\",\"titleBar.activeBackground\":\"var(--sl-color-black)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#010e1a\",\"titleBar.inactiveForeground\":\"#eeefff99\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#5a5d5e50\",\"toolbar.activeBackground\":\"#63666750\",\"tab.activeBackground\":\"#0b2942\",\"tab.unfocusedActiveBackground\":\"#0b2942\",\"tab.inactiveBackground\":\"#01111d\",\"tab.unfocusedInactiveBackground\":\"#01111d\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#5f7e97\",\"tab.unfocusedActiveForeground\":\"#5f7e97\",\"tab.unfocusedInactiveForeground\":\"#5f7e97\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#272b3b\",\"tab.lastPinnedBorder\":\"#585858\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":\"#262a39\",\"tab.activeBorderTop\":\"var(--sl-color-accent-high)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#3399cc\",\"tab.inactiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedActiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedInactiveModifiedBorder\":\"#3399cc40\",\"badge.background\":\"#5f7e97\",\"badge.foreground\":\"#ffffff\",\"button.background\":\"#7e57c2cc\",\"button.foreground\":\"#ffffffcc\",\"button.border\":\"#122d42\",\"button.separator\":\"#ffffff52\",\"button.hoverBackground\":\"#7e57c2\",\"button.secondaryBackground\":\"#3a3d41\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#46494e\",\"dropdown.background\":\"#011627\",\"dropdown.foreground\":\"#ffffffcc\",\"dropdown.border\":\"#5f7e97\",\"list.activeSelectionBackground\":\"#234d708c\",\"list.activeSelectionForeground\":\"#ffffff\",\"tree.indentGuidesStroke\":\"#585858\",\"input.background\":\"#0b253a\",\"input.foreground\":\"#ffffffcc\",\"input.placeholderForeground\":\"#5f7e97\",\"inputOption.activeBorder\":\"#ffffffcc\",\"inputOption.hoverBackground\":\"#5a5d5e80\",\"inputOption.activeBackground\":\"#122d4266\",\"inputOption.activeForeground\":\"#ffffff\",\"inputValidation.infoBackground\":\"#00589ef2\",\"inputValidation.infoBorder\":\"#64b5f6\",\"inputValidation.warningBackground\":\"#675700f2\",\"inputValidation.warningBorder\":\"#ffca28\",\"inputValidation.errorBackground\":\"#ab0300f2\",\"inputValidation.errorBorder\":\"#ef5350\",\"keybindingLabel.background\":\"#8080802b\",\"keybindingLabel.foreground\":\"#cccccc\",\"keybindingLabel.border\":\"#33333399\",\"keybindingLabel.bottomBorder\":\"#44444499\",\"menu.foreground\":\"#ffffffcc\",\"menu.background\":\"#011627\",\"menu.selectionForeground\":\"#ffffff\",\"menu.selectionBackground\":\"#234d708c\",\"menu.separatorBackground\":\"#606060\",\"editor.snippetTabstopHighlightBackground\":\"#7c7c74c\",\"editor.snippetFinalTabstopHighlightBorder\":\"#525252\",\"terminal.ansiBlack\":\"#011627\",\"terminal.ansiRed\":\"#ef5350\",\"terminal.ansiGreen\":\"#22da6e\",\"terminal.ansiYellow\":\"#c5e478\",\"terminal.ansiBlue\":\"#82aaff\",\"terminal.ansiMagenta\":\"#c792ea\",\"terminal.ansiCyan\":\"#21c7a8\",\"terminal.ansiWhite\":\"#ffffff\",\"terminal.ansiBrightBlack\":\"#575656\",\"terminal.ansiBrightRed\":\"#ef5350\",\"terminal.ansiBrightGreen\":\"#22da6e\",\"terminal.ansiBrightYellow\":\"#ffeb95\",\"terminal.ansiBrightBlue\":\"#82aaff\",\"terminal.ansiBrightMagenta\":\"#c792ea\",\"terminal.ansiBrightCyan\":\"#7fdbca\",\"terminal.ansiBrightWhite\":\"#ffffff\",\"selection.background\":\"#4373c2\",\"input.border\":\"#5f7e97\",\"punctuation.definition.generic.begin.html\":\"#ef5350f2\",\"progress.background\":\"#7e57c2\",\"breadcrumb.foreground\":\"#a599e9\",\"breadcrumb.focusForeground\":\"#ffffff\",\"breadcrumb.activeSelectionForeground\":\"#ffffff\",\"breadcrumbPicker.background\":\"#001122\",\"list.invalidItemForeground\":\"#975f94\",\"list.dropBackground\":\"#011627\",\"list.focusBackground\":\"#010d18\",\"list.focusForeground\":\"#ffffff\",\"list.highlightForeground\":\"#ffffff\",\"list.hoverBackground\":\"#011627\",\"list.hoverForeground\":\"#ffffff\",\"list.inactiveSelectionBackground\":\"#0e293f\",\"list.inactiveSelectionForeground\":\"#5f7e97\",\"activityBar.background\":\"#011627\",\"activityBar.dropBackground\":\"#5f7e97\",\"activityBar.foreground\":\"#5f7e97\",\"activityBar.border\":\"#011627\",\"activityBarBadge.background\":\"#44596b\",\"activityBarBadge.foreground\":\"#ffffff\",\"sideBar.background\":\"#011627\",\"sideBar.foreground\":\"#89a4bb\",\"sideBar.border\":\"#011627\",\"sideBarTitle.foreground\":\"#5f7e97\",\"sideBarSectionHeader.background\":\"#011627\",\"sideBarSectionHeader.foreground\":\"#5f7e97\",\"editorCursor.foreground\":\"#80a4c2\",\"editor.wordHighlightBackground\":\"#f6bbe533\",\"editor.wordHighlightStrongBackground\":\"#e2a2f433\",\"editor.lineHighlightBackground\":\"#0003\",\"editor.rangeHighlightBackground\":\"#7e57c25a\",\"editorIndentGuide.background\":\"#5e81ce52\",\"editorIndentGuide.activeBackground\":\"#7e97ac\",\"editorRuler.foreground\":\"#5e81ce52\",\"editorCodeLens.foreground\":\"#5e82ceb4\",\"editorBracketMatch.background\":\"#5f7e974d\",\"editorOverviewRuler.currentContentForeground\":\"#7e57c2\",\"editorOverviewRuler.incomingContentForeground\":\"#7e57c2\",\"editorOverviewRuler.commonContentForeground\":\"#7e57c2\",\"editorGutter.background\":\"#011627\",\"editorGutter.modifiedBackground\":\"#e2b93d\",\"editorGutter.addedBackground\":\"#9ccc65\",\"editorGutter.deletedBackground\":\"#ef5350\",\"editorSuggestWidget.background\":\"#2c3043\",\"editorSuggestWidget.border\":\"#2b2f40\",\"editorSuggestWidget.foreground\":\"#d6deeb\",\"editorSuggestWidget.highlightForeground\":\"#ffffff\",\"editorSuggestWidget.selectedBackground\":\"#5f7e97\",\"debugExceptionWidget.background\":\"#011627\",\"debugExceptionWidget.border\":\"#5f7e97\",\"editorMarkerNavigation.background\":\"#0b2942\",\"editorMarkerNavigationError.background\":\"#ef5350\",\"editorMarkerNavigationWarning.background\":\"#ffca28\",\"peekView.border\":\"#5f7e97\",\"peekViewEditor.background\":\"#011627\",\"peekViewEditor.matchHighlightBackground\":\"#7e57c25a\",\"peekViewResult.background\":\"#011627\",\"peekViewResult.fileForeground\":\"#5f7e97\",\"peekViewResult.lineForeground\":\"#5f7e97\",\"peekViewResult.matchHighlightBackground\":\"#ffffffcc\",\"peekViewResult.selectionBackground\":\"#2e3250\",\"peekViewResult.selectionForeground\":\"#5f7e97\",\"peekViewTitle.background\":\"#011627\",\"peekViewTitleDescription.foreground\":\"#697098\",\"peekViewTitleLabel.foreground\":\"#5f7e97\",\"merge.currentHeaderBackground\":\"#5f7e97\",\"merge.incomingHeaderBackground\":\"#7e57c25a\",\"statusBar.background\":\"#011627\",\"statusBar.foreground\":\"#5f7e97\",\"statusBar.border\":\"#262a39\",\"statusBar.debuggingBackground\":\"#202431\",\"statusBar.debuggingBorder\":\"#1f2330\",\"statusBar.noFolderBackground\":\"#011627\",\"statusBar.noFolderBorder\":\"#25293a\",\"statusBarItem.activeBackground\":\"#202431\",\"statusBarItem.hoverBackground\":\"#202431\",\"statusBarItem.prominentBackground\":\"#202431\",\"statusBarItem.prominentHoverBackground\":\"#202431\",\"notifications.background\":\"#01111d\",\"notifications.border\":\"#262a39\",\"notificationCenter.border\":\"#262a39\",\"notificationToast.border\":\"#262a39\",\"notifications.foreground\":\"#ffffffcc\",\"notificationLink.foreground\":\"#80cbc4\",\"extensionButton.prominentForeground\":\"#ffffffcc\",\"extensionButton.prominentBackground\":\"#7e57c2cc\",\"extensionButton.prominentHoverBackground\":\"#7e57c2\",\"terminal.selectionBackground\":\"#1b90dd4d\",\"terminalCursor.background\":\"#234d70\",\"debugToolBar.background\":\"#011627\",\"welcomePage.buttonBackground\":\"#011627\",\"welcomePage.buttonHoverBackground\":\"#011627\",\"walkThrough.embeddedEditorBackground\":\"#011627\",\"gitDecoration.modifiedResourceForeground\":\"#a2bffc\",\"gitDecoration.deletedResourceForeground\":\"#ef535090\",\"gitDecoration.untrackedResourceForeground\":\"#c5e478ff\",\"gitDecoration.ignoredResourceForeground\":\"#395a75\",\"gitDecoration.conflictingResourceForeground\":\"#ffeb95cc\",\"source.elm\":\"#5f7e97\",\"string.quoted.single.js\":\"#ffffff\",\"meta.objectliteral.js\":\"#82aaff\"},\"fg\":\"#d6deeb\",\"bg\":\"#23262f\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#a2bffc\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#f27775fe\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#d6deeb\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#919f9f\",\"fontStyle\":\"\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#5ca7e4\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#caece6\",\"fontStyle\":\"\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"fontStyle\":\"\",\"foreground\":\"#c5e478\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"background\":\"#ff2c83\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#d3423e\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#919f9f\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#cdebf7\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#ffffff\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#80cbc4\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#57eaf1\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#fad430\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#faf39f\",\"fontStyle\":\"\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#82aaff\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Comparison, returns, imports, and Keyword Operator Ruby\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#989da0\",\"background\":\"#F78C6C\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"background\":\"#8BD649\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#ec5f67\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#ef787f\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#31e1eb\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Unquoted String Zone\",\"scope\":[\"string.unquoted.preprocessor.message.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Region\",\"scope\":[\"punctuation.separator.hash.cs\",\"keyword.preprocessor.region.cs\",\"keyword.preprocessor.endregion.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"bold\"}},{\"name\":\"C# Other Variables\",\"scope\":[\"variable.other.object.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Enum\",\"scope\":[\"entity.name.type.enum.cs\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Dart String\",\"scope\":[\"string.interpolated.single.dart\",\"string.interpolated.double.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Dart Class\",\"scope\":[\"support.class.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#ff6d6d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#dddddd\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#e0dec6\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#6ae9f0\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#78ccf0\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#8b96ea\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#c789d6\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#ff869a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#d6deeb\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#8eace3\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#d7dbe0\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-6)\",\"terminalBackground\":\"var(--sl-color-gray-6)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-6)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#ffffff17\",\"markBorderColor\":\"#ffffff40\"}}},{\"name\":\"Night Owl Light\",\"type\":\"light\",\"colors\":{\"focusBorder\":\"#93a1a1\",\"foreground\":\"#403f53\",\"disabledForeground\":\"#61616180\",\"descriptionForeground\":\"#403f53\",\"errorForeground\":\"#403f53\",\"icon.foreground\":\"#424242\",\"contrastActiveBorder\":null,\"contrastBorder\":null,\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#dcdcdc66\",\"textLink.activeForeground\":\"#006ab1\",\"textLink.foreground\":\"#006ab1\",\"textPreformat.foreground\":\"#a31515\",\"textSeparator.foreground\":\"#0000002e\",\"editor.background\":\"#f6f7f9\",\"editor.foreground\":\"#403f53\",\"editorLineNumber.foreground\":\"#90a7b2\",\"editorLineNumber.activeForeground\":\"#403f53\",\"editorActiveLineNumber.foreground\":\"#0b216f\",\"editor.selectionBackground\":\"#e0e0e0\",\"editor.inactiveSelectionBackground\":\"#e0e0e080\",\"editor.selectionHighlightBackground\":\"#339cec33\",\"editorError.foreground\":\"#e64d49\",\"editorWarning.foreground\":\"#daaa01\",\"editorInfo.foreground\":\"#1a85ff\",\"editorHint.foreground\":\"#6c6c6c\",\"problemsErrorIcon.foreground\":\"#e64d49\",\"problemsWarningIcon.foreground\":\"#daaa01\",\"problemsInfoIcon.foreground\":\"#1a85ff\",\"editor.findMatchBackground\":\"#93a1a16c\",\"editor.findMatchHighlightBackground\":\"#93a1a16c\",\"editor.findRangeHighlightBackground\":\"#7497a633\",\"editorLink.activeForeground\":\"#0000ff\",\"editorLightBulb.foreground\":\"#ddb100\",\"editorLightBulbAutoFix.foreground\":\"#007acc\",\"diffEditor.insertedTextBackground\":\"#9ccc2c40\",\"diffEditor.insertedTextBorder\":null,\"diffEditor.removedTextBackground\":\"#ff000033\",\"diffEditor.removedTextBorder\":null,\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#fbfbfb\",\"editorStickyScrollHover.background\":\"#f0f0f0\",\"editorInlayHint.background\":\"#2aa29899\",\"editorInlayHint.foreground\":\"#f0f0f0\",\"editorInlayHint.typeBackground\":\"#2aa29899\",\"editorInlayHint.typeForeground\":\"#f0f0f0\",\"editorInlayHint.parameterBackground\":\"#2aa29899\",\"editorInlayHint.parameterForeground\":\"#f0f0f0\",\"editorPane.background\":\"#fbfbfb\",\"editorGroup.emptyBackground\":null,\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-gray-6)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#f0f0f0\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#f0f0f0\",\"editorGroup.dropBackground\":\"#2677cb2d\",\"editorGroup.dropIntoPromptForeground\":\"#403f53\",\"editorGroup.dropIntoPromptBackground\":\"#f0f0f0\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#f0f0f0\",\"sideBySideEditor.verticalBorder\":\"#f0f0f0\",\"scrollbar.shadow\":\"#cccccc\",\"scrollbarSlider.background\":\"#0000001a\",\"scrollbarSlider.hoverBackground\":\"#00000055\",\"scrollbarSlider.activeBackground\":\"#00000099\",\"panel.background\":\"#f0f0f0\",\"panel.border\":\"#d9d9d9\",\"panelTitle.activeBorder\":\"#424242\",\"panelTitle.activeForeground\":\"#424242\",\"panelTitle.inactiveForeground\":\"#424242bf\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#f6f6f6\",\"widget.shadow\":\"#d9d9d9\",\"editorWidget.background\":\"#f0f0f0\",\"editorWidget.foreground\":\"#403f53\",\"editorWidget.border\":\"#d9d9d9\",\"quickInput.background\":\"#f0f0f0\",\"quickInput.foreground\":\"#403f53\",\"quickInputTitle.background\":\"#0000000f\",\"pickerGroup.foreground\":\"#403f53\",\"pickerGroup.border\":\"#d9d9d9\",\"editor.hoverHighlightBackground\":\"#339cec33\",\"editorHoverWidget.background\":\"#f0f0f0\",\"editorHoverWidget.foreground\":\"#403f53\",\"editorHoverWidget.border\":\"#d9d9d9\",\"editorHoverWidget.statusBarBackground\":\"#e4e4e4\",\"titleBar.activeBackground\":\"var(--sl-color-gray-6)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#f0f0f099\",\"titleBar.inactiveForeground\":\"#33333399\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#b8b8b850\",\"toolbar.activeBackground\":\"#a6a6a650\",\"tab.activeBackground\":\"#f6f6f6\",\"tab.unfocusedActiveBackground\":\"#f6f6f6\",\"tab.inactiveBackground\":\"#f0f0f0\",\"tab.unfocusedInactiveBackground\":\"#f0f0f0\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#403f53\",\"tab.unfocusedActiveForeground\":\"#403f53b3\",\"tab.unfocusedInactiveForeground\":\"#403f5380\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#f0f0f0\",\"tab.lastPinnedBorder\":\"#a9a9a9\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":null,\"tab.activeBorderTop\":\"var(--sl-color-accent)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#2aa298\",\"tab.inactiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedActiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedInactiveModifiedBorder\":\"#93a1a1\",\"badge.background\":\"#2aa298\",\"badge.foreground\":\"#f0f0f0\",\"button.background\":\"#2aa298\",\"button.foreground\":\"#f0f0f0\",\"button.border\":null,\"button.separator\":\"#f0f0f066\",\"button.hoverBackground\":\"#22827a\",\"button.secondaryBackground\":\"#5f6a79\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#4c5561\",\"dropdown.background\":\"#f0f0f0\",\"dropdown.foreground\":\"#403f53\",\"dropdown.border\":\"#d9d9d9\",\"list.activeSelectionBackground\":\"#d3e8f8\",\"list.activeSelectionForeground\":\"#403f53\",\"tree.indentGuidesStroke\":\"#a9a9a9\",\"input.background\":\"#f0f0f0\",\"input.foreground\":\"#403f53\",\"input.placeholderForeground\":\"#93a1a1\",\"inputOption.activeBorder\":\"#2aa298\",\"inputOption.hoverBackground\":\"#b8b8b850\",\"inputOption.activeBackground\":\"#93a1a133\",\"inputOption.activeForeground\":\"#000000\",\"inputValidation.infoBackground\":\"#f0f0f0\",\"inputValidation.infoBorder\":\"#d0d0d0\",\"inputValidation.warningBackground\":\"#daaa01\",\"inputValidation.warningBorder\":\"#e0af02\",\"inputValidation.errorBackground\":\"#f76e6e\",\"inputValidation.errorBorder\":\"#de3d3b\",\"keybindingLabel.background\":\"#dddddd66\",\"keybindingLabel.foreground\":\"#555555\",\"keybindingLabel.border\":\"#cccccc66\",\"keybindingLabel.bottomBorder\":\"#bbbbbb66\",\"menu.foreground\":\"#403f53\",\"menu.background\":\"#f0f0f0\",\"menu.selectionForeground\":\"#403f53\",\"menu.selectionBackground\":\"#d3e8f8\",\"menu.separatorBackground\":\"#d4d4d4\",\"editor.snippetTabstopHighlightBackground\":\"#0a326433\",\"editor.snippetFinalTabstopHighlightBorder\":\"#0a326480\",\"terminal.ansiBlack\":\"#403f53\",\"terminal.ansiRed\":\"#de3d3b\",\"terminal.ansiGreen\":\"#08916a\",\"terminal.ansiYellow\":\"#e0af02\",\"terminal.ansiBlue\":\"#288ed7\",\"terminal.ansiMagenta\":\"#d6438a\",\"terminal.ansiCyan\":\"#2aa298\",\"terminal.ansiWhite\":\"#f0f0f0\",\"terminal.ansiBrightBlack\":\"#403f53\",\"terminal.ansiBrightRed\":\"#de3d3b\",\"terminal.ansiBrightGreen\":\"#08916a\",\"terminal.ansiBrightYellow\":\"#daaa01\",\"terminal.ansiBrightBlue\":\"#288ed7\",\"terminal.ansiBrightMagenta\":\"#d6438a\",\"terminal.ansiBrightCyan\":\"#2aa298\",\"terminal.ansiBrightWhite\":\"#f0f0f0\",\"selection.background\":\"#7a8181ad\",\"notifications.background\":\"#f0f0f0\",\"notifications.foreground\":\"#403f53\",\"notificationLink.foreground\":\"#994cc3\",\"notifications.border\":\"#cccccc\",\"notificationCenter.border\":\"#cccccc\",\"notificationToast.border\":\"#cccccc\",\"notificationCenterHeader.foreground\":\"#403f53\",\"notificationCenterHeader.background\":\"#f0f0f0\",\"input.border\":\"#d9d9d9\",\"progressBar.background\":\"#2aa298\",\"list.inactiveSelectionBackground\":\"#e0e7ea\",\"list.inactiveSelectionForeground\":\"#403f53\",\"list.focusBackground\":\"#d3e8f8\",\"list.hoverBackground\":\"#d3e8f8\",\"list.focusForeground\":\"#403f53\",\"list.hoverForeground\":\"#403f53\",\"list.highlightForeground\":\"#403f53\",\"list.errorForeground\":\"#e64d49\",\"list.warningForeground\":\"#daaa01\",\"activityBar.background\":\"#f0f0f0\",\"activityBar.foreground\":\"#403f53\",\"activityBar.dropBackground\":\"#d0d0d0\",\"activityBarBadge.background\":\"#403f53\",\"activityBarBadge.foreground\":\"#f0f0f0\",\"activityBar.border\":\"#f0f0f0\",\"sideBar.background\":\"#f0f0f0\",\"sideBar.foreground\":\"#403f53\",\"sideBarTitle.foreground\":\"#403f53\",\"sideBar.border\":\"#f0f0f0\",\"editorGroup.background\":\"#f6f6f6\",\"editorCursor.foreground\":\"#90a7b2\",\"editor.wordHighlightBackground\":\"#339cec33\",\"editor.wordHighlightStrongBackground\":\"#007dd659\",\"editor.lineHighlightBackground\":\"#f0f0f0\",\"editor.rangeHighlightBackground\":\"#7497a633\",\"editorWhitespace.foreground\":\"#d9d9d9\",\"editorIndentGuide.background\":\"#d9d9d9\",\"editorCodeLens.foreground\":\"#403f53\",\"editorBracketMatch.background\":\"#d3e8f8\",\"editorBracketMatch.border\":\"#2aa298\",\"editorError.border\":\"#fbfbfb\",\"editorWarning.border\":\"#daaa01\",\"editorGutter.addedBackground\":\"#49d0c5\",\"editorGutter.modifiedBackground\":\"#6fbef6\",\"editorGutter.deletedBackground\":\"#f76e6e\",\"editorRuler.foreground\":\"#d9d9d9\",\"editorOverviewRuler.errorForeground\":\"#e64d49\",\"editorOverviewRuler.warningForeground\":\"#daaa01\",\"editorSuggestWidget.background\":\"#f0f0f0\",\"editorSuggestWidget.foreground\":\"#403f53\",\"editorSuggestWidget.highlightForeground\":\"#403f53\",\"editorSuggestWidget.selectedBackground\":\"#d3e8f8\",\"editorSuggestWidget.border\":\"#d9d9d9\",\"debugExceptionWidget.background\":\"#f0f0f0\",\"debugExceptionWidget.border\":\"#d9d9d9\",\"editorMarkerNavigation.background\":\"#d0d0d0\",\"editorMarkerNavigationError.background\":\"#f76e6e\",\"editorMarkerNavigationWarning.background\":\"#daaa01\",\"debugToolBar.background\":\"#f0f0f0\",\"extensionButton.prominentBackground\":\"#2aa298\",\"extensionButton.prominentForeground\":\"#f0f0f0\",\"statusBar.background\":\"#f0f0f0\",\"statusBar.border\":\"#f0f0f0\",\"statusBar.debuggingBackground\":\"#f0f0f0\",\"statusBar.debuggingForeground\":\"#403f53\",\"statusBar.foreground\":\"#403f53\",\"statusBar.noFolderBackground\":\"#f0f0f0\",\"statusBar.noFolderForeground\":\"#403f53\",\"peekView.border\":\"#d9d9d9\",\"peekViewEditor.background\":\"#f6f6f6\",\"peekViewEditorGutter.background\":\"#f6f6f6\",\"peekViewEditor.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.background\":\"#f0f0f0\",\"peekViewResult.fileForeground\":\"#403f53\",\"peekViewResult.lineForeground\":\"#403f53\",\"peekViewResult.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.selectionBackground\":\"#e0e7ea\",\"peekViewResult.selectionForeground\":\"#403f53\",\"peekViewTitle.background\":\"#f0f0f0\",\"peekViewTitleLabel.foreground\":\"#403f53\",\"peekViewTitleDescription.foreground\":\"#403f53\",\"terminal.foreground\":\"#403f53\"},\"fg\":\"#403f53\",\"bg\":\"#f6f7f9\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#556484\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#ae3c3afd\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#403f53\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#5f636f\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#3a688f\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"foreground\":\"#bb2060\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#5d6376\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#58656a\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#646464\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#286d70\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword Operator Comparison, imports, returns and Keyword Operator Ruby\",\"scope\":[\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.module.ruby\",\"keyword.control.class.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Control Conditional\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"foreground\":\"#486e26\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#a64348\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#186e73\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#984e4d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#3e697c\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#555ea2\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#111111\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#7c5686\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Symbols\",\"scope\":[\"constant.language.symbol.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#954f5a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#403f53\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\",\"variable.other.property.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#76578b\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-7)\",\"terminalBackground\":\"var(--sl-color-gray-7)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-7)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#0000001a\",\"markBorderColor\":\"#00000055\"}}}],\"defaultLocale\":\"en\",\"cascadeLayer\":\"starlight.components\",\"styleOverrides\":{\"borderRadius\":\"0px\",\"borderWidth\":\"1px\",\"codePaddingBlock\":\"0.75rem\",\"codePaddingInline\":\"1rem\",\"codeFontFamily\":\"var(--__sl-font-mono)\",\"codeFontSize\":\"var(--sl-text-code)\",\"codeLineHeight\":\"var(--sl-line-height)\",\"uiFontFamily\":\"var(--__sl-font)\",\"textMarkers\":{\"lineDiffIndicatorMarginLeft\":\"0.25rem\",\"defaultChroma\":\"45\",\"backgroundOpacity\":\"60%\"}},\"plugins\":[{\"name\":\"Starlight Plugin\",\"hooks\":{}},{\"name\":\"astro-expressive-code\",\"hooks\":{}}]}]],\"remarkRehype\":{},\"gfm\":true,\"smartypants\":true},\"security\":{\"checkOrigin\":true,\"allowedDomains\":[],\"actionBodySizeLimit\":1048576},\"env\":{\"schema\":{},\"validateSecrets\":false},\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"headingIdCompat\":false,\"preserveScriptOrder\":false,\"liveContentCollections\":false,\"csp\":false,\"staticImportMetaEnv\":false,\"chromeDevtoolsWorkspace\":false,\"failOnPrerenderConflict\":false,\"svgo\":false},\"legacy\":{\"collections\":false},\"prefetch\":{\"prefetchAll\":true},\"i18n\":{\"defaultLocale\":\"en\",\"locales\":[\"en\"],\"routing\":{\"prefixDefaultLocale\":false,\"redirectToDefaultLocale\":false,\"fallbackType\":\"redirect\"}}}","docs",["Map",11,12,24,25,34,35,44,45,54,55,64,65,75,76],"01-backend-setup",{"id":11,"data":13,"body":21,"filePath":22,"digest":23,"deferredRender":15},{"title":14,"editUrl":15,"head":16,"template":17,"sidebar":18,"pagefind":15,"draft":19},"Backend Credentials",true,[],"doc",{"hidden":19,"attrs":20},false,{},"Before configuring any features, the backend needs to know your Vonage application credentials. These are stored in a `.env` file inside the `backend/` folder that **you must create manually** — they cannot be generated for you.\n\n## Create the File\n\nThe repo includes a `backend/.env.example` with all the required variables already listed. Copy it to create your own `.env`:\n\n```sh\ncp backend/.env.example backend/.env\n```\n\nThen open `backend/.env` and replace the placeholder values with your own:\n\n```sh\n# backend/.env\nVONAGE_APP_ID=your-vonage-application-id\nVONAGE_PRIVATE_KEY=./private.key\n```\n\n{% aside type=\"caution\" %}\nNever commit `backend/.env` to source control. The repo's `.gitignore` already excludes it, but double-check before pushing.\n{% /aside %}\n\n## Where to Get the Values\n\n| Variable | Where to find it |\n|----------|-----------------|\n| `VONAGE_APP_ID` | [Vonage Dashboard](https://dashboard.vonage.com) → Your Applications → the app you created for this project |\n| `VONAGE_PRIVATE_KEY` | The `private.key` file downloaded when you created the Vonage Application. Place it in the `backend/` folder and set the path to `./private.key` |\n\n## Verify\n\nOnce the file is saved, confirm its contents look correct:\n\n```sh\ncat backend/.env\n```\n\nYou should see your App ID and the key path. With credentials in place, let's look at the frontend configuration file.","src/content/docs/01-backend-setup.mdoc","82e037cbc96786a5","01-config-file-overview",{"id":24,"data":26,"body":31,"filePath":32,"digest":33,"deferredRender":15},{"title":27,"editUrl":15,"head":28,"template":17,"sidebar":29,"pagefind":15,"draft":19},"The Config File",[],{"hidden":19,"attrs":30},{},"All frontend settings for the Vonage Video React App live in a single file at the project root: **`vcrBuild.env.sh`**. This is the one place you need to go to control features, display defaults, and other frontend behaviour.\n\n## Where It Lives\n\n{% filetree %}\n\n- vcrBuild.env.sh ← All frontend configuration goes here\n- backend/\n - .env ← Backend credentials (separate)\n- frontend/\n- libs/\n\n{% /filetree %}\n\n{% aside %}\nBackend credentials (`VONAGE_APP_ID`, `VONAGE_PRIVATE_KEY`) live in `backend/.env`. This tutorial covers only **frontend** configuration in `vcrBuild.env.sh`.\n{% /aside %}\n\n## How It Works\n\n`vcrBuild.env.sh` is a shell script that exports environment variables. It is loaded automatically every time you run the app or trigger a build — you never need to source it manually.\n\n```bash\n# vcrBuild.env.sh\nexport ALLOW_CHAT=true\nexport ALLOW_ARCHIVING=true\nexport DEFAULT_LAYOUT_MODE='active-speaker'\n```\n\n## Opening the File\n\nOpen `vcrBuild.env.sh` in your editor:\n\n```sh\ncode vcrBuild.env.sh\n```\n\nThe defaults work out of the box — all major features are enabled and the resolution is set to 1280×720. You only need to edit the file when you want to change a specific behaviour.\n\n{% aside type=\"caution\" %}\nAfter editing `vcrBuild.env.sh` you must restart the app (`yarn dev`) or trigger a new build for the changes to take effect.\n{% /aside %}\n\nNow let's look at the feature flags you can control.","src/content/docs/01-config-file-overview.mdoc","52ff691e61eb09f2","02-feature-flags",{"id":34,"data":36,"body":41,"filePath":42,"digest":43,"deferredRender":15},{"title":37,"editUrl":15,"head":38,"template":17,"sidebar":39,"pagefind":15,"draft":19},"Feature Flags",[],{"hidden":19,"attrs":40},{},"Feature flags let you enable or disable specific capabilities of the app without changing any source code. Each flag is a boolean `true` / `false` value in `vcrBuild.env.sh`.\n\n## Media Controls\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ALLOW_CAMERA_CONTROL` | `true` | Show the camera on/off toggle |\n| `ALLOW_VIDEO_ON_JOIN` | `true` | Start with camera enabled when joining |\n| `ALLOW_MICROPHONE_CONTROL` | `true` | Show the microphone on/off toggle |\n| `ALLOW_AUDIO_ON_JOIN` | `true` | Start with microphone enabled when joining |\n| `ALLOW_ADVANCED_NOISE_SUPPRESSION` | `true` | Enable the advanced noise-suppression toggle |\n| `ALLOW_BACKGROUND_EFFECTS` | `true` | Enable virtual background and blur effects |\n\n## Device Selection\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `WAITING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors in the waiting room |\n| `MEETING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors inside the meeting room |\n\n## In-Call Features\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ALLOW_ARCHIVING` | `true` | Enable meeting recording |\n| `ALLOW_CAPTIONS` | `true` | Enable live captions |\n| `ALLOW_CHAT` | `true` | Enable the in-call group chat |\n| `ALLOW_EMOJIS` | `true` | Enable emoji reactions |\n| `ALLOW_SCREEN_SHARE` | `true` | Enable screen sharing |\n| `SHOW_PARTICIPANT_LIST` | `true` | Show the participant list panel |\n\n## Room Behaviour\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ENABLE_REPORT_ISSUE` | `false` | Show the in-call issue reporting tool |\n| `BYPASS_WAITING_ROOM` | `false` | Skip the waiting room and join directly |\n| `AVOID_FETCHING_APP_CONFIG` | `true` | Skip fetching remote app configuration on startup |\n\n## Example: Minimal Read-Only Viewer\n\nTo create a stripped-down experience with no interactive tools, you might disable several flags at once:\n\n```bash\n# vcrBuild.env.sh\nexport ALLOW_CHAT=false\nexport ALLOW_EMOJIS=false\nexport ALLOW_SCREEN_SHARE=false\nexport ALLOW_ARCHIVING=false\nexport ALLOW_CAPTIONS=false\nexport ENABLE_REPORT_ISSUE=false\nexport SHOW_PARTICIPANT_LIST=false\n```\n\n{% aside type=\"tip\" %}\nBackground effects (`ALLOW_BACKGROUND_EFFECTS`) are only supported in Chromium-based browsers. If your audience uses Firefox or Safari, consider disabling this flag to avoid showing an unsupported feature.\n{% /aside %}\n\nYou have reviewed all the feature flags. Next, you will look at display defaults like resolution and room layout.","src/content/docs/02-feature-flags.mdoc","964d0b09d64d3f3b","03-display-defaults",{"id":44,"data":46,"body":51,"filePath":52,"digest":53,"deferredRender":15},{"title":47,"editUrl":15,"head":48,"template":17,"sidebar":49,"pagefind":15,"draft":19},"Display Defaults",[],{"hidden":19,"attrs":50},{},"Beyond feature flags, `vcrBuild.env.sh` also controls the default visual and performance settings of the video room — the starting resolution, room layout, bitrate limits, and available frame rates.\n\n## Video Resolution\n\n`DEFAULT_RESOLUTION` sets the outgoing video resolution when a participant joins.\n\n| Value | Description |\n|-------|-------------|\n| `1920x1080` | Full HD |\n| `1280x960` | HD (4:3) |\n| `1280x720` | HD 720p **(default)** |\n| `640x480` | SD (4:3) |\n| `640x360` | SD 360p |\n| `320x240` | Low (4:3) |\n| `320x180` | Low 180p |\n\n```bash\nexport DEFAULT_RESOLUTION='1280x720'\n```\n\n## Room Layout\n\n`DEFAULT_LAYOUT_MODE` controls which layout is shown when a participant first enters the room.\n\n| Value | Description |\n|-------|-------------|\n| `active-speaker` | Highlights the current speaker **(default)** |\n| `grid` | Shows all participants in an equal grid |\n\n```bash\nexport DEFAULT_LAYOUT_MODE='active-speaker'\n```\n\n{% aside type=\"caution\" %}\nChanging `DEFAULT_LAYOUT_MODE` requires the participant to **rejoin the room** to take effect — a running session does not update dynamically.\n{% /aside %}\n\n## Custom Video Bitrate Range\n\nThese settings control the minimum and maximum selectable bitrate in the **Advanced Settings** dialog.\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `MIN_CUSTOM_VIDEO_BITRATE_BPS` | `5000` | Minimum selectable bitrate in bps |\n| `MAX_CUSTOM_VIDEO_BITRATE_BPS` | `10000000` | Maximum selectable bitrate in bps |\n\n```bash\nexport MIN_CUSTOM_VIDEO_BITRATE_BPS=5000\nexport MAX_CUSTOM_VIDEO_BITRATE_BPS=10000000\n```\n\n## Supported Frame Rates\n\n`SUPPORTED_FRAME_RATES` defines the frame rate options shown in the Advanced Settings video tab. Values are positive integers separated by `|`.\n\n```bash\nexport SUPPORTED_FRAME_RATES='30|15|7|1'\n```\n\n{% aside type=\"tip\" %}\nLowering `DEFAULT_RESOLUTION` or restricting `SUPPORTED_FRAME_RATES` can significantly reduce bandwidth usage — useful when you know participants may be on slower connections.\n{% /aside %}\n\nYou have configured the display defaults. In the next step, you will apply all your changes and verify them.","src/content/docs/03-display-defaults.mdoc","4d0ef6db3474a83b","04-apply-changes",{"id":54,"data":56,"body":61,"filePath":62,"digest":63,"deferredRender":15},{"title":57,"editUrl":15,"head":58,"template":17,"sidebar":59,"pagefind":15,"draft":19},"Apply Your Changes",[],{"hidden":19,"attrs":60},{},"With your feature flags and display defaults configured, this step shows you how to apply the changes and confirm they are working in the running app.\n\n## Save and Restart\n\nAfter editing `vcrBuild.env.sh`, save the file and restart the development server:\n\n```sh\nyarn dev\n```\n\nThis reloads both the backend server (port **3345**) and the frontend Vite dev server (port **5173**) with the updated configuration.\n\n{% aside type=\"caution\" %}\nSimply saving the file is not enough — the dev server must be restarted to pick up the new environment variable values.\n{% /aside %}\n\n## Verify in the Browser\n\nOpen [http://localhost:5173](http://localhost:5173) and check that your changes are reflected:\n\n{% steps %}\n\n1. Navigate to the **waiting room** — confirm device selectors appear or are hidden based on `WAITING_ROOM_ALLOW_DEVICE_SELECTION`.\n\n2. Join a meeting room — confirm the initial layout matches `DEFAULT_LAYOUT_MODE`.\n\n3. Check the toolbar — verify that toggles for chat, screen share, emojis, and archiving match your flag settings.\n\n4. Open **Advanced Settings** — confirm the resolution options and bitrate range reflect your `DEFAULT_RESOLUTION` and bitrate values.\n\n{% /steps %}\n\n## Flags That Require a Rejoin\n\nSome settings only take effect when a participant **rejoins** the room (not on live reload):\n\n- `DEFAULT_LAYOUT_MODE`\n- `ALLOW_AUDIO_ON_JOIN`\n- `ALLOW_VIDEO_ON_JOIN`\n\nIf you changed any of these, leave the room and re-enter to see the updated behaviour.\n\n## Iterating Quickly\n\nA typical configure-test cycle:\n\n{% steps %}\n\n1. Edit `vcrBuild.env.sh`.\n\n2. Stop the server with **Ctrl+C**.\n\n3. Run `yarn dev` to restart.\n\n4. Open the app and verify.\n\n{% /steps %}\n\nYour configuration is live. Head to the final step for further resources.","src/content/docs/04-apply-changes.mdoc","d2386412057c2165","05-whats-next",{"id":64,"data":66,"body":72,"filePath":73,"digest":74,"deferredRender":15},{"title":67,"description":68,"editUrl":15,"head":69,"template":17,"sidebar":70,"pagefind":15,"draft":19},"What's Next","Further resources for configuring and extending the Vonage Video React App.",[],{"hidden":19,"attrs":71},{},"Congratulations! You have successfully configured the Vonage Video React App's features and display defaults using `vcrBuild.env.sh`. The app is now tailored to your specific use case.\n\n## What You Accomplished\n\n- Understood how all frontend configuration flows through `vcrBuild.env.sh`\n- Enabled and disabled feature flags for media controls, in-call tools, and room behaviour\n- Configured display defaults including resolution, layout mode, bitrate, and frame rates\n- Applied your changes by restarting the dev server and verified them in the browser\n\n## Resources\n\n- [Vonage Developer Portal](https://developer.vonage.com) — Documentation, guides, and API references for all Vonage products.\n- [Vonage Video API Documentation](https://developer.vonage.com/en/video/overview) — In-depth guides for the Video API.\n- [vonage-video-react-app on GitHub](https://github.com/Vonage/vonage-video-react-app) — Source code, full README with all configuration options, and contribution guidelines.\n\n{% aside type=\"tip\" %}\nThe full list of frontend environment variables — including defaults, accepted values, and descriptions — is always available in the `vcrBuild.env.sh` file itself and in the project README.\n{% /aside %}","src/content/docs/05-whats-next.mdoc","7b6c777a7dd76a59","index",{"id":75,"data":77,"body":87,"filePath":88,"digest":89,"deferredRender":15},{"title":78,"description":79,"editUrl":15,"head":80,"template":81,"hero":82,"sidebar":85,"pagefind":15,"draft":19},"Vonage Video React App","Learn how to control the features and display settings of the Vonage Video React App using a single configuration file.",[],"splash",{"tagline":83,"actions":84},"Feature Config",[],{"hidden":19,"attrs":86},{},"The Vonage Video React App ships with a broad set of features — archiving, chat, screen sharing, emoji reactions, captions, and more. Every one of them can be turned on or off without touching any source code, using a single shell configuration file: **`vcrBuild.env.sh`**.\n\nIn this tutorial you will:\n\n- Understand how frontend configuration works in the app\n- Enable and disable feature flags to tailor the experience for your use case\n- Adjust display defaults such as video resolution and room layout\n- Apply your changes and verify them in the running app\n\n---\n\n## Tutorial structure\n\n| # | Page | What you'll do |\n| --- | --------------------------- | ------------------------------------------------------------- |\n| 01 | Backend credentials | Create `backend/.env` with your Vonage App ID and private key |\n| 02 | Configuration file overview | Explore `vcrBuild.env.sh` and understand its structure |\n| 03 | Feature flags | Enable and disable individual features |\n| 04 | Display settings | Adjust video resolution and default room layout |\n| 05 | Apply and verify | Rebuild the app and confirm your changes in the browser |","src/content/docs/index.mdx","bc349f319ac949f8"] \ No newline at end of file diff --git a/sources/vonage_video_react_app-feature-config/.astro/settings.json b/sources/vonage_video_react_app-feature-config/.astro/settings.json index 113877f8..04e40263 100644 --- a/sources/vonage_video_react_app-feature-config/.astro/settings.json +++ b/sources/vonage_video_react_app-feature-config/.astro/settings.json @@ -1,5 +1,5 @@ { "_variables": { - "lastUpdateCheck": 1782159370968 + "lastUpdateCheck": 1782297484374 } } \ No newline at end of file diff --git a/sources/vonage_video_react_app-feature-config/tutorial-config.json b/sources/vonage_video_react_app-feature-config/tutorial-config.json index abe45ac4..515af57d 100644 --- a/sources/vonage_video_react_app-feature-config/tutorial-config.json +++ b/sources/vonage_video_react_app-feature-config/tutorial-config.json @@ -5,7 +5,7 @@ "terminal", "browser" ], - "repository": "https://github.com/Vonage/vonage-video-react-app", + "repository": "https://github.com/VZaphod/vonage-video-react-app", "starterFiles": [], "capabilities": [], "version": "1.0.0", diff --git a/tutorials/vonage_video_react_app-feature-config/.astro/content-modules.mjs b/tutorials/vonage_video_react_app-feature-config/.astro/content-modules.mjs index 1d922d92..4773f6ec 100644 --- a/tutorials/vonage_video_react_app-feature-config/.astro/content-modules.mjs +++ b/tutorials/vonage_video_react_app-feature-config/.astro/content-modules.mjs @@ -1,11 +1,10 @@ export default new Map([ -["src/content/docs/index.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Findex.mdx&astroContentModuleFlag=true")], -["src/content/docs/reference.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Freference.mdoc&astroContentModuleFlag=true")], ["src/content/docs/01-backend-setup.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F01-backend-setup.mdoc&astroContentModuleFlag=true")], ["src/content/docs/01-config-file-overview.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F01-config-file-overview.mdoc&astroContentModuleFlag=true")], ["src/content/docs/02-feature-flags.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F02-feature-flags.mdoc&astroContentModuleFlag=true")], ["src/content/docs/03-display-defaults.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F03-display-defaults.mdoc&astroContentModuleFlag=true")], ["src/content/docs/04-apply-changes.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F04-apply-changes.mdoc&astroContentModuleFlag=true")], -["src/content/docs/05-whats-next.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F05-whats-next.mdoc&astroContentModuleFlag=true")]]); +["src/content/docs/05-whats-next.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F05-whats-next.mdoc&astroContentModuleFlag=true")], +["src/content/docs/index.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Findex.mdx&astroContentModuleFlag=true")]]); \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/.astro/data-store.json b/tutorials/vonage_video_react_app-feature-config/.astro/data-store.json index e8ac27a8..618653e2 100644 --- a/tutorials/vonage_video_react_app-feature-config/.astro/data-store.json +++ b/tutorials/vonage_video_react_app-feature-config/.astro/data-store.json @@ -1 +1 @@ -[["Map",1,2,9,10],"meta::meta",["Map",3,4,5,6,7,8],"astro-version","5.18.1","content-config-digest","a30a942a2ceda2e1","astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"compressHTML\":true,\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"static\",\"scopedStyleStrategy\":\"where\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":false,\"port\":4321,\"streaming\":true,\"allowedHosts\":[]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":false,\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[null,null,null],\"rehypePlugins\":[[null,{\"experimentalHeadingIdCompat\":false}],null,[null,{\"themes\":[{\"name\":\"Night Owl No Italics\",\"type\":\"dark\",\"colors\":{\"focusBorder\":\"#122d42\",\"foreground\":\"#d6deeb\",\"disabledForeground\":\"#cccccc80\",\"descriptionForeground\":\"#d6deebb3\",\"errorForeground\":\"#ef5350\",\"icon.foreground\":\"#c5c5c5\",\"contrastActiveBorder\":null,\"contrastBorder\":\"#122d42\",\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#4f4f4f\",\"textLink.activeForeground\":\"#3794ff\",\"textLink.foreground\":\"#3794ff\",\"textPreformat.foreground\":\"#d7ba7d\",\"textSeparator.foreground\":\"#ffffff2e\",\"editor.background\":\"#23262f\",\"editor.foreground\":\"#d6deeb\",\"editorLineNumber.foreground\":\"#4b6479\",\"editorLineNumber.activeForeground\":\"#c5e4fd\",\"editorActiveLineNumber.foreground\":\"#c6c6c6\",\"editor.selectionBackground\":\"#1d3b53\",\"editor.inactiveSelectionBackground\":\"#7e57c25a\",\"editor.selectionHighlightBackground\":\"#5f7e9779\",\"editorError.foreground\":\"#ef5350\",\"editorWarning.foreground\":\"#b39554\",\"editorInfo.foreground\":\"#3794ff\",\"editorHint.foreground\":\"#eeeeeeb2\",\"problemsErrorIcon.foreground\":\"#ef5350\",\"problemsWarningIcon.foreground\":\"#b39554\",\"problemsInfoIcon.foreground\":\"#3794ff\",\"editor.findMatchBackground\":\"#5f7e9779\",\"editor.findMatchHighlightBackground\":\"#1085bb5d\",\"editor.findRangeHighlightBackground\":\"#3a3d4166\",\"editorLink.activeForeground\":\"#4e94ce\",\"editorLightBulb.foreground\":\"#ffcc00\",\"editorLightBulbAutoFix.foreground\":\"#75beff\",\"diffEditor.insertedTextBackground\":\"#99b76d23\",\"diffEditor.insertedTextBorder\":\"#c5e47833\",\"diffEditor.removedTextBackground\":\"#ef535033\",\"diffEditor.removedTextBorder\":\"#ef53504d\",\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#011627\",\"editorStickyScrollHover.background\":\"#2a2d2e\",\"editorInlayHint.background\":\"#5f7e97cc\",\"editorInlayHint.foreground\":\"#ffffff\",\"editorInlayHint.typeBackground\":\"#5f7e97cc\",\"editorInlayHint.typeForeground\":\"#ffffff\",\"editorInlayHint.parameterBackground\":\"#5f7e97cc\",\"editorInlayHint.parameterForeground\":\"#ffffff\",\"editorPane.background\":\"#011627\",\"editorGroup.emptyBackground\":\"#011627\",\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-black)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#011627\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#011627\",\"editorGroup.dropBackground\":\"#7e57c273\",\"editorGroup.dropIntoPromptForeground\":\"#d6deeb\",\"editorGroup.dropIntoPromptBackground\":\"#021320\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#011627\",\"sideBySideEditor.verticalBorder\":\"#011627\",\"scrollbar.shadow\":\"#010b14\",\"scrollbarSlider.background\":\"#ffffff17\",\"scrollbarSlider.hoverBackground\":\"#ffffff40\",\"scrollbarSlider.activeBackground\":\"#084d8180\",\"panel.background\":\"#011627\",\"panel.border\":\"#5f7e97\",\"panelTitle.activeBorder\":\"#5f7e97\",\"panelTitle.activeForeground\":\"#ffffffcc\",\"panelTitle.inactiveForeground\":\"#d6deeb80\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#011627\",\"widget.shadow\":\"#011627\",\"editorWidget.background\":\"#021320\",\"editorWidget.foreground\":\"#d6deeb\",\"editorWidget.border\":\"#5f7e97\",\"quickInput.background\":\"#021320\",\"quickInput.foreground\":\"#d6deeb\",\"quickInputTitle.background\":\"#ffffff1a\",\"pickerGroup.foreground\":\"#d1aaff\",\"pickerGroup.border\":\"#011627\",\"editor.hoverHighlightBackground\":\"#7e57c25a\",\"editorHoverWidget.background\":\"#011627\",\"editorHoverWidget.foreground\":\"#d6deeb\",\"editorHoverWidget.border\":\"#5f7e97\",\"editorHoverWidget.statusBarBackground\":\"#011a2f\",\"titleBar.activeBackground\":\"var(--sl-color-black)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#010e1a\",\"titleBar.inactiveForeground\":\"#eeefff99\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#5a5d5e50\",\"toolbar.activeBackground\":\"#63666750\",\"tab.activeBackground\":\"#0b2942\",\"tab.unfocusedActiveBackground\":\"#0b2942\",\"tab.inactiveBackground\":\"#01111d\",\"tab.unfocusedInactiveBackground\":\"#01111d\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#5f7e97\",\"tab.unfocusedActiveForeground\":\"#5f7e97\",\"tab.unfocusedInactiveForeground\":\"#5f7e97\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#272b3b\",\"tab.lastPinnedBorder\":\"#585858\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":\"#262a39\",\"tab.activeBorderTop\":\"var(--sl-color-accent-high)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#3399cc\",\"tab.inactiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedActiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedInactiveModifiedBorder\":\"#3399cc40\",\"badge.background\":\"#5f7e97\",\"badge.foreground\":\"#ffffff\",\"button.background\":\"#7e57c2cc\",\"button.foreground\":\"#ffffffcc\",\"button.border\":\"#122d42\",\"button.separator\":\"#ffffff52\",\"button.hoverBackground\":\"#7e57c2\",\"button.secondaryBackground\":\"#3a3d41\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#46494e\",\"dropdown.background\":\"#011627\",\"dropdown.foreground\":\"#ffffffcc\",\"dropdown.border\":\"#5f7e97\",\"list.activeSelectionBackground\":\"#234d708c\",\"list.activeSelectionForeground\":\"#ffffff\",\"tree.indentGuidesStroke\":\"#585858\",\"input.background\":\"#0b253a\",\"input.foreground\":\"#ffffffcc\",\"input.placeholderForeground\":\"#5f7e97\",\"inputOption.activeBorder\":\"#ffffffcc\",\"inputOption.hoverBackground\":\"#5a5d5e80\",\"inputOption.activeBackground\":\"#122d4266\",\"inputOption.activeForeground\":\"#ffffff\",\"inputValidation.infoBackground\":\"#00589ef2\",\"inputValidation.infoBorder\":\"#64b5f6\",\"inputValidation.warningBackground\":\"#675700f2\",\"inputValidation.warningBorder\":\"#ffca28\",\"inputValidation.errorBackground\":\"#ab0300f2\",\"inputValidation.errorBorder\":\"#ef5350\",\"keybindingLabel.background\":\"#8080802b\",\"keybindingLabel.foreground\":\"#cccccc\",\"keybindingLabel.border\":\"#33333399\",\"keybindingLabel.bottomBorder\":\"#44444499\",\"menu.foreground\":\"#ffffffcc\",\"menu.background\":\"#011627\",\"menu.selectionForeground\":\"#ffffff\",\"menu.selectionBackground\":\"#234d708c\",\"menu.separatorBackground\":\"#606060\",\"editor.snippetTabstopHighlightBackground\":\"#7c7c74c\",\"editor.snippetFinalTabstopHighlightBorder\":\"#525252\",\"terminal.ansiBlack\":\"#011627\",\"terminal.ansiRed\":\"#ef5350\",\"terminal.ansiGreen\":\"#22da6e\",\"terminal.ansiYellow\":\"#c5e478\",\"terminal.ansiBlue\":\"#82aaff\",\"terminal.ansiMagenta\":\"#c792ea\",\"terminal.ansiCyan\":\"#21c7a8\",\"terminal.ansiWhite\":\"#ffffff\",\"terminal.ansiBrightBlack\":\"#575656\",\"terminal.ansiBrightRed\":\"#ef5350\",\"terminal.ansiBrightGreen\":\"#22da6e\",\"terminal.ansiBrightYellow\":\"#ffeb95\",\"terminal.ansiBrightBlue\":\"#82aaff\",\"terminal.ansiBrightMagenta\":\"#c792ea\",\"terminal.ansiBrightCyan\":\"#7fdbca\",\"terminal.ansiBrightWhite\":\"#ffffff\",\"selection.background\":\"#4373c2\",\"input.border\":\"#5f7e97\",\"punctuation.definition.generic.begin.html\":\"#ef5350f2\",\"progress.background\":\"#7e57c2\",\"breadcrumb.foreground\":\"#a599e9\",\"breadcrumb.focusForeground\":\"#ffffff\",\"breadcrumb.activeSelectionForeground\":\"#ffffff\",\"breadcrumbPicker.background\":\"#001122\",\"list.invalidItemForeground\":\"#975f94\",\"list.dropBackground\":\"#011627\",\"list.focusBackground\":\"#010d18\",\"list.focusForeground\":\"#ffffff\",\"list.highlightForeground\":\"#ffffff\",\"list.hoverBackground\":\"#011627\",\"list.hoverForeground\":\"#ffffff\",\"list.inactiveSelectionBackground\":\"#0e293f\",\"list.inactiveSelectionForeground\":\"#5f7e97\",\"activityBar.background\":\"#011627\",\"activityBar.dropBackground\":\"#5f7e97\",\"activityBar.foreground\":\"#5f7e97\",\"activityBar.border\":\"#011627\",\"activityBarBadge.background\":\"#44596b\",\"activityBarBadge.foreground\":\"#ffffff\",\"sideBar.background\":\"#011627\",\"sideBar.foreground\":\"#89a4bb\",\"sideBar.border\":\"#011627\",\"sideBarTitle.foreground\":\"#5f7e97\",\"sideBarSectionHeader.background\":\"#011627\",\"sideBarSectionHeader.foreground\":\"#5f7e97\",\"editorCursor.foreground\":\"#80a4c2\",\"editor.wordHighlightBackground\":\"#f6bbe533\",\"editor.wordHighlightStrongBackground\":\"#e2a2f433\",\"editor.lineHighlightBackground\":\"#0003\",\"editor.rangeHighlightBackground\":\"#7e57c25a\",\"editorIndentGuide.background\":\"#5e81ce52\",\"editorIndentGuide.activeBackground\":\"#7e97ac\",\"editorRuler.foreground\":\"#5e81ce52\",\"editorCodeLens.foreground\":\"#5e82ceb4\",\"editorBracketMatch.background\":\"#5f7e974d\",\"editorOverviewRuler.currentContentForeground\":\"#7e57c2\",\"editorOverviewRuler.incomingContentForeground\":\"#7e57c2\",\"editorOverviewRuler.commonContentForeground\":\"#7e57c2\",\"editorGutter.background\":\"#011627\",\"editorGutter.modifiedBackground\":\"#e2b93d\",\"editorGutter.addedBackground\":\"#9ccc65\",\"editorGutter.deletedBackground\":\"#ef5350\",\"editorSuggestWidget.background\":\"#2c3043\",\"editorSuggestWidget.border\":\"#2b2f40\",\"editorSuggestWidget.foreground\":\"#d6deeb\",\"editorSuggestWidget.highlightForeground\":\"#ffffff\",\"editorSuggestWidget.selectedBackground\":\"#5f7e97\",\"debugExceptionWidget.background\":\"#011627\",\"debugExceptionWidget.border\":\"#5f7e97\",\"editorMarkerNavigation.background\":\"#0b2942\",\"editorMarkerNavigationError.background\":\"#ef5350\",\"editorMarkerNavigationWarning.background\":\"#ffca28\",\"peekView.border\":\"#5f7e97\",\"peekViewEditor.background\":\"#011627\",\"peekViewEditor.matchHighlightBackground\":\"#7e57c25a\",\"peekViewResult.background\":\"#011627\",\"peekViewResult.fileForeground\":\"#5f7e97\",\"peekViewResult.lineForeground\":\"#5f7e97\",\"peekViewResult.matchHighlightBackground\":\"#ffffffcc\",\"peekViewResult.selectionBackground\":\"#2e3250\",\"peekViewResult.selectionForeground\":\"#5f7e97\",\"peekViewTitle.background\":\"#011627\",\"peekViewTitleDescription.foreground\":\"#697098\",\"peekViewTitleLabel.foreground\":\"#5f7e97\",\"merge.currentHeaderBackground\":\"#5f7e97\",\"merge.incomingHeaderBackground\":\"#7e57c25a\",\"statusBar.background\":\"#011627\",\"statusBar.foreground\":\"#5f7e97\",\"statusBar.border\":\"#262a39\",\"statusBar.debuggingBackground\":\"#202431\",\"statusBar.debuggingBorder\":\"#1f2330\",\"statusBar.noFolderBackground\":\"#011627\",\"statusBar.noFolderBorder\":\"#25293a\",\"statusBarItem.activeBackground\":\"#202431\",\"statusBarItem.hoverBackground\":\"#202431\",\"statusBarItem.prominentBackground\":\"#202431\",\"statusBarItem.prominentHoverBackground\":\"#202431\",\"notifications.background\":\"#01111d\",\"notifications.border\":\"#262a39\",\"notificationCenter.border\":\"#262a39\",\"notificationToast.border\":\"#262a39\",\"notifications.foreground\":\"#ffffffcc\",\"notificationLink.foreground\":\"#80cbc4\",\"extensionButton.prominentForeground\":\"#ffffffcc\",\"extensionButton.prominentBackground\":\"#7e57c2cc\",\"extensionButton.prominentHoverBackground\":\"#7e57c2\",\"terminal.selectionBackground\":\"#1b90dd4d\",\"terminalCursor.background\":\"#234d70\",\"debugToolBar.background\":\"#011627\",\"welcomePage.buttonBackground\":\"#011627\",\"welcomePage.buttonHoverBackground\":\"#011627\",\"walkThrough.embeddedEditorBackground\":\"#011627\",\"gitDecoration.modifiedResourceForeground\":\"#a2bffc\",\"gitDecoration.deletedResourceForeground\":\"#ef535090\",\"gitDecoration.untrackedResourceForeground\":\"#c5e478ff\",\"gitDecoration.ignoredResourceForeground\":\"#395a75\",\"gitDecoration.conflictingResourceForeground\":\"#ffeb95cc\",\"source.elm\":\"#5f7e97\",\"string.quoted.single.js\":\"#ffffff\",\"meta.objectliteral.js\":\"#82aaff\"},\"fg\":\"#d6deeb\",\"bg\":\"#23262f\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#a2bffc\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#f27775fe\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#d6deeb\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#919f9f\",\"fontStyle\":\"\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#5ca7e4\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#caece6\",\"fontStyle\":\"\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"fontStyle\":\"\",\"foreground\":\"#c5e478\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"background\":\"#ff2c83\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#d3423e\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#919f9f\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#cdebf7\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#ffffff\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#80cbc4\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#57eaf1\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#fad430\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#faf39f\",\"fontStyle\":\"\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#82aaff\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Comparison, returns, imports, and Keyword Operator Ruby\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#989da0\",\"background\":\"#F78C6C\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"background\":\"#8BD649\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#ec5f67\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#ef787f\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#31e1eb\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Unquoted String Zone\",\"scope\":[\"string.unquoted.preprocessor.message.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Region\",\"scope\":[\"punctuation.separator.hash.cs\",\"keyword.preprocessor.region.cs\",\"keyword.preprocessor.endregion.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"bold\"}},{\"name\":\"C# Other Variables\",\"scope\":[\"variable.other.object.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Enum\",\"scope\":[\"entity.name.type.enum.cs\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Dart String\",\"scope\":[\"string.interpolated.single.dart\",\"string.interpolated.double.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Dart Class\",\"scope\":[\"support.class.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#ff6d6d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#dddddd\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#e0dec6\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#6ae9f0\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#78ccf0\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#8b96ea\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#c789d6\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#ff869a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#d6deeb\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#8eace3\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#d7dbe0\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-6)\",\"terminalBackground\":\"var(--sl-color-gray-6)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-6)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#ffffff17\",\"markBorderColor\":\"#ffffff40\"}}},{\"name\":\"Night Owl Light\",\"type\":\"light\",\"colors\":{\"focusBorder\":\"#93a1a1\",\"foreground\":\"#403f53\",\"disabledForeground\":\"#61616180\",\"descriptionForeground\":\"#403f53\",\"errorForeground\":\"#403f53\",\"icon.foreground\":\"#424242\",\"contrastActiveBorder\":null,\"contrastBorder\":null,\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#dcdcdc66\",\"textLink.activeForeground\":\"#006ab1\",\"textLink.foreground\":\"#006ab1\",\"textPreformat.foreground\":\"#a31515\",\"textSeparator.foreground\":\"#0000002e\",\"editor.background\":\"#f6f7f9\",\"editor.foreground\":\"#403f53\",\"editorLineNumber.foreground\":\"#90a7b2\",\"editorLineNumber.activeForeground\":\"#403f53\",\"editorActiveLineNumber.foreground\":\"#0b216f\",\"editor.selectionBackground\":\"#e0e0e0\",\"editor.inactiveSelectionBackground\":\"#e0e0e080\",\"editor.selectionHighlightBackground\":\"#339cec33\",\"editorError.foreground\":\"#e64d49\",\"editorWarning.foreground\":\"#daaa01\",\"editorInfo.foreground\":\"#1a85ff\",\"editorHint.foreground\":\"#6c6c6c\",\"problemsErrorIcon.foreground\":\"#e64d49\",\"problemsWarningIcon.foreground\":\"#daaa01\",\"problemsInfoIcon.foreground\":\"#1a85ff\",\"editor.findMatchBackground\":\"#93a1a16c\",\"editor.findMatchHighlightBackground\":\"#93a1a16c\",\"editor.findRangeHighlightBackground\":\"#7497a633\",\"editorLink.activeForeground\":\"#0000ff\",\"editorLightBulb.foreground\":\"#ddb100\",\"editorLightBulbAutoFix.foreground\":\"#007acc\",\"diffEditor.insertedTextBackground\":\"#9ccc2c40\",\"diffEditor.insertedTextBorder\":null,\"diffEditor.removedTextBackground\":\"#ff000033\",\"diffEditor.removedTextBorder\":null,\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#fbfbfb\",\"editorStickyScrollHover.background\":\"#f0f0f0\",\"editorInlayHint.background\":\"#2aa29899\",\"editorInlayHint.foreground\":\"#f0f0f0\",\"editorInlayHint.typeBackground\":\"#2aa29899\",\"editorInlayHint.typeForeground\":\"#f0f0f0\",\"editorInlayHint.parameterBackground\":\"#2aa29899\",\"editorInlayHint.parameterForeground\":\"#f0f0f0\",\"editorPane.background\":\"#fbfbfb\",\"editorGroup.emptyBackground\":null,\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-gray-6)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#f0f0f0\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#f0f0f0\",\"editorGroup.dropBackground\":\"#2677cb2d\",\"editorGroup.dropIntoPromptForeground\":\"#403f53\",\"editorGroup.dropIntoPromptBackground\":\"#f0f0f0\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#f0f0f0\",\"sideBySideEditor.verticalBorder\":\"#f0f0f0\",\"scrollbar.shadow\":\"#cccccc\",\"scrollbarSlider.background\":\"#0000001a\",\"scrollbarSlider.hoverBackground\":\"#00000055\",\"scrollbarSlider.activeBackground\":\"#00000099\",\"panel.background\":\"#f0f0f0\",\"panel.border\":\"#d9d9d9\",\"panelTitle.activeBorder\":\"#424242\",\"panelTitle.activeForeground\":\"#424242\",\"panelTitle.inactiveForeground\":\"#424242bf\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#f6f6f6\",\"widget.shadow\":\"#d9d9d9\",\"editorWidget.background\":\"#f0f0f0\",\"editorWidget.foreground\":\"#403f53\",\"editorWidget.border\":\"#d9d9d9\",\"quickInput.background\":\"#f0f0f0\",\"quickInput.foreground\":\"#403f53\",\"quickInputTitle.background\":\"#0000000f\",\"pickerGroup.foreground\":\"#403f53\",\"pickerGroup.border\":\"#d9d9d9\",\"editor.hoverHighlightBackground\":\"#339cec33\",\"editorHoverWidget.background\":\"#f0f0f0\",\"editorHoverWidget.foreground\":\"#403f53\",\"editorHoverWidget.border\":\"#d9d9d9\",\"editorHoverWidget.statusBarBackground\":\"#e4e4e4\",\"titleBar.activeBackground\":\"var(--sl-color-gray-6)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#f0f0f099\",\"titleBar.inactiveForeground\":\"#33333399\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#b8b8b850\",\"toolbar.activeBackground\":\"#a6a6a650\",\"tab.activeBackground\":\"#f6f6f6\",\"tab.unfocusedActiveBackground\":\"#f6f6f6\",\"tab.inactiveBackground\":\"#f0f0f0\",\"tab.unfocusedInactiveBackground\":\"#f0f0f0\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#403f53\",\"tab.unfocusedActiveForeground\":\"#403f53b3\",\"tab.unfocusedInactiveForeground\":\"#403f5380\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#f0f0f0\",\"tab.lastPinnedBorder\":\"#a9a9a9\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":null,\"tab.activeBorderTop\":\"var(--sl-color-accent)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#2aa298\",\"tab.inactiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedActiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedInactiveModifiedBorder\":\"#93a1a1\",\"badge.background\":\"#2aa298\",\"badge.foreground\":\"#f0f0f0\",\"button.background\":\"#2aa298\",\"button.foreground\":\"#f0f0f0\",\"button.border\":null,\"button.separator\":\"#f0f0f066\",\"button.hoverBackground\":\"#22827a\",\"button.secondaryBackground\":\"#5f6a79\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#4c5561\",\"dropdown.background\":\"#f0f0f0\",\"dropdown.foreground\":\"#403f53\",\"dropdown.border\":\"#d9d9d9\",\"list.activeSelectionBackground\":\"#d3e8f8\",\"list.activeSelectionForeground\":\"#403f53\",\"tree.indentGuidesStroke\":\"#a9a9a9\",\"input.background\":\"#f0f0f0\",\"input.foreground\":\"#403f53\",\"input.placeholderForeground\":\"#93a1a1\",\"inputOption.activeBorder\":\"#2aa298\",\"inputOption.hoverBackground\":\"#b8b8b850\",\"inputOption.activeBackground\":\"#93a1a133\",\"inputOption.activeForeground\":\"#000000\",\"inputValidation.infoBackground\":\"#f0f0f0\",\"inputValidation.infoBorder\":\"#d0d0d0\",\"inputValidation.warningBackground\":\"#daaa01\",\"inputValidation.warningBorder\":\"#e0af02\",\"inputValidation.errorBackground\":\"#f76e6e\",\"inputValidation.errorBorder\":\"#de3d3b\",\"keybindingLabel.background\":\"#dddddd66\",\"keybindingLabel.foreground\":\"#555555\",\"keybindingLabel.border\":\"#cccccc66\",\"keybindingLabel.bottomBorder\":\"#bbbbbb66\",\"menu.foreground\":\"#403f53\",\"menu.background\":\"#f0f0f0\",\"menu.selectionForeground\":\"#403f53\",\"menu.selectionBackground\":\"#d3e8f8\",\"menu.separatorBackground\":\"#d4d4d4\",\"editor.snippetTabstopHighlightBackground\":\"#0a326433\",\"editor.snippetFinalTabstopHighlightBorder\":\"#0a326480\",\"terminal.ansiBlack\":\"#403f53\",\"terminal.ansiRed\":\"#de3d3b\",\"terminal.ansiGreen\":\"#08916a\",\"terminal.ansiYellow\":\"#e0af02\",\"terminal.ansiBlue\":\"#288ed7\",\"terminal.ansiMagenta\":\"#d6438a\",\"terminal.ansiCyan\":\"#2aa298\",\"terminal.ansiWhite\":\"#f0f0f0\",\"terminal.ansiBrightBlack\":\"#403f53\",\"terminal.ansiBrightRed\":\"#de3d3b\",\"terminal.ansiBrightGreen\":\"#08916a\",\"terminal.ansiBrightYellow\":\"#daaa01\",\"terminal.ansiBrightBlue\":\"#288ed7\",\"terminal.ansiBrightMagenta\":\"#d6438a\",\"terminal.ansiBrightCyan\":\"#2aa298\",\"terminal.ansiBrightWhite\":\"#f0f0f0\",\"selection.background\":\"#7a8181ad\",\"notifications.background\":\"#f0f0f0\",\"notifications.foreground\":\"#403f53\",\"notificationLink.foreground\":\"#994cc3\",\"notifications.border\":\"#cccccc\",\"notificationCenter.border\":\"#cccccc\",\"notificationToast.border\":\"#cccccc\",\"notificationCenterHeader.foreground\":\"#403f53\",\"notificationCenterHeader.background\":\"#f0f0f0\",\"input.border\":\"#d9d9d9\",\"progressBar.background\":\"#2aa298\",\"list.inactiveSelectionBackground\":\"#e0e7ea\",\"list.inactiveSelectionForeground\":\"#403f53\",\"list.focusBackground\":\"#d3e8f8\",\"list.hoverBackground\":\"#d3e8f8\",\"list.focusForeground\":\"#403f53\",\"list.hoverForeground\":\"#403f53\",\"list.highlightForeground\":\"#403f53\",\"list.errorForeground\":\"#e64d49\",\"list.warningForeground\":\"#daaa01\",\"activityBar.background\":\"#f0f0f0\",\"activityBar.foreground\":\"#403f53\",\"activityBar.dropBackground\":\"#d0d0d0\",\"activityBarBadge.background\":\"#403f53\",\"activityBarBadge.foreground\":\"#f0f0f0\",\"activityBar.border\":\"#f0f0f0\",\"sideBar.background\":\"#f0f0f0\",\"sideBar.foreground\":\"#403f53\",\"sideBarTitle.foreground\":\"#403f53\",\"sideBar.border\":\"#f0f0f0\",\"editorGroup.background\":\"#f6f6f6\",\"editorCursor.foreground\":\"#90a7b2\",\"editor.wordHighlightBackground\":\"#339cec33\",\"editor.wordHighlightStrongBackground\":\"#007dd659\",\"editor.lineHighlightBackground\":\"#f0f0f0\",\"editor.rangeHighlightBackground\":\"#7497a633\",\"editorWhitespace.foreground\":\"#d9d9d9\",\"editorIndentGuide.background\":\"#d9d9d9\",\"editorCodeLens.foreground\":\"#403f53\",\"editorBracketMatch.background\":\"#d3e8f8\",\"editorBracketMatch.border\":\"#2aa298\",\"editorError.border\":\"#fbfbfb\",\"editorWarning.border\":\"#daaa01\",\"editorGutter.addedBackground\":\"#49d0c5\",\"editorGutter.modifiedBackground\":\"#6fbef6\",\"editorGutter.deletedBackground\":\"#f76e6e\",\"editorRuler.foreground\":\"#d9d9d9\",\"editorOverviewRuler.errorForeground\":\"#e64d49\",\"editorOverviewRuler.warningForeground\":\"#daaa01\",\"editorSuggestWidget.background\":\"#f0f0f0\",\"editorSuggestWidget.foreground\":\"#403f53\",\"editorSuggestWidget.highlightForeground\":\"#403f53\",\"editorSuggestWidget.selectedBackground\":\"#d3e8f8\",\"editorSuggestWidget.border\":\"#d9d9d9\",\"debugExceptionWidget.background\":\"#f0f0f0\",\"debugExceptionWidget.border\":\"#d9d9d9\",\"editorMarkerNavigation.background\":\"#d0d0d0\",\"editorMarkerNavigationError.background\":\"#f76e6e\",\"editorMarkerNavigationWarning.background\":\"#daaa01\",\"debugToolBar.background\":\"#f0f0f0\",\"extensionButton.prominentBackground\":\"#2aa298\",\"extensionButton.prominentForeground\":\"#f0f0f0\",\"statusBar.background\":\"#f0f0f0\",\"statusBar.border\":\"#f0f0f0\",\"statusBar.debuggingBackground\":\"#f0f0f0\",\"statusBar.debuggingForeground\":\"#403f53\",\"statusBar.foreground\":\"#403f53\",\"statusBar.noFolderBackground\":\"#f0f0f0\",\"statusBar.noFolderForeground\":\"#403f53\",\"peekView.border\":\"#d9d9d9\",\"peekViewEditor.background\":\"#f6f6f6\",\"peekViewEditorGutter.background\":\"#f6f6f6\",\"peekViewEditor.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.background\":\"#f0f0f0\",\"peekViewResult.fileForeground\":\"#403f53\",\"peekViewResult.lineForeground\":\"#403f53\",\"peekViewResult.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.selectionBackground\":\"#e0e7ea\",\"peekViewResult.selectionForeground\":\"#403f53\",\"peekViewTitle.background\":\"#f0f0f0\",\"peekViewTitleLabel.foreground\":\"#403f53\",\"peekViewTitleDescription.foreground\":\"#403f53\",\"terminal.foreground\":\"#403f53\"},\"fg\":\"#403f53\",\"bg\":\"#f6f7f9\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#556484\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#ae3c3afd\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#403f53\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#5f636f\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#3a688f\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"foreground\":\"#bb2060\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#5d6376\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#58656a\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#646464\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#286d70\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword Operator Comparison, imports, returns and Keyword Operator Ruby\",\"scope\":[\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.module.ruby\",\"keyword.control.class.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Control Conditional\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"foreground\":\"#486e26\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#a64348\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#186e73\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#984e4d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#3e697c\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#555ea2\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#111111\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#7c5686\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Symbols\",\"scope\":[\"constant.language.symbol.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#954f5a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#403f53\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\",\"variable.other.property.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#76578b\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-7)\",\"terminalBackground\":\"var(--sl-color-gray-7)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-7)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#0000001a\",\"markBorderColor\":\"#00000055\"}}}],\"defaultLocale\":\"en\",\"cascadeLayer\":\"starlight.components\",\"styleOverrides\":{\"borderRadius\":\"0px\",\"borderWidth\":\"1px\",\"codePaddingBlock\":\"0.75rem\",\"codePaddingInline\":\"1rem\",\"codeFontFamily\":\"var(--__sl-font-mono)\",\"codeFontSize\":\"var(--sl-text-code)\",\"codeLineHeight\":\"var(--sl-line-height)\",\"uiFontFamily\":\"var(--__sl-font)\",\"textMarkers\":{\"lineDiffIndicatorMarginLeft\":\"0.25rem\",\"defaultChroma\":\"45\",\"backgroundOpacity\":\"60%\"}},\"plugins\":[{\"name\":\"Starlight Plugin\",\"hooks\":{}},{\"name\":\"astro-expressive-code\",\"hooks\":{}}]}]],\"remarkRehype\":{},\"gfm\":true,\"smartypants\":true},\"security\":{\"checkOrigin\":true,\"allowedDomains\":[],\"actionBodySizeLimit\":1048576},\"env\":{\"schema\":{},\"validateSecrets\":false},\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"headingIdCompat\":false,\"preserveScriptOrder\":false,\"liveContentCollections\":false,\"csp\":false,\"staticImportMetaEnv\":false,\"chromeDevtoolsWorkspace\":false,\"failOnPrerenderConflict\":false,\"svgo\":false},\"legacy\":{\"collections\":false},\"prefetch\":{\"prefetchAll\":true},\"i18n\":{\"defaultLocale\":\"en\",\"locales\":[\"en\"],\"routing\":{\"prefixDefaultLocale\":false,\"redirectToDefaultLocale\":false,\"fallbackType\":\"redirect\"}}}","docs",["Map",11,12,28,29,39,40,49,50,59,60,69,70,79,80],"index",{"id":11,"data":13,"body":25,"filePath":26,"digest":27,"deferredRender":16},{"title":14,"description":15,"editUrl":16,"head":17,"template":18,"hero":19,"sidebar":22,"pagefind":16,"draft":23},"Vonage Video React App","Learn how to control the features and display settings of the Vonage Video React App using a single configuration file.",true,[],"splash",{"tagline":20,"actions":21},"Feature Config",[],{"hidden":23,"attrs":24},false,{},"The Vonage Video React App ships with a broad set of features — archiving, chat, screen sharing, emoji reactions, captions, and more. Every one of them can be turned on or off without touching any source code, using a single shell configuration file: **`vcrBuild.env.sh`**.\n\nIn this tutorial you will:\n\n- Understand how frontend configuration works in the app\n- Enable and disable feature flags to tailor the experience for your use case\n- Adjust display defaults such as video resolution and room layout\n- Apply your changes and verify them in the running app\n\n---\n\n## Tutorial structure\n\n| # | Page | What you'll do |\n| --- | --------------------------- | ------------------------------------------------------------- |\n| 01 | Backend credentials | Create `backend/.env` with your Vonage App ID and private key |\n| 02 | Configuration file overview | Explore `vcrBuild.env.sh` and understand its structure |\n| 03 | Feature flags | Enable and disable individual features |\n| 04 | Display settings | Adjust video resolution and default room layout |\n| 05 | Apply and verify | Rebuild the app and confirm your changes in the browser |","src/content/docs/index.mdx","bc349f319ac949f8","01-backend-setup",{"id":28,"data":30,"body":36,"filePath":37,"digest":38,"deferredRender":16},{"title":31,"editUrl":16,"head":32,"template":33,"sidebar":34,"pagefind":16,"draft":23},"Backend Credentials",[],"doc",{"hidden":23,"attrs":35},{},"Before configuring any features, the backend needs to know your Vonage application credentials. These are stored in a `.env` file inside the `backend/` folder that **you must create manually** — they cannot be generated for you.\n\n## Create the File\n\nThe repo includes a `backend/.env.example` with all the required variables already listed. Copy it to create your own `.env`:\n\n```sh\ncp backend/.env.example backend/.env\n```\n\nThen open `backend/.env` and replace the placeholder values with your own:\n\n```sh\n# backend/.env\nVONAGE_APP_ID=your-vonage-application-id\nVONAGE_PRIVATE_KEY=./private.key\n```\n\n{% aside type=\"caution\" %}\nNever commit `backend/.env` to source control. The repo's `.gitignore` already excludes it, but double-check before pushing.\n{% /aside %}\n\n## Where to Get the Values\n\n| Variable | Where to find it |\n|----------|-----------------|\n| `VONAGE_APP_ID` | [Vonage Dashboard](https://dashboard.vonage.com) → Your Applications → the app you created for this project |\n| `VONAGE_PRIVATE_KEY` | The `private.key` file downloaded when you created the Vonage Application. Place it in the `backend/` folder and set the path to `./private.key` |\n\n## Verify\n\nOnce the file is saved, confirm its contents look correct:\n\n```sh\ncat backend/.env\n```\n\nYou should see your App ID and the key path. With credentials in place, let's look at the frontend configuration file.","src/content/docs/01-backend-setup.mdoc","82e037cbc96786a5","01-config-file-overview",{"id":39,"data":41,"body":46,"filePath":47,"digest":48,"deferredRender":16},{"title":42,"editUrl":16,"head":43,"template":33,"sidebar":44,"pagefind":16,"draft":23},"The Config File",[],{"hidden":23,"attrs":45},{},"All frontend settings for the Vonage Video React App live in a single file at the project root: **`vcrBuild.env.sh`**. This is the one place you need to go to control features, display defaults, and other frontend behaviour.\n\n## Where It Lives\n\n{% filetree %}\n\n- vcrBuild.env.sh ← All frontend configuration goes here\n- backend/\n - .env ← Backend credentials (separate)\n- frontend/\n- libs/\n\n{% /filetree %}\n\n{% aside %}\nBackend credentials (`VONAGE_APP_ID`, `VONAGE_PRIVATE_KEY`) live in `backend/.env`. This tutorial covers only **frontend** configuration in `vcrBuild.env.sh`.\n{% /aside %}\n\n## How It Works\n\n`vcrBuild.env.sh` is a shell script that exports environment variables. It is loaded automatically every time you run the app or trigger a build — you never need to source it manually.\n\n```bash\n# vcrBuild.env.sh\nexport ALLOW_CHAT=true\nexport ALLOW_ARCHIVING=true\nexport DEFAULT_LAYOUT_MODE='active-speaker'\n```\n\n## Opening the File\n\nOpen `vcrBuild.env.sh` in your editor:\n\n```sh\ncode vcrBuild.env.sh\n```\n\nThe defaults work out of the box — all major features are enabled and the resolution is set to 1280×720. You only need to edit the file when you want to change a specific behaviour.\n\n{% aside type=\"caution\" %}\nAfter editing `vcrBuild.env.sh` you must restart the app (`yarn dev`) or trigger a new build for the changes to take effect.\n{% /aside %}\n\nNow let's look at the feature flags you can control.","src/content/docs/01-config-file-overview.mdoc","52ff691e61eb09f2","02-feature-flags",{"id":49,"data":51,"body":56,"filePath":57,"digest":58,"deferredRender":16},{"title":52,"editUrl":16,"head":53,"template":33,"sidebar":54,"pagefind":16,"draft":23},"Feature Flags",[],{"hidden":23,"attrs":55},{},"Feature flags let you enable or disable specific capabilities of the app without changing any source code. Each flag is a boolean `true` / `false` value in `vcrBuild.env.sh`.\n\n## Media Controls\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ALLOW_CAMERA_CONTROL` | `true` | Show the camera on/off toggle |\n| `ALLOW_VIDEO_ON_JOIN` | `true` | Start with camera enabled when joining |\n| `ALLOW_MICROPHONE_CONTROL` | `true` | Show the microphone on/off toggle |\n| `ALLOW_AUDIO_ON_JOIN` | `true` | Start with microphone enabled when joining |\n| `ALLOW_ADVANCED_NOISE_SUPPRESSION` | `true` | Enable the advanced noise-suppression toggle |\n| `ALLOW_BACKGROUND_EFFECTS` | `true` | Enable virtual background and blur effects |\n\n## Device Selection\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `WAITING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors in the waiting room |\n| `MEETING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors inside the meeting room |\n\n## In-Call Features\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ALLOW_ARCHIVING` | `true` | Enable meeting recording |\n| `ALLOW_CAPTIONS` | `true` | Enable live captions |\n| `ALLOW_CHAT` | `true` | Enable the in-call group chat |\n| `ALLOW_EMOJIS` | `true` | Enable emoji reactions |\n| `ALLOW_SCREEN_SHARE` | `true` | Enable screen sharing |\n| `SHOW_PARTICIPANT_LIST` | `true` | Show the participant list panel |\n\n## Room Behaviour\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ENABLE_REPORT_ISSUE` | `false` | Show the in-call issue reporting tool |\n| `BYPASS_WAITING_ROOM` | `false` | Skip the waiting room and join directly |\n| `AVOID_FETCHING_APP_CONFIG` | `true` | Skip fetching remote app configuration on startup |\n\n## Example: Minimal Read-Only Viewer\n\nTo create a stripped-down experience with no interactive tools, you might disable several flags at once:\n\n```bash\n# vcrBuild.env.sh\nexport ALLOW_CHAT=false\nexport ALLOW_EMOJIS=false\nexport ALLOW_SCREEN_SHARE=false\nexport ALLOW_ARCHIVING=false\nexport ALLOW_CAPTIONS=false\nexport ENABLE_REPORT_ISSUE=false\nexport SHOW_PARTICIPANT_LIST=false\n```\n\n{% aside type=\"tip\" %}\nBackground effects (`ALLOW_BACKGROUND_EFFECTS`) are only supported in Chromium-based browsers. If your audience uses Firefox or Safari, consider disabling this flag to avoid showing an unsupported feature.\n{% /aside %}\n\nYou have reviewed all the feature flags. Next, you will look at display defaults like resolution and room layout.","src/content/docs/02-feature-flags.mdoc","964d0b09d64d3f3b","03-display-defaults",{"id":59,"data":61,"body":66,"filePath":67,"digest":68,"deferredRender":16},{"title":62,"editUrl":16,"head":63,"template":33,"sidebar":64,"pagefind":16,"draft":23},"Display Defaults",[],{"hidden":23,"attrs":65},{},"Beyond feature flags, `vcrBuild.env.sh` also controls the default visual and performance settings of the video room — the starting resolution, room layout, bitrate limits, and available frame rates.\n\n## Video Resolution\n\n`DEFAULT_RESOLUTION` sets the outgoing video resolution when a participant joins.\n\n| Value | Description |\n|-------|-------------|\n| `1920x1080` | Full HD |\n| `1280x960` | HD (4:3) |\n| `1280x720` | HD 720p **(default)** |\n| `640x480` | SD (4:3) |\n| `640x360` | SD 360p |\n| `320x240` | Low (4:3) |\n| `320x180` | Low 180p |\n\n```bash\nexport DEFAULT_RESOLUTION='1280x720'\n```\n\n## Room Layout\n\n`DEFAULT_LAYOUT_MODE` controls which layout is shown when a participant first enters the room.\n\n| Value | Description |\n|-------|-------------|\n| `active-speaker` | Highlights the current speaker **(default)** |\n| `grid` | Shows all participants in an equal grid |\n\n```bash\nexport DEFAULT_LAYOUT_MODE='active-speaker'\n```\n\n{% aside type=\"caution\" %}\nChanging `DEFAULT_LAYOUT_MODE` requires the participant to **rejoin the room** to take effect — a running session does not update dynamically.\n{% /aside %}\n\n## Custom Video Bitrate Range\n\nThese settings control the minimum and maximum selectable bitrate in the **Advanced Settings** dialog.\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `MIN_CUSTOM_VIDEO_BITRATE_BPS` | `5000` | Minimum selectable bitrate in bps |\n| `MAX_CUSTOM_VIDEO_BITRATE_BPS` | `10000000` | Maximum selectable bitrate in bps |\n\n```bash\nexport MIN_CUSTOM_VIDEO_BITRATE_BPS=5000\nexport MAX_CUSTOM_VIDEO_BITRATE_BPS=10000000\n```\n\n## Supported Frame Rates\n\n`SUPPORTED_FRAME_RATES` defines the frame rate options shown in the Advanced Settings video tab. Values are positive integers separated by `|`.\n\n```bash\nexport SUPPORTED_FRAME_RATES='30|15|7|1'\n```\n\n{% aside type=\"tip\" %}\nLowering `DEFAULT_RESOLUTION` or restricting `SUPPORTED_FRAME_RATES` can significantly reduce bandwidth usage — useful when you know participants may be on slower connections.\n{% /aside %}\n\nYou have configured the display defaults. In the next step, you will apply all your changes and verify them.","src/content/docs/03-display-defaults.mdoc","4d0ef6db3474a83b","04-apply-changes",{"id":69,"data":71,"body":76,"filePath":77,"digest":78,"deferredRender":16},{"title":72,"editUrl":16,"head":73,"template":33,"sidebar":74,"pagefind":16,"draft":23},"Apply Your Changes",[],{"hidden":23,"attrs":75},{},"With your feature flags and display defaults configured, this step shows you how to apply the changes and confirm they are working in the running app.\n\n## Save and Restart\n\nAfter editing `vcrBuild.env.sh`, save the file and restart the development server:\n\n```sh\nyarn dev\n```\n\nThis reloads both the backend server (port **3345**) and the frontend Vite dev server (port **5173**) with the updated configuration.\n\n{% aside type=\"caution\" %}\nSimply saving the file is not enough — the dev server must be restarted to pick up the new environment variable values.\n{% /aside %}\n\n## Verify in the Browser\n\nOpen [http://localhost:5173](http://localhost:5173) and check that your changes are reflected:\n\n{% steps %}\n\n1. Navigate to the **waiting room** — confirm device selectors appear or are hidden based on `WAITING_ROOM_ALLOW_DEVICE_SELECTION`.\n\n2. Join a meeting room — confirm the initial layout matches `DEFAULT_LAYOUT_MODE`.\n\n3. Check the toolbar — verify that toggles for chat, screen share, emojis, and archiving match your flag settings.\n\n4. Open **Advanced Settings** — confirm the resolution options and bitrate range reflect your `DEFAULT_RESOLUTION` and bitrate values.\n\n{% /steps %}\n\n## Flags That Require a Rejoin\n\nSome settings only take effect when a participant **rejoins** the room (not on live reload):\n\n- `DEFAULT_LAYOUT_MODE`\n- `ALLOW_AUDIO_ON_JOIN`\n- `ALLOW_VIDEO_ON_JOIN`\n\nIf you changed any of these, leave the room and re-enter to see the updated behaviour.\n\n## Iterating Quickly\n\nA typical configure-test cycle:\n\n{% steps %}\n\n1. Edit `vcrBuild.env.sh`.\n\n2. Stop the server with **Ctrl+C**.\n\n3. Run `yarn dev` to restart.\n\n4. Open the app and verify.\n\n{% /steps %}\n\nYour configuration is live. Head to the final step for further resources.","src/content/docs/04-apply-changes.mdoc","d2386412057c2165","05-whats-next",{"id":79,"data":81,"body":87,"filePath":88,"digest":89,"deferredRender":16},{"title":82,"description":83,"editUrl":16,"head":84,"template":33,"sidebar":85,"pagefind":16,"draft":23},"What's Next","Further resources for configuring and extending the Vonage Video React App.",[],{"hidden":23,"attrs":86},{},"Congratulations! You have successfully configured the Vonage Video React App's features and display defaults using `vcrBuild.env.sh`. The app is now tailored to your specific use case.\n\n## What You Accomplished\n\n- Understood how all frontend configuration flows through `vcrBuild.env.sh`\n- Enabled and disabled feature flags for media controls, in-call tools, and room behaviour\n- Configured display defaults including resolution, layout mode, bitrate, and frame rates\n- Applied your changes by restarting the dev server and verified them in the browser\n\n## Resources\n\n- [Vonage Developer Portal](https://developer.vonage.com) — Documentation, guides, and API references for all Vonage products.\n- [Vonage Video API Documentation](https://developer.vonage.com/en/video/overview) — In-depth guides for the Video API.\n- [vonage-video-react-app on GitHub](https://github.com/Vonage/vonage-video-react-app) — Source code, full README with all configuration options, and contribution guidelines.\n\n{% aside type=\"tip\" %}\nThe full list of frontend environment variables — including defaults, accepted values, and descriptions — is always available in the `vcrBuild.env.sh` file itself and in the project README.\n{% /aside %}","src/content/docs/05-whats-next.mdoc","7b6c777a7dd76a59"] \ No newline at end of file +[["Map",1,2,9,10],"meta::meta",["Map",3,4,5,6,7,8],"astro-version","5.18.1","content-config-digest","a30a942a2ceda2e1","astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"compressHTML\":true,\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"static\",\"scopedStyleStrategy\":\"where\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":false,\"port\":4321,\"streaming\":true,\"allowedHosts\":[]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":false,\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[null,null,null],\"rehypePlugins\":[[null,{\"experimentalHeadingIdCompat\":false}],null,[null,{\"themes\":[{\"name\":\"Night Owl No Italics\",\"type\":\"dark\",\"colors\":{\"focusBorder\":\"#122d42\",\"foreground\":\"#d6deeb\",\"disabledForeground\":\"#cccccc80\",\"descriptionForeground\":\"#d6deebb3\",\"errorForeground\":\"#ef5350\",\"icon.foreground\":\"#c5c5c5\",\"contrastActiveBorder\":null,\"contrastBorder\":\"#122d42\",\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#4f4f4f\",\"textLink.activeForeground\":\"#3794ff\",\"textLink.foreground\":\"#3794ff\",\"textPreformat.foreground\":\"#d7ba7d\",\"textSeparator.foreground\":\"#ffffff2e\",\"editor.background\":\"#23262f\",\"editor.foreground\":\"#d6deeb\",\"editorLineNumber.foreground\":\"#4b6479\",\"editorLineNumber.activeForeground\":\"#c5e4fd\",\"editorActiveLineNumber.foreground\":\"#c6c6c6\",\"editor.selectionBackground\":\"#1d3b53\",\"editor.inactiveSelectionBackground\":\"#7e57c25a\",\"editor.selectionHighlightBackground\":\"#5f7e9779\",\"editorError.foreground\":\"#ef5350\",\"editorWarning.foreground\":\"#b39554\",\"editorInfo.foreground\":\"#3794ff\",\"editorHint.foreground\":\"#eeeeeeb2\",\"problemsErrorIcon.foreground\":\"#ef5350\",\"problemsWarningIcon.foreground\":\"#b39554\",\"problemsInfoIcon.foreground\":\"#3794ff\",\"editor.findMatchBackground\":\"#5f7e9779\",\"editor.findMatchHighlightBackground\":\"#1085bb5d\",\"editor.findRangeHighlightBackground\":\"#3a3d4166\",\"editorLink.activeForeground\":\"#4e94ce\",\"editorLightBulb.foreground\":\"#ffcc00\",\"editorLightBulbAutoFix.foreground\":\"#75beff\",\"diffEditor.insertedTextBackground\":\"#99b76d23\",\"diffEditor.insertedTextBorder\":\"#c5e47833\",\"diffEditor.removedTextBackground\":\"#ef535033\",\"diffEditor.removedTextBorder\":\"#ef53504d\",\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#011627\",\"editorStickyScrollHover.background\":\"#2a2d2e\",\"editorInlayHint.background\":\"#5f7e97cc\",\"editorInlayHint.foreground\":\"#ffffff\",\"editorInlayHint.typeBackground\":\"#5f7e97cc\",\"editorInlayHint.typeForeground\":\"#ffffff\",\"editorInlayHint.parameterBackground\":\"#5f7e97cc\",\"editorInlayHint.parameterForeground\":\"#ffffff\",\"editorPane.background\":\"#011627\",\"editorGroup.emptyBackground\":\"#011627\",\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-black)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#011627\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#011627\",\"editorGroup.dropBackground\":\"#7e57c273\",\"editorGroup.dropIntoPromptForeground\":\"#d6deeb\",\"editorGroup.dropIntoPromptBackground\":\"#021320\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#011627\",\"sideBySideEditor.verticalBorder\":\"#011627\",\"scrollbar.shadow\":\"#010b14\",\"scrollbarSlider.background\":\"#ffffff17\",\"scrollbarSlider.hoverBackground\":\"#ffffff40\",\"scrollbarSlider.activeBackground\":\"#084d8180\",\"panel.background\":\"#011627\",\"panel.border\":\"#5f7e97\",\"panelTitle.activeBorder\":\"#5f7e97\",\"panelTitle.activeForeground\":\"#ffffffcc\",\"panelTitle.inactiveForeground\":\"#d6deeb80\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#011627\",\"widget.shadow\":\"#011627\",\"editorWidget.background\":\"#021320\",\"editorWidget.foreground\":\"#d6deeb\",\"editorWidget.border\":\"#5f7e97\",\"quickInput.background\":\"#021320\",\"quickInput.foreground\":\"#d6deeb\",\"quickInputTitle.background\":\"#ffffff1a\",\"pickerGroup.foreground\":\"#d1aaff\",\"pickerGroup.border\":\"#011627\",\"editor.hoverHighlightBackground\":\"#7e57c25a\",\"editorHoverWidget.background\":\"#011627\",\"editorHoverWidget.foreground\":\"#d6deeb\",\"editorHoverWidget.border\":\"#5f7e97\",\"editorHoverWidget.statusBarBackground\":\"#011a2f\",\"titleBar.activeBackground\":\"var(--sl-color-black)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#010e1a\",\"titleBar.inactiveForeground\":\"#eeefff99\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#5a5d5e50\",\"toolbar.activeBackground\":\"#63666750\",\"tab.activeBackground\":\"#0b2942\",\"tab.unfocusedActiveBackground\":\"#0b2942\",\"tab.inactiveBackground\":\"#01111d\",\"tab.unfocusedInactiveBackground\":\"#01111d\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#5f7e97\",\"tab.unfocusedActiveForeground\":\"#5f7e97\",\"tab.unfocusedInactiveForeground\":\"#5f7e97\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#272b3b\",\"tab.lastPinnedBorder\":\"#585858\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":\"#262a39\",\"tab.activeBorderTop\":\"var(--sl-color-accent-high)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#3399cc\",\"tab.inactiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedActiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedInactiveModifiedBorder\":\"#3399cc40\",\"badge.background\":\"#5f7e97\",\"badge.foreground\":\"#ffffff\",\"button.background\":\"#7e57c2cc\",\"button.foreground\":\"#ffffffcc\",\"button.border\":\"#122d42\",\"button.separator\":\"#ffffff52\",\"button.hoverBackground\":\"#7e57c2\",\"button.secondaryBackground\":\"#3a3d41\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#46494e\",\"dropdown.background\":\"#011627\",\"dropdown.foreground\":\"#ffffffcc\",\"dropdown.border\":\"#5f7e97\",\"list.activeSelectionBackground\":\"#234d708c\",\"list.activeSelectionForeground\":\"#ffffff\",\"tree.indentGuidesStroke\":\"#585858\",\"input.background\":\"#0b253a\",\"input.foreground\":\"#ffffffcc\",\"input.placeholderForeground\":\"#5f7e97\",\"inputOption.activeBorder\":\"#ffffffcc\",\"inputOption.hoverBackground\":\"#5a5d5e80\",\"inputOption.activeBackground\":\"#122d4266\",\"inputOption.activeForeground\":\"#ffffff\",\"inputValidation.infoBackground\":\"#00589ef2\",\"inputValidation.infoBorder\":\"#64b5f6\",\"inputValidation.warningBackground\":\"#675700f2\",\"inputValidation.warningBorder\":\"#ffca28\",\"inputValidation.errorBackground\":\"#ab0300f2\",\"inputValidation.errorBorder\":\"#ef5350\",\"keybindingLabel.background\":\"#8080802b\",\"keybindingLabel.foreground\":\"#cccccc\",\"keybindingLabel.border\":\"#33333399\",\"keybindingLabel.bottomBorder\":\"#44444499\",\"menu.foreground\":\"#ffffffcc\",\"menu.background\":\"#011627\",\"menu.selectionForeground\":\"#ffffff\",\"menu.selectionBackground\":\"#234d708c\",\"menu.separatorBackground\":\"#606060\",\"editor.snippetTabstopHighlightBackground\":\"#7c7c74c\",\"editor.snippetFinalTabstopHighlightBorder\":\"#525252\",\"terminal.ansiBlack\":\"#011627\",\"terminal.ansiRed\":\"#ef5350\",\"terminal.ansiGreen\":\"#22da6e\",\"terminal.ansiYellow\":\"#c5e478\",\"terminal.ansiBlue\":\"#82aaff\",\"terminal.ansiMagenta\":\"#c792ea\",\"terminal.ansiCyan\":\"#21c7a8\",\"terminal.ansiWhite\":\"#ffffff\",\"terminal.ansiBrightBlack\":\"#575656\",\"terminal.ansiBrightRed\":\"#ef5350\",\"terminal.ansiBrightGreen\":\"#22da6e\",\"terminal.ansiBrightYellow\":\"#ffeb95\",\"terminal.ansiBrightBlue\":\"#82aaff\",\"terminal.ansiBrightMagenta\":\"#c792ea\",\"terminal.ansiBrightCyan\":\"#7fdbca\",\"terminal.ansiBrightWhite\":\"#ffffff\",\"selection.background\":\"#4373c2\",\"input.border\":\"#5f7e97\",\"punctuation.definition.generic.begin.html\":\"#ef5350f2\",\"progress.background\":\"#7e57c2\",\"breadcrumb.foreground\":\"#a599e9\",\"breadcrumb.focusForeground\":\"#ffffff\",\"breadcrumb.activeSelectionForeground\":\"#ffffff\",\"breadcrumbPicker.background\":\"#001122\",\"list.invalidItemForeground\":\"#975f94\",\"list.dropBackground\":\"#011627\",\"list.focusBackground\":\"#010d18\",\"list.focusForeground\":\"#ffffff\",\"list.highlightForeground\":\"#ffffff\",\"list.hoverBackground\":\"#011627\",\"list.hoverForeground\":\"#ffffff\",\"list.inactiveSelectionBackground\":\"#0e293f\",\"list.inactiveSelectionForeground\":\"#5f7e97\",\"activityBar.background\":\"#011627\",\"activityBar.dropBackground\":\"#5f7e97\",\"activityBar.foreground\":\"#5f7e97\",\"activityBar.border\":\"#011627\",\"activityBarBadge.background\":\"#44596b\",\"activityBarBadge.foreground\":\"#ffffff\",\"sideBar.background\":\"#011627\",\"sideBar.foreground\":\"#89a4bb\",\"sideBar.border\":\"#011627\",\"sideBarTitle.foreground\":\"#5f7e97\",\"sideBarSectionHeader.background\":\"#011627\",\"sideBarSectionHeader.foreground\":\"#5f7e97\",\"editorCursor.foreground\":\"#80a4c2\",\"editor.wordHighlightBackground\":\"#f6bbe533\",\"editor.wordHighlightStrongBackground\":\"#e2a2f433\",\"editor.lineHighlightBackground\":\"#0003\",\"editor.rangeHighlightBackground\":\"#7e57c25a\",\"editorIndentGuide.background\":\"#5e81ce52\",\"editorIndentGuide.activeBackground\":\"#7e97ac\",\"editorRuler.foreground\":\"#5e81ce52\",\"editorCodeLens.foreground\":\"#5e82ceb4\",\"editorBracketMatch.background\":\"#5f7e974d\",\"editorOverviewRuler.currentContentForeground\":\"#7e57c2\",\"editorOverviewRuler.incomingContentForeground\":\"#7e57c2\",\"editorOverviewRuler.commonContentForeground\":\"#7e57c2\",\"editorGutter.background\":\"#011627\",\"editorGutter.modifiedBackground\":\"#e2b93d\",\"editorGutter.addedBackground\":\"#9ccc65\",\"editorGutter.deletedBackground\":\"#ef5350\",\"editorSuggestWidget.background\":\"#2c3043\",\"editorSuggestWidget.border\":\"#2b2f40\",\"editorSuggestWidget.foreground\":\"#d6deeb\",\"editorSuggestWidget.highlightForeground\":\"#ffffff\",\"editorSuggestWidget.selectedBackground\":\"#5f7e97\",\"debugExceptionWidget.background\":\"#011627\",\"debugExceptionWidget.border\":\"#5f7e97\",\"editorMarkerNavigation.background\":\"#0b2942\",\"editorMarkerNavigationError.background\":\"#ef5350\",\"editorMarkerNavigationWarning.background\":\"#ffca28\",\"peekView.border\":\"#5f7e97\",\"peekViewEditor.background\":\"#011627\",\"peekViewEditor.matchHighlightBackground\":\"#7e57c25a\",\"peekViewResult.background\":\"#011627\",\"peekViewResult.fileForeground\":\"#5f7e97\",\"peekViewResult.lineForeground\":\"#5f7e97\",\"peekViewResult.matchHighlightBackground\":\"#ffffffcc\",\"peekViewResult.selectionBackground\":\"#2e3250\",\"peekViewResult.selectionForeground\":\"#5f7e97\",\"peekViewTitle.background\":\"#011627\",\"peekViewTitleDescription.foreground\":\"#697098\",\"peekViewTitleLabel.foreground\":\"#5f7e97\",\"merge.currentHeaderBackground\":\"#5f7e97\",\"merge.incomingHeaderBackground\":\"#7e57c25a\",\"statusBar.background\":\"#011627\",\"statusBar.foreground\":\"#5f7e97\",\"statusBar.border\":\"#262a39\",\"statusBar.debuggingBackground\":\"#202431\",\"statusBar.debuggingBorder\":\"#1f2330\",\"statusBar.noFolderBackground\":\"#011627\",\"statusBar.noFolderBorder\":\"#25293a\",\"statusBarItem.activeBackground\":\"#202431\",\"statusBarItem.hoverBackground\":\"#202431\",\"statusBarItem.prominentBackground\":\"#202431\",\"statusBarItem.prominentHoverBackground\":\"#202431\",\"notifications.background\":\"#01111d\",\"notifications.border\":\"#262a39\",\"notificationCenter.border\":\"#262a39\",\"notificationToast.border\":\"#262a39\",\"notifications.foreground\":\"#ffffffcc\",\"notificationLink.foreground\":\"#80cbc4\",\"extensionButton.prominentForeground\":\"#ffffffcc\",\"extensionButton.prominentBackground\":\"#7e57c2cc\",\"extensionButton.prominentHoverBackground\":\"#7e57c2\",\"terminal.selectionBackground\":\"#1b90dd4d\",\"terminalCursor.background\":\"#234d70\",\"debugToolBar.background\":\"#011627\",\"welcomePage.buttonBackground\":\"#011627\",\"welcomePage.buttonHoverBackground\":\"#011627\",\"walkThrough.embeddedEditorBackground\":\"#011627\",\"gitDecoration.modifiedResourceForeground\":\"#a2bffc\",\"gitDecoration.deletedResourceForeground\":\"#ef535090\",\"gitDecoration.untrackedResourceForeground\":\"#c5e478ff\",\"gitDecoration.ignoredResourceForeground\":\"#395a75\",\"gitDecoration.conflictingResourceForeground\":\"#ffeb95cc\",\"source.elm\":\"#5f7e97\",\"string.quoted.single.js\":\"#ffffff\",\"meta.objectliteral.js\":\"#82aaff\"},\"fg\":\"#d6deeb\",\"bg\":\"#23262f\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#a2bffc\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#f27775fe\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#d6deeb\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#919f9f\",\"fontStyle\":\"\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#5ca7e4\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#caece6\",\"fontStyle\":\"\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"fontStyle\":\"\",\"foreground\":\"#c5e478\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"background\":\"#ff2c83\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#d3423e\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#919f9f\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#cdebf7\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#ffffff\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#80cbc4\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#57eaf1\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#fad430\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#faf39f\",\"fontStyle\":\"\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#82aaff\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Comparison, returns, imports, and Keyword Operator Ruby\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#989da0\",\"background\":\"#F78C6C\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"background\":\"#8BD649\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#ec5f67\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#ef787f\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#31e1eb\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Unquoted String Zone\",\"scope\":[\"string.unquoted.preprocessor.message.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Region\",\"scope\":[\"punctuation.separator.hash.cs\",\"keyword.preprocessor.region.cs\",\"keyword.preprocessor.endregion.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"bold\"}},{\"name\":\"C# Other Variables\",\"scope\":[\"variable.other.object.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Enum\",\"scope\":[\"entity.name.type.enum.cs\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Dart String\",\"scope\":[\"string.interpolated.single.dart\",\"string.interpolated.double.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Dart Class\",\"scope\":[\"support.class.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#ff6d6d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#dddddd\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#e0dec6\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#6ae9f0\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#78ccf0\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#8b96ea\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#c789d6\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#ff869a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#d6deeb\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#8eace3\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#d7dbe0\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-6)\",\"terminalBackground\":\"var(--sl-color-gray-6)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-6)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#ffffff17\",\"markBorderColor\":\"#ffffff40\"}}},{\"name\":\"Night Owl Light\",\"type\":\"light\",\"colors\":{\"focusBorder\":\"#93a1a1\",\"foreground\":\"#403f53\",\"disabledForeground\":\"#61616180\",\"descriptionForeground\":\"#403f53\",\"errorForeground\":\"#403f53\",\"icon.foreground\":\"#424242\",\"contrastActiveBorder\":null,\"contrastBorder\":null,\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#dcdcdc66\",\"textLink.activeForeground\":\"#006ab1\",\"textLink.foreground\":\"#006ab1\",\"textPreformat.foreground\":\"#a31515\",\"textSeparator.foreground\":\"#0000002e\",\"editor.background\":\"#f6f7f9\",\"editor.foreground\":\"#403f53\",\"editorLineNumber.foreground\":\"#90a7b2\",\"editorLineNumber.activeForeground\":\"#403f53\",\"editorActiveLineNumber.foreground\":\"#0b216f\",\"editor.selectionBackground\":\"#e0e0e0\",\"editor.inactiveSelectionBackground\":\"#e0e0e080\",\"editor.selectionHighlightBackground\":\"#339cec33\",\"editorError.foreground\":\"#e64d49\",\"editorWarning.foreground\":\"#daaa01\",\"editorInfo.foreground\":\"#1a85ff\",\"editorHint.foreground\":\"#6c6c6c\",\"problemsErrorIcon.foreground\":\"#e64d49\",\"problemsWarningIcon.foreground\":\"#daaa01\",\"problemsInfoIcon.foreground\":\"#1a85ff\",\"editor.findMatchBackground\":\"#93a1a16c\",\"editor.findMatchHighlightBackground\":\"#93a1a16c\",\"editor.findRangeHighlightBackground\":\"#7497a633\",\"editorLink.activeForeground\":\"#0000ff\",\"editorLightBulb.foreground\":\"#ddb100\",\"editorLightBulbAutoFix.foreground\":\"#007acc\",\"diffEditor.insertedTextBackground\":\"#9ccc2c40\",\"diffEditor.insertedTextBorder\":null,\"diffEditor.removedTextBackground\":\"#ff000033\",\"diffEditor.removedTextBorder\":null,\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#fbfbfb\",\"editorStickyScrollHover.background\":\"#f0f0f0\",\"editorInlayHint.background\":\"#2aa29899\",\"editorInlayHint.foreground\":\"#f0f0f0\",\"editorInlayHint.typeBackground\":\"#2aa29899\",\"editorInlayHint.typeForeground\":\"#f0f0f0\",\"editorInlayHint.parameterBackground\":\"#2aa29899\",\"editorInlayHint.parameterForeground\":\"#f0f0f0\",\"editorPane.background\":\"#fbfbfb\",\"editorGroup.emptyBackground\":null,\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-gray-6)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#f0f0f0\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#f0f0f0\",\"editorGroup.dropBackground\":\"#2677cb2d\",\"editorGroup.dropIntoPromptForeground\":\"#403f53\",\"editorGroup.dropIntoPromptBackground\":\"#f0f0f0\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#f0f0f0\",\"sideBySideEditor.verticalBorder\":\"#f0f0f0\",\"scrollbar.shadow\":\"#cccccc\",\"scrollbarSlider.background\":\"#0000001a\",\"scrollbarSlider.hoverBackground\":\"#00000055\",\"scrollbarSlider.activeBackground\":\"#00000099\",\"panel.background\":\"#f0f0f0\",\"panel.border\":\"#d9d9d9\",\"panelTitle.activeBorder\":\"#424242\",\"panelTitle.activeForeground\":\"#424242\",\"panelTitle.inactiveForeground\":\"#424242bf\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#f6f6f6\",\"widget.shadow\":\"#d9d9d9\",\"editorWidget.background\":\"#f0f0f0\",\"editorWidget.foreground\":\"#403f53\",\"editorWidget.border\":\"#d9d9d9\",\"quickInput.background\":\"#f0f0f0\",\"quickInput.foreground\":\"#403f53\",\"quickInputTitle.background\":\"#0000000f\",\"pickerGroup.foreground\":\"#403f53\",\"pickerGroup.border\":\"#d9d9d9\",\"editor.hoverHighlightBackground\":\"#339cec33\",\"editorHoverWidget.background\":\"#f0f0f0\",\"editorHoverWidget.foreground\":\"#403f53\",\"editorHoverWidget.border\":\"#d9d9d9\",\"editorHoverWidget.statusBarBackground\":\"#e4e4e4\",\"titleBar.activeBackground\":\"var(--sl-color-gray-6)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#f0f0f099\",\"titleBar.inactiveForeground\":\"#33333399\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#b8b8b850\",\"toolbar.activeBackground\":\"#a6a6a650\",\"tab.activeBackground\":\"#f6f6f6\",\"tab.unfocusedActiveBackground\":\"#f6f6f6\",\"tab.inactiveBackground\":\"#f0f0f0\",\"tab.unfocusedInactiveBackground\":\"#f0f0f0\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#403f53\",\"tab.unfocusedActiveForeground\":\"#403f53b3\",\"tab.unfocusedInactiveForeground\":\"#403f5380\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#f0f0f0\",\"tab.lastPinnedBorder\":\"#a9a9a9\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":null,\"tab.activeBorderTop\":\"var(--sl-color-accent)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#2aa298\",\"tab.inactiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedActiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedInactiveModifiedBorder\":\"#93a1a1\",\"badge.background\":\"#2aa298\",\"badge.foreground\":\"#f0f0f0\",\"button.background\":\"#2aa298\",\"button.foreground\":\"#f0f0f0\",\"button.border\":null,\"button.separator\":\"#f0f0f066\",\"button.hoverBackground\":\"#22827a\",\"button.secondaryBackground\":\"#5f6a79\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#4c5561\",\"dropdown.background\":\"#f0f0f0\",\"dropdown.foreground\":\"#403f53\",\"dropdown.border\":\"#d9d9d9\",\"list.activeSelectionBackground\":\"#d3e8f8\",\"list.activeSelectionForeground\":\"#403f53\",\"tree.indentGuidesStroke\":\"#a9a9a9\",\"input.background\":\"#f0f0f0\",\"input.foreground\":\"#403f53\",\"input.placeholderForeground\":\"#93a1a1\",\"inputOption.activeBorder\":\"#2aa298\",\"inputOption.hoverBackground\":\"#b8b8b850\",\"inputOption.activeBackground\":\"#93a1a133\",\"inputOption.activeForeground\":\"#000000\",\"inputValidation.infoBackground\":\"#f0f0f0\",\"inputValidation.infoBorder\":\"#d0d0d0\",\"inputValidation.warningBackground\":\"#daaa01\",\"inputValidation.warningBorder\":\"#e0af02\",\"inputValidation.errorBackground\":\"#f76e6e\",\"inputValidation.errorBorder\":\"#de3d3b\",\"keybindingLabel.background\":\"#dddddd66\",\"keybindingLabel.foreground\":\"#555555\",\"keybindingLabel.border\":\"#cccccc66\",\"keybindingLabel.bottomBorder\":\"#bbbbbb66\",\"menu.foreground\":\"#403f53\",\"menu.background\":\"#f0f0f0\",\"menu.selectionForeground\":\"#403f53\",\"menu.selectionBackground\":\"#d3e8f8\",\"menu.separatorBackground\":\"#d4d4d4\",\"editor.snippetTabstopHighlightBackground\":\"#0a326433\",\"editor.snippetFinalTabstopHighlightBorder\":\"#0a326480\",\"terminal.ansiBlack\":\"#403f53\",\"terminal.ansiRed\":\"#de3d3b\",\"terminal.ansiGreen\":\"#08916a\",\"terminal.ansiYellow\":\"#e0af02\",\"terminal.ansiBlue\":\"#288ed7\",\"terminal.ansiMagenta\":\"#d6438a\",\"terminal.ansiCyan\":\"#2aa298\",\"terminal.ansiWhite\":\"#f0f0f0\",\"terminal.ansiBrightBlack\":\"#403f53\",\"terminal.ansiBrightRed\":\"#de3d3b\",\"terminal.ansiBrightGreen\":\"#08916a\",\"terminal.ansiBrightYellow\":\"#daaa01\",\"terminal.ansiBrightBlue\":\"#288ed7\",\"terminal.ansiBrightMagenta\":\"#d6438a\",\"terminal.ansiBrightCyan\":\"#2aa298\",\"terminal.ansiBrightWhite\":\"#f0f0f0\",\"selection.background\":\"#7a8181ad\",\"notifications.background\":\"#f0f0f0\",\"notifications.foreground\":\"#403f53\",\"notificationLink.foreground\":\"#994cc3\",\"notifications.border\":\"#cccccc\",\"notificationCenter.border\":\"#cccccc\",\"notificationToast.border\":\"#cccccc\",\"notificationCenterHeader.foreground\":\"#403f53\",\"notificationCenterHeader.background\":\"#f0f0f0\",\"input.border\":\"#d9d9d9\",\"progressBar.background\":\"#2aa298\",\"list.inactiveSelectionBackground\":\"#e0e7ea\",\"list.inactiveSelectionForeground\":\"#403f53\",\"list.focusBackground\":\"#d3e8f8\",\"list.hoverBackground\":\"#d3e8f8\",\"list.focusForeground\":\"#403f53\",\"list.hoverForeground\":\"#403f53\",\"list.highlightForeground\":\"#403f53\",\"list.errorForeground\":\"#e64d49\",\"list.warningForeground\":\"#daaa01\",\"activityBar.background\":\"#f0f0f0\",\"activityBar.foreground\":\"#403f53\",\"activityBar.dropBackground\":\"#d0d0d0\",\"activityBarBadge.background\":\"#403f53\",\"activityBarBadge.foreground\":\"#f0f0f0\",\"activityBar.border\":\"#f0f0f0\",\"sideBar.background\":\"#f0f0f0\",\"sideBar.foreground\":\"#403f53\",\"sideBarTitle.foreground\":\"#403f53\",\"sideBar.border\":\"#f0f0f0\",\"editorGroup.background\":\"#f6f6f6\",\"editorCursor.foreground\":\"#90a7b2\",\"editor.wordHighlightBackground\":\"#339cec33\",\"editor.wordHighlightStrongBackground\":\"#007dd659\",\"editor.lineHighlightBackground\":\"#f0f0f0\",\"editor.rangeHighlightBackground\":\"#7497a633\",\"editorWhitespace.foreground\":\"#d9d9d9\",\"editorIndentGuide.background\":\"#d9d9d9\",\"editorCodeLens.foreground\":\"#403f53\",\"editorBracketMatch.background\":\"#d3e8f8\",\"editorBracketMatch.border\":\"#2aa298\",\"editorError.border\":\"#fbfbfb\",\"editorWarning.border\":\"#daaa01\",\"editorGutter.addedBackground\":\"#49d0c5\",\"editorGutter.modifiedBackground\":\"#6fbef6\",\"editorGutter.deletedBackground\":\"#f76e6e\",\"editorRuler.foreground\":\"#d9d9d9\",\"editorOverviewRuler.errorForeground\":\"#e64d49\",\"editorOverviewRuler.warningForeground\":\"#daaa01\",\"editorSuggestWidget.background\":\"#f0f0f0\",\"editorSuggestWidget.foreground\":\"#403f53\",\"editorSuggestWidget.highlightForeground\":\"#403f53\",\"editorSuggestWidget.selectedBackground\":\"#d3e8f8\",\"editorSuggestWidget.border\":\"#d9d9d9\",\"debugExceptionWidget.background\":\"#f0f0f0\",\"debugExceptionWidget.border\":\"#d9d9d9\",\"editorMarkerNavigation.background\":\"#d0d0d0\",\"editorMarkerNavigationError.background\":\"#f76e6e\",\"editorMarkerNavigationWarning.background\":\"#daaa01\",\"debugToolBar.background\":\"#f0f0f0\",\"extensionButton.prominentBackground\":\"#2aa298\",\"extensionButton.prominentForeground\":\"#f0f0f0\",\"statusBar.background\":\"#f0f0f0\",\"statusBar.border\":\"#f0f0f0\",\"statusBar.debuggingBackground\":\"#f0f0f0\",\"statusBar.debuggingForeground\":\"#403f53\",\"statusBar.foreground\":\"#403f53\",\"statusBar.noFolderBackground\":\"#f0f0f0\",\"statusBar.noFolderForeground\":\"#403f53\",\"peekView.border\":\"#d9d9d9\",\"peekViewEditor.background\":\"#f6f6f6\",\"peekViewEditorGutter.background\":\"#f6f6f6\",\"peekViewEditor.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.background\":\"#f0f0f0\",\"peekViewResult.fileForeground\":\"#403f53\",\"peekViewResult.lineForeground\":\"#403f53\",\"peekViewResult.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.selectionBackground\":\"#e0e7ea\",\"peekViewResult.selectionForeground\":\"#403f53\",\"peekViewTitle.background\":\"#f0f0f0\",\"peekViewTitleLabel.foreground\":\"#403f53\",\"peekViewTitleDescription.foreground\":\"#403f53\",\"terminal.foreground\":\"#403f53\"},\"fg\":\"#403f53\",\"bg\":\"#f6f7f9\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#556484\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#ae3c3afd\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#403f53\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#5f636f\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#3a688f\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"foreground\":\"#bb2060\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#5d6376\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#58656a\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#646464\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#286d70\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword Operator Comparison, imports, returns and Keyword Operator Ruby\",\"scope\":[\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.module.ruby\",\"keyword.control.class.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Control Conditional\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"foreground\":\"#486e26\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#a64348\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#186e73\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#984e4d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#3e697c\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#555ea2\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#111111\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#7c5686\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Symbols\",\"scope\":[\"constant.language.symbol.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#954f5a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#403f53\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\",\"variable.other.property.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#76578b\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-7)\",\"terminalBackground\":\"var(--sl-color-gray-7)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-7)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#0000001a\",\"markBorderColor\":\"#00000055\"}}}],\"defaultLocale\":\"en\",\"cascadeLayer\":\"starlight.components\",\"styleOverrides\":{\"borderRadius\":\"0px\",\"borderWidth\":\"1px\",\"codePaddingBlock\":\"0.75rem\",\"codePaddingInline\":\"1rem\",\"codeFontFamily\":\"var(--__sl-font-mono)\",\"codeFontSize\":\"var(--sl-text-code)\",\"codeLineHeight\":\"var(--sl-line-height)\",\"uiFontFamily\":\"var(--__sl-font)\",\"textMarkers\":{\"lineDiffIndicatorMarginLeft\":\"0.25rem\",\"defaultChroma\":\"45\",\"backgroundOpacity\":\"60%\"}},\"plugins\":[{\"name\":\"Starlight Plugin\",\"hooks\":{}},{\"name\":\"astro-expressive-code\",\"hooks\":{}}]}]],\"remarkRehype\":{},\"gfm\":true,\"smartypants\":true},\"security\":{\"checkOrigin\":true,\"allowedDomains\":[],\"actionBodySizeLimit\":1048576},\"env\":{\"schema\":{},\"validateSecrets\":false},\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"headingIdCompat\":false,\"preserveScriptOrder\":false,\"liveContentCollections\":false,\"csp\":false,\"staticImportMetaEnv\":false,\"chromeDevtoolsWorkspace\":false,\"failOnPrerenderConflict\":false,\"svgo\":false},\"legacy\":{\"collections\":false},\"prefetch\":{\"prefetchAll\":true},\"i18n\":{\"defaultLocale\":\"en\",\"locales\":[\"en\"],\"routing\":{\"prefixDefaultLocale\":false,\"redirectToDefaultLocale\":false,\"fallbackType\":\"redirect\"}}}","docs",["Map",11,12,24,25,34,35,44,45,54,55,64,65,75,76],"01-backend-setup",{"id":11,"data":13,"body":21,"filePath":22,"digest":23,"deferredRender":15},{"title":14,"editUrl":15,"head":16,"template":17,"sidebar":18,"pagefind":15,"draft":19},"Backend Credentials",true,[],"doc",{"hidden":19,"attrs":20},false,{},"Before configuring any features, the backend needs to know your Vonage application credentials. These are stored in a `.env` file inside the `backend/` folder that **you must create manually** — they cannot be generated for you.\n\n## Create the File\n\nThe repo includes a `backend/.env.example` with all the required variables already listed. Copy it to create your own `.env`:\n\n```sh\ncp backend/.env.example backend/.env\n```\n\nThen open `backend/.env` and replace the placeholder values with your own:\n\n```sh\n# backend/.env\nVONAGE_APP_ID=your-vonage-application-id\nVONAGE_PRIVATE_KEY=./private.key\n```\n\n{% aside type=\"caution\" %}\nNever commit `backend/.env` to source control. The repo's `.gitignore` already excludes it, but double-check before pushing.\n{% /aside %}\n\n## Where to Get the Values\n\n| Variable | Where to find it |\n|----------|-----------------|\n| `VONAGE_APP_ID` | [Vonage Dashboard](https://dashboard.vonage.com) → Your Applications → the app you created for this project |\n| `VONAGE_PRIVATE_KEY` | The `private.key` file downloaded when you created the Vonage Application. Place it in the `backend/` folder and set the path to `./private.key` |\n\n## Verify\n\nOnce the file is saved, confirm its contents look correct:\n\n```sh\ncat backend/.env\n```\n\nYou should see your App ID and the key path. With credentials in place, let's look at the frontend configuration file.","src/content/docs/01-backend-setup.mdoc","82e037cbc96786a5","01-config-file-overview",{"id":24,"data":26,"body":31,"filePath":32,"digest":33,"deferredRender":15},{"title":27,"editUrl":15,"head":28,"template":17,"sidebar":29,"pagefind":15,"draft":19},"The Config File",[],{"hidden":19,"attrs":30},{},"All frontend settings for the Vonage Video React App live in a single file at the project root: **`vcrBuild.env.sh`**. This is the one place you need to go to control features, display defaults, and other frontend behaviour.\n\n## Where It Lives\n\n{% filetree %}\n\n- vcrBuild.env.sh ← All frontend configuration goes here\n- backend/\n - .env ← Backend credentials (separate)\n- frontend/\n- libs/\n\n{% /filetree %}\n\n{% aside %}\nBackend credentials (`VONAGE_APP_ID`, `VONAGE_PRIVATE_KEY`) live in `backend/.env`. This tutorial covers only **frontend** configuration in `vcrBuild.env.sh`.\n{% /aside %}\n\n## How It Works\n\n`vcrBuild.env.sh` is a shell script that exports environment variables. It is loaded automatically every time you run the app or trigger a build — you never need to source it manually.\n\n```bash\n# vcrBuild.env.sh\nexport ALLOW_CHAT=true\nexport ALLOW_ARCHIVING=true\nexport DEFAULT_LAYOUT_MODE='active-speaker'\n```\n\n## Opening the File\n\nOpen `vcrBuild.env.sh` in your editor:\n\n```sh\ncode vcrBuild.env.sh\n```\n\nThe defaults work out of the box — all major features are enabled and the resolution is set to 1280×720. You only need to edit the file when you want to change a specific behaviour.\n\n{% aside type=\"caution\" %}\nAfter editing `vcrBuild.env.sh` you must restart the app (`yarn dev`) or trigger a new build for the changes to take effect.\n{% /aside %}\n\nNow let's look at the feature flags you can control.","src/content/docs/01-config-file-overview.mdoc","52ff691e61eb09f2","02-feature-flags",{"id":34,"data":36,"body":41,"filePath":42,"digest":43,"deferredRender":15},{"title":37,"editUrl":15,"head":38,"template":17,"sidebar":39,"pagefind":15,"draft":19},"Feature Flags",[],{"hidden":19,"attrs":40},{},"Feature flags let you enable or disable specific capabilities of the app without changing any source code. Each flag is a boolean `true` / `false` value in `vcrBuild.env.sh`.\n\n## Media Controls\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ALLOW_CAMERA_CONTROL` | `true` | Show the camera on/off toggle |\n| `ALLOW_VIDEO_ON_JOIN` | `true` | Start with camera enabled when joining |\n| `ALLOW_MICROPHONE_CONTROL` | `true` | Show the microphone on/off toggle |\n| `ALLOW_AUDIO_ON_JOIN` | `true` | Start with microphone enabled when joining |\n| `ALLOW_ADVANCED_NOISE_SUPPRESSION` | `true` | Enable the advanced noise-suppression toggle |\n| `ALLOW_BACKGROUND_EFFECTS` | `true` | Enable virtual background and blur effects |\n\n## Device Selection\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `WAITING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors in the waiting room |\n| `MEETING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors inside the meeting room |\n\n## In-Call Features\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ALLOW_ARCHIVING` | `true` | Enable meeting recording |\n| `ALLOW_CAPTIONS` | `true` | Enable live captions |\n| `ALLOW_CHAT` | `true` | Enable the in-call group chat |\n| `ALLOW_EMOJIS` | `true` | Enable emoji reactions |\n| `ALLOW_SCREEN_SHARE` | `true` | Enable screen sharing |\n| `SHOW_PARTICIPANT_LIST` | `true` | Show the participant list panel |\n\n## Room Behaviour\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ENABLE_REPORT_ISSUE` | `false` | Show the in-call issue reporting tool |\n| `BYPASS_WAITING_ROOM` | `false` | Skip the waiting room and join directly |\n| `AVOID_FETCHING_APP_CONFIG` | `true` | Skip fetching remote app configuration on startup |\n\n## Example: Minimal Read-Only Viewer\n\nTo create a stripped-down experience with no interactive tools, you might disable several flags at once:\n\n```bash\n# vcrBuild.env.sh\nexport ALLOW_CHAT=false\nexport ALLOW_EMOJIS=false\nexport ALLOW_SCREEN_SHARE=false\nexport ALLOW_ARCHIVING=false\nexport ALLOW_CAPTIONS=false\nexport ENABLE_REPORT_ISSUE=false\nexport SHOW_PARTICIPANT_LIST=false\n```\n\n{% aside type=\"tip\" %}\nBackground effects (`ALLOW_BACKGROUND_EFFECTS`) are only supported in Chromium-based browsers. If your audience uses Firefox or Safari, consider disabling this flag to avoid showing an unsupported feature.\n{% /aside %}\n\nYou have reviewed all the feature flags. Next, you will look at display defaults like resolution and room layout.","src/content/docs/02-feature-flags.mdoc","964d0b09d64d3f3b","03-display-defaults",{"id":44,"data":46,"body":51,"filePath":52,"digest":53,"deferredRender":15},{"title":47,"editUrl":15,"head":48,"template":17,"sidebar":49,"pagefind":15,"draft":19},"Display Defaults",[],{"hidden":19,"attrs":50},{},"Beyond feature flags, `vcrBuild.env.sh` also controls the default visual and performance settings of the video room — the starting resolution, room layout, bitrate limits, and available frame rates.\n\n## Video Resolution\n\n`DEFAULT_RESOLUTION` sets the outgoing video resolution when a participant joins.\n\n| Value | Description |\n|-------|-------------|\n| `1920x1080` | Full HD |\n| `1280x960` | HD (4:3) |\n| `1280x720` | HD 720p **(default)** |\n| `640x480` | SD (4:3) |\n| `640x360` | SD 360p |\n| `320x240` | Low (4:3) |\n| `320x180` | Low 180p |\n\n```bash\nexport DEFAULT_RESOLUTION='1280x720'\n```\n\n## Room Layout\n\n`DEFAULT_LAYOUT_MODE` controls which layout is shown when a participant first enters the room.\n\n| Value | Description |\n|-------|-------------|\n| `active-speaker` | Highlights the current speaker **(default)** |\n| `grid` | Shows all participants in an equal grid |\n\n```bash\nexport DEFAULT_LAYOUT_MODE='active-speaker'\n```\n\n{% aside type=\"caution\" %}\nChanging `DEFAULT_LAYOUT_MODE` requires the participant to **rejoin the room** to take effect — a running session does not update dynamically.\n{% /aside %}\n\n## Custom Video Bitrate Range\n\nThese settings control the minimum and maximum selectable bitrate in the **Advanced Settings** dialog.\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `MIN_CUSTOM_VIDEO_BITRATE_BPS` | `5000` | Minimum selectable bitrate in bps |\n| `MAX_CUSTOM_VIDEO_BITRATE_BPS` | `10000000` | Maximum selectable bitrate in bps |\n\n```bash\nexport MIN_CUSTOM_VIDEO_BITRATE_BPS=5000\nexport MAX_CUSTOM_VIDEO_BITRATE_BPS=10000000\n```\n\n## Supported Frame Rates\n\n`SUPPORTED_FRAME_RATES` defines the frame rate options shown in the Advanced Settings video tab. Values are positive integers separated by `|`.\n\n```bash\nexport SUPPORTED_FRAME_RATES='30|15|7|1'\n```\n\n{% aside type=\"tip\" %}\nLowering `DEFAULT_RESOLUTION` or restricting `SUPPORTED_FRAME_RATES` can significantly reduce bandwidth usage — useful when you know participants may be on slower connections.\n{% /aside %}\n\nYou have configured the display defaults. In the next step, you will apply all your changes and verify them.","src/content/docs/03-display-defaults.mdoc","4d0ef6db3474a83b","04-apply-changes",{"id":54,"data":56,"body":61,"filePath":62,"digest":63,"deferredRender":15},{"title":57,"editUrl":15,"head":58,"template":17,"sidebar":59,"pagefind":15,"draft":19},"Apply Your Changes",[],{"hidden":19,"attrs":60},{},"With your feature flags and display defaults configured, this step shows you how to apply the changes and confirm they are working in the running app.\n\n## Save and Restart\n\nAfter editing `vcrBuild.env.sh`, save the file and restart the development server:\n\n```sh\nyarn dev\n```\n\nThis reloads both the backend server (port **3345**) and the frontend Vite dev server (port **5173**) with the updated configuration.\n\n{% aside type=\"caution\" %}\nSimply saving the file is not enough — the dev server must be restarted to pick up the new environment variable values.\n{% /aside %}\n\n## Verify in the Browser\n\nOpen [http://localhost:5173](http://localhost:5173) and check that your changes are reflected:\n\n{% steps %}\n\n1. Navigate to the **waiting room** — confirm device selectors appear or are hidden based on `WAITING_ROOM_ALLOW_DEVICE_SELECTION`.\n\n2. Join a meeting room — confirm the initial layout matches `DEFAULT_LAYOUT_MODE`.\n\n3. Check the toolbar — verify that toggles for chat, screen share, emojis, and archiving match your flag settings.\n\n4. Open **Advanced Settings** — confirm the resolution options and bitrate range reflect your `DEFAULT_RESOLUTION` and bitrate values.\n\n{% /steps %}\n\n## Flags That Require a Rejoin\n\nSome settings only take effect when a participant **rejoins** the room (not on live reload):\n\n- `DEFAULT_LAYOUT_MODE`\n- `ALLOW_AUDIO_ON_JOIN`\n- `ALLOW_VIDEO_ON_JOIN`\n\nIf you changed any of these, leave the room and re-enter to see the updated behaviour.\n\n## Iterating Quickly\n\nA typical configure-test cycle:\n\n{% steps %}\n\n1. Edit `vcrBuild.env.sh`.\n\n2. Stop the server with **Ctrl+C**.\n\n3. Run `yarn dev` to restart.\n\n4. Open the app and verify.\n\n{% /steps %}\n\nYour configuration is live. Head to the final step for further resources.","src/content/docs/04-apply-changes.mdoc","d2386412057c2165","05-whats-next",{"id":64,"data":66,"body":72,"filePath":73,"digest":74,"deferredRender":15},{"title":67,"description":68,"editUrl":15,"head":69,"template":17,"sidebar":70,"pagefind":15,"draft":19},"What's Next","Further resources for configuring and extending the Vonage Video React App.",[],{"hidden":19,"attrs":71},{},"Congratulations! You have successfully configured the Vonage Video React App's features and display defaults using `vcrBuild.env.sh`. The app is now tailored to your specific use case.\n\n## What You Accomplished\n\n- Understood how all frontend configuration flows through `vcrBuild.env.sh`\n- Enabled and disabled feature flags for media controls, in-call tools, and room behaviour\n- Configured display defaults including resolution, layout mode, bitrate, and frame rates\n- Applied your changes by restarting the dev server and verified them in the browser\n\n## Resources\n\n- [Vonage Developer Portal](https://developer.vonage.com) — Documentation, guides, and API references for all Vonage products.\n- [Vonage Video API Documentation](https://developer.vonage.com/en/video/overview) — In-depth guides for the Video API.\n- [vonage-video-react-app on GitHub](https://github.com/Vonage/vonage-video-react-app) — Source code, full README with all configuration options, and contribution guidelines.\n\n{% aside type=\"tip\" %}\nThe full list of frontend environment variables — including defaults, accepted values, and descriptions — is always available in the `vcrBuild.env.sh` file itself and in the project README.\n{% /aside %}","src/content/docs/05-whats-next.mdoc","7b6c777a7dd76a59","index",{"id":75,"data":77,"body":87,"filePath":88,"digest":89,"deferredRender":15},{"title":78,"description":79,"editUrl":15,"head":80,"template":81,"hero":82,"sidebar":85,"pagefind":15,"draft":19},"Vonage Video React App","Learn how to control the features and display settings of the Vonage Video React App using a single configuration file.",[],"splash",{"tagline":83,"actions":84},"Feature Config",[],{"hidden":19,"attrs":86},{},"The Vonage Video React App ships with a broad set of features — archiving, chat, screen sharing, emoji reactions, captions, and more. Every one of them can be turned on or off without touching any source code, using a single shell configuration file: **`vcrBuild.env.sh`**.\n\nIn this tutorial you will:\n\n- Understand how frontend configuration works in the app\n- Enable and disable feature flags to tailor the experience for your use case\n- Adjust display defaults such as video resolution and room layout\n- Apply your changes and verify them in the running app\n\n---\n\n## Tutorial structure\n\n| # | Page | What you'll do |\n| --- | --------------------------- | ------------------------------------------------------------- |\n| 01 | Backend credentials | Create `backend/.env` with your Vonage App ID and private key |\n| 02 | Configuration file overview | Explore `vcrBuild.env.sh` and understand its structure |\n| 03 | Feature flags | Enable and disable individual features |\n| 04 | Display settings | Adjust video resolution and default room layout |\n| 05 | Apply and verify | Rebuild the app and confirm your changes in the browser |","src/content/docs/index.mdx","bc349f319ac949f8"] \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/.astro/settings.json b/tutorials/vonage_video_react_app-feature-config/.astro/settings.json index 113877f8..04e40263 100644 --- a/tutorials/vonage_video_react_app-feature-config/.astro/settings.json +++ b/tutorials/vonage_video_react_app-feature-config/.astro/settings.json @@ -1,5 +1,5 @@ { "_variables": { - "lastUpdateCheck": 1782159370968 + "lastUpdateCheck": 1782297484374 } } \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/.clinerules b/tutorials/vonage_video_react_app-feature-config/project/.clinerules new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/.clinerules @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/.cursorrules b/tutorials/vonage_video_react_app-feature-config/project/.cursorrules new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/.cursorrules @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/.github/copilot-instructions.md b/tutorials/vonage_video_react_app-feature-config/project/.github/copilot-instructions.md index f622d15a..d2522d97 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/.github/copilot-instructions.md +++ b/tutorials/vonage_video_react_app-feature-config/project/.github/copilot-instructions.md @@ -46,6 +46,7 @@ TypeScript version: `^5.8.3` - `libs/ui` for visual components - `libs/core` if it is faceless (non-visual logic). - `libs/common` for helpers, utilities, and hooks that are agnostic of the project. +- **Rule:** If the code is **backend-oriented** and represents **agnostic Vonage Video API orchestration**, it must be placed in `libs/api`. - **Rule:** Vera-specific business logic (roles, permissions, product policy/decisions) must stay in the app layer (`frontend`/`backend`). - **Rule:** This is **especially enforced** for video-related components such as publishers, subscribers, sessions, `videoView`s, etc. - **Rule:** Helpers, utilities, and hooks that are agnostic of the project must be placed in `libs/common`. @@ -54,23 +55,10 @@ TypeScript version: `^5.8.3` - **Rule:** Do not add new state management libraries. Use only existing tooling. - **Rule:** Components must be kept small, focused, and composable. -## Import rules +## Testing Guidelines -- **Rule:** Always prefer specific imports over deep namespace imports. - -**Violation:** - -```tsx -// Bad -import { isNil } from 'lodash'; -``` - -**Correct:** - -```tsx -// Good -import isNil from 'lodash/isNil'; -``` +- **Rule:** Avoid overtesting. Simple helpers should be covered by only a couple of high-value use cases. +- **Rule:** Prefer tests that validate real functionality and behavior over redundant input permutations. --- @@ -151,13 +139,13 @@ if (isUserEligible(user)) { if (isNil(data)) return; ``` -- **Rule:** Acronyms in names are banned across the codebase, except `req` and `res` when working with Express `Request` and `Response`. +- **Rule:** Abbreviated or shortened names are banned across the codebase, except `req` and `res` when working with Express `Request` and `Response`. - **Rule:** Use fully descriptive names, even if they are longer. Minification handles bundle size. **Violation:** ```tsx -// Bad +// Bad: abbreviating "User Details" to "UsrDtls" function fetchUsrDtls() { // ... } @@ -166,7 +154,7 @@ function fetchUsrDtls() { **Correct:** ```tsx -// Good +// Good: fully spelled out words function fetchUserDetails() { // ... } @@ -175,14 +163,14 @@ function fetchUserDetails() { **Violation:** ```tsx -// Bad +// Bad: abbreviating "VideoClient" to "vc" const vc = new VideoClient(); ``` **Correct:** ```tsx -// Good +// Good: fully spelled out variable name const videoClient = new VonageVideoClient(); ``` @@ -687,13 +675,11 @@ export const SurveyForm = () => { # Async Logic & Suspense Usage Rules -- **Rule:** `setState` + `useEffect` patterns must not be used for async operations. +- **Rule:** `setState` + `useEffect` patterns should be rather used and strongly justified. Prefer linear non reactive code. - **Rule:** Native `React.Suspense` and `React.use` must not be used directly. - Only `Suspense$` and `use$`/suspense-specific hooks provided by Vera are allowed. -- **Rule:** Asynchronous operations must be handled through: - - `Suspense$` component - - `use$`, `useSuspenseMemo`, or compatible Vera hooks -- **Rule:** `use$` must only be used inside a `Suspense$` boundary; by design it will throw an explicit error otherwise. + Only `SuspenseBoundary` and `use$` which are boundary aware. +- **Rule:** Asynchronous operations must be handle gracefully, consider using skeletons or placeholders instead of spinners or loading indicators. Take also advantage of tools like `Suspense` and `useSuspenseMemo`. +- **Rule:** `use$` must only be used inside a `SuspenseBoundary` boundary; by design it will throw an explicit error otherwise. **Violation (async with state/effect):** @@ -812,7 +798,7 @@ const ParentComponent = () => { - **Rule:** Context state should either: - be stable enough that you do not need fine-grained granularity, or - be granular enough that consumers can subscribe to specific portions of the state. -- **Rule:** Context APIs must not be reactive. They should not re-render consumers unnecessarily. +- **Rule:** Context APIs must not be reactive highly reactive. They should not re-render consumers unnecessarily. **Violation (manual React context for simple use case):** @@ -1586,7 +1572,7 @@ const useComplexLogic = () => { ``` - **Rule:** Reactive effect architectures are banned. - - Effects must be used only for component lifecycle, not as a state reaction graph for side effects like fetching. + - Effects must be preferred for component lifecycle, not as a state reaction graph for side effects like fetching. **Violation (reactive effect fetching):** diff --git a/tutorials/vonage_video_react_app-feature-config/project/.github/instructions/test-files.instructions.md b/tutorials/vonage_video_react_app-feature-config/project/.github/instructions/test-files.instructions.md new file mode 100644 index 00000000..ab37b1a7 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/.github/instructions/test-files.instructions.md @@ -0,0 +1,149 @@ +--- +applyTo: "**/*.{spec,test}.{ts,tsx}" +--- + +# Test Authoring Instructions + +These instructions apply to all test files across the codebase (unit, integration, backend, libs). + +## Testing philosophy + +- Do not overtest. +- Small helpers/components with one or two relevant behaviors should usually have one condensed, high-value test that validates the behavior end-to-end. +- Prefer business logic tests with clear input and expected output. +- Do not add snapshot tests. Screenshot-based assertions in integration tests (Playwright `toHaveScreenshot`) are the only allowed exception. +- After writing a test, evaluate quality: + - Does it validate real functionality? + - Or is it mostly validating test tooling, mocks, or framework internals? +- Avoid tests that only check a mocked value was returned because it was mocked. + +## What to mock + +| Mock | Do not mock | +|------|-------------| +| External SDKs (e.g. `@vonage/client-sdk-video`) | Application contexts | +| Browser APIs (e.g. `navigator.mediaDevices`) | Custom hooks | +| | Components | + +## Mocking rules + +- Do not overmock. +- Prefer spies over full module mocking whenever possible. +- Avoid mocking our own logic when the scenario can be prepared using real parameters, real state, or real providers. +- Keep mocking minimal and focused on third-party dependencies or APIs not available in the test environment. +- For typed mocked functions, always use `vi.mocked(...)`. +- `as Mocked<...>` type-casting in test files is banned. + +## Provider/context testing rules + +- Do not mock context for our own providers when #sym:makeTestProvider can be used. +- Compose only the providers strictly necessary for the scenario. Every extra provider increases test setup cost and coupling. +- Initialize provider state using provider options to prepare the use case. +- Use returned public contexts to inspect values and interact with exposed actions. + +When a component requires providers, compose only what is needed: + +```tsx +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + sessionContext?: ProviderOptions['SessionContext']; +}; + +function render( + ui: ReactElement, + { userContext, sessionContext }: RenderOptions = {} +) { + const { wrapper, ...context } = makeTestProvider( + [providers.user, providers.session], + { userContext, sessionContext } + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} +``` + +For hooks, the same principle applies: + +```tsx +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; +}; + +function renderHook( + render: (initialProps: Props) => Result, + { userContext }: RenderOptions = {} +) { + const { wrapper, ...context } = makeTestProvider([providers.user], { + userContext, + }); + + return { + ...context, + ...renderHookBase(render, { wrapper }), + }; +} +``` + +## Async test rules + +- Do not use `setTimeout` or arbitrary `waitForTimeout` calls to make async tests pass. They slow the suite and hide real timing issues. +- Use `waitFor` from `@testing-library/react` to wait for observable state changes instead only when necessary. +- Every async test must declare an explicit assertion count with `expect.assertions(n)`. +- Place `expect.assertions(n)` at the start of the async test body so tests fail if execution exits before assertions run. + +## Shared test helpers + +Before adding custom setup, check and reuse existing helpers in: + +- `libs/common/test` +- `libs/common/testNode` +- `libs/common/testBrowser` + +Useful existing helpers include: + +- `libs/common/test/setup.ts` + - Already clears mocks, restores spies, and unstubs globals after each test. Already included in the global test setup — do not duplicate. +- `libs/common/testNode/helpers/waitForEvent.ts` + +### Banned boilerplate — already provided globally + +Do not call any of the following in individual test files. They are already invoked for every test run via the global setup files (`frontend/src/test/setup.ts`, `libs/*/test/setup.ts`): + +```ts +// Global cleanup — already runs after each test via mandatoryAfterEachCleanup() +cleanup(); +vi.clearAllMocks(); +vi.restoreAllMocks(); +vi.unstubAllGlobals(); +cancelablePromiseTracker.mockClear(); + +// Browser environment setup — already runs before each suite via setupFrontendTestEnvironment() +setupResizeObserverMock(); +setupScrollIntoViewMock(); +setupHtmlMediaElementGuards(); +setupHtmlCanvasElementGuards(); +setupCancelablePromiseHook(); +``` + +Duplicating these calls in test files adds noise and can cause double-invocation side effects. + - Useful for event-driven async tests. +- `libs/common/testBrowser/renderAsyncComponent.ts` + - Use for components that resolve async behavior with Suspense boundaries. +- `libs/common/testBrowser/renderAsyncHook.ts` + - Use for hooks that need async/Suspense-aware rendering. +- `libs/common/testBrowser/makeGenericProviderWrapper.tsx` + - Generic provider/context wrapper utility for reusable context testing. +- `libs/common/testBrowser/fixtures/setupWindowNavigatorMock` + - Browser navigator setup helpers for web media-related tests. + +Do not duplicate setup that these helpers already provide. + +## Test data setup + +- Avoid high-level shared variables when possible. +- Prefer creating scenario-specific inputs inside each test. +- Prefer fewer, more robust tests instead of many tiny tests that increase suite runtime with low value. +- Keep tests explicit and linear, with clear Arrange/Act/Assert intent. diff --git a/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/auto-update-dependencies.yml b/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/auto-update-dependencies.yml index 884b75c1..31a759ab 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/auto-update-dependencies.yml +++ b/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/auto-update-dependencies.yml @@ -26,7 +26,7 @@ jobs: with: node-version: 22 - name: Install dependencies - run: yarn install + run: yarn install --ignore-scripts --frozen-lockfile - name: Run dependency update script run: node scripts/generateDependenciesList.js - name: Auto-commit updated dependencies file diff --git a/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/lint.yml b/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/lint.yml index 02289f22..1f6628ed 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/lint.yml +++ b/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/lint.yml @@ -37,7 +37,7 @@ jobs: cache: yarn - name: Install Dependencies - run: yarn + run: yarn install --ignore-scripts --frozen-lockfile - name: Run ${{ matrix.check.name }} run: ${{ matrix.check.command }} @@ -76,7 +76,7 @@ jobs: cache: yarn - name: Install Dependencies - run: yarn + run: yarn install --ignore-scripts --frozen-lockfile - name: Run license check run: | diff --git a/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/run-tests.yml b/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/run-tests.yml index 9659216f..bbe05069 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/run-tests.yml +++ b/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/run-tests.yml @@ -12,6 +12,7 @@ env: OT_API_SECRET: ${{secrets.API_SECRET}} VONAGE_APP_ID: ${{secrets.VONAGE_APP_ID}} VONAGE_PRIVATE_KEY: ${{secrets.VONAGE_PRIVATE_KEY}} + SESSION_KEY_SECRET: ${{secrets.SESSION_KEY_SECRET}} jobs: # ---------------------------------------------------- @@ -40,7 +41,7 @@ jobs: cache: yarn - name: Install Dependencies - run: yarn --ignore-scripts + run: yarn install --ignore-scripts --frozen-lockfile - name: Run ${{ matrix.project }} unit tests run: NX_DAEMON=false yarn nx test ${{ matrix.project }} --configuration=coverage @@ -99,7 +100,7 @@ jobs: - name: Install Dependencies run: | node -v - yarn --ignore-scripts + yarn install --ignore-scripts --frozen-lockfile - name: Cache Playwright browsers uses: actions/cache@v4 @@ -150,7 +151,7 @@ jobs: - name: Install Dependencies run: | node -v - yarn --ignore-scripts + yarn install --ignore-scripts --frozen-lockfile - name: Download all coverage artifacts uses: actions/download-artifact@v4 diff --git a/tutorials/vonage_video_react_app-feature-config/project/.gitignore b/tutorials/vonage_video_react_app-feature-config/project/.gitignore index 6b5c288e..6aa07aac 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/.gitignore +++ b/tutorials/vonage_video_react_app-feature-config/project/.gitignore @@ -63,3 +63,4 @@ vitest.config.*.timestamp* vcr-dev.yml /frontend/distRoom +room.zip diff --git a/tutorials/vonage_video_react_app-feature-config/project/.npmrc b/tutorials/vonage_video_react_app-feature-config/project/.npmrc new file mode 100644 index 00000000..521a9f7c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/.npmrc @@ -0,0 +1 @@ +legacy-peer-deps=true diff --git a/tutorials/vonage_video_react_app-feature-config/project/.vonage/catalog-info.yaml b/tutorials/vonage_video_react_app-feature-config/project/.vonage/catalog-info.yaml index 2d3b03b0..aedf61b2 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/.vonage/catalog-info.yaml +++ b/tutorials/vonage_video_react_app-feature-config/project/.vonage/catalog-info.yaml @@ -7,6 +7,10 @@ metadata: description: Vonage Video API JS React reference application annotations: vonage.com/jira-id: VPF # video general projects + vonage.com/maintainers: | + - Hossein Movahed @Hossein-Movahed + - Johnny Esteban Quesada @johnny-quesada-developer + - Oscar Fava @OscarFava spec: type: library owner: group:orgdata/vdk # helm "owner" orgdata squad id or general orgdata/vid @@ -19,6 +23,10 @@ metadata: description: Video React Ref App Component annotations: github.com/project-slug: Vonage/vonage-video-react-app # GH repo + vonage.com/maintainers: | + - Hossein Movahed @Hossein-Movahed + - Johnny Esteban Quesada @johnny-quesada-developer + - Oscar Fava @OscarFava spec: type: library owner: group:orgdata/vdk diff --git a/tutorials/vonage_video_react_app-feature-config/project/.vscode/extensions.json b/tutorials/vonage_video_react_app-feature-config/project/.vscode/extensions.json index b277d51d..2018509b 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/.vscode/extensions.json +++ b/tutorials/vonage_video_react_app-feature-config/project/.vscode/extensions.json @@ -7,7 +7,6 @@ "ms-playwright.playwright", "esbenp.prettier-vscode", "bradlc.vscode-tailwindcss", - "github.copilot-chat", - "github.copilot" + "github.copilot-chat" ] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/.vscode/launch.json b/tutorials/vonage_video_react_app-feature-config/project/.vscode/launch.json new file mode 100644 index 00000000..cefbee98 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "attach", + "name": "Attach to Backend", + "port": 9229, + "restart": true, + "skipFiles": ["/**", "**/node_modules/**"] + } + ] +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/.windsurfrules b/tutorials/vonage_video_react_app-feature-config/project/.windsurfrules new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/.windsurfrules @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/AGENTS.md b/tutorials/vonage_video_react_app-feature-config/project/AGENTS.md new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/AGENTS.md @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/CLAUDE.md b/tutorials/vonage_video_react_app-feature-config/project/CLAUDE.md new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/CLAUDE.md @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/CODEX.md b/tutorials/vonage_video_react_app-feature-config/project/CODEX.md new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/CODEX.md @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/GEMINI.md b/tutorials/vonage_video_react_app-feature-config/project/GEMINI.md new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/GEMINI.md @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/MAINTAINERS.md b/tutorials/vonage_video_react_app-feature-config/project/MAINTAINERS.md new file mode 100644 index 00000000..fe1ec4ed --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/MAINTAINERS.md @@ -0,0 +1,44 @@ +# Maintainers + +This repository is actively maintained by Vonage engineers. + +## Current Maintainers + +| Role | Name | +|---|---| +| Full Stack | Hossein Movahed ([@Hossein-Movahed](https://github.com/Hossein-Movahed)) | +| Full Stack | Johnny Esteban Quesada ([@johnny-quesada-developer](https://github.com/johnny-quesada-developer)) | +| Full Stack | Oscar Fava ([@OscarFava](https://github.com/OscarFava)) | + +## Responsibilities + +Maintainers are responsible for: + +- Reviewing and approving pull requests +- Maintaining code quality, consistency, and CI stability +- Managing releases and dependency updates +- Triaging issues and discussions +- Ensuring contributions align with the goals and long-term direction of the project +- Evaluating architectural, performance, operational, and product impact of proposed changes + +## Pull Request Expectations + +- At least one maintainer approval is required before merge +- CI must pass before merge +- Breaking changes should be discussed before implementation +- Pull requests should align with the project's scope, maintainability standards, and long-term goals +- Large features should be submitted in isolated pull requests when possible +- Maintainers may request scope reduction or architectural changes to keep the project maintainable and lightweight + +## Project Direction + +Maintainers are responsible not only for reviewing code correctness, but also for evaluating the broader impact of changes on: + +- Bundle size and application performance +- Mobile and low-bandwidth user experience +- Dependency footprint and operational complexity +- Distribution and embeddability constraints +- Developer experience and maintainability +- Product consistency and UI/UX direction + +Contributions may be declined or requested to be re-scoped if they introduce significant architectural, performance, or product tradeoffs that do not align with the current direction of the project. \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/README.md b/tutorials/vonage_video_react_app-feature-config/project/README.md index 5cc61171..316d867f 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/README.md +++ b/tutorials/vonage_video_react_app-feature-config/project/README.md @@ -18,6 +18,8 @@ If you're new to Vonage, you can [sign up for a Vonage API account](https://dash - [Requirements](#requirements) - [Running Locally](#running-locally) - [Storybook](#storybook) +- [UI Customization](#ui-customization) +- [Environment Configuration](#environment-configuration) - [Testing on Multiple Devices](#testing-on-multiple-devices) - [Deployment to Vonage Cloud Runtime](#deployment-to-vonage-cloud-runtime) - [Testing](#testing) @@ -32,6 +34,7 @@ If you're new to Vonage, you can [sign up for a Vonage API account](https://dash - [File names](#file-names) - [Documentation Generation](#documentation-generation) - [Code of Conduct](#code-of-conduct) +- [Maintainers](#maintainers) - [Getting Involved](#getting-involved) - [Known Issues](#known-issues) - [Report Issues](#report-issues) @@ -81,11 +84,6 @@ This application provides features for common conferencing use cases, such as: Screenshot of video effects --
- - Configurable features: adapt the app to your specific use cases and roles. - Configuration is handled through environment variables defined in vcrBuild.env.sh. Edit that file to enable or disable features such as camera control, microphone control, background effects, screen sharing, chat, emojis, archiving, captions, device selection, default resolution, layout mode, and more. Some settings (for example: "default layout" or "audio on join") require rejoining the room to take effect. - -
Composed archiving capabilities to record your meetings. Screenshot of archiving dialog box @@ -182,10 +180,10 @@ These reference apps share the same backend infrastructure and demonstrate consi - **Environment Variables** - In the root project directory, create the environment files by running: + In the root project directory, create the backend environment file by running: ``` bash - cp backend/.env.example backend/.env && cp frontend/.env.example frontend/.env + cp backend/.env.example backend/.env ``` Then, open **backend/.env** and fill in the required configuration: @@ -193,6 +191,8 @@ These reference apps share the same backend infrastructure and demonstrate consi - **VONAGE_APP_ID** – This is the ID of your Vonage application. You can find it on the [Applications page](https://dashboard.vonage.com/applications). - **VONAGE_PRIVATE_KEY** – If you've already generated a private key, use that. Otherwise, use the key you downloaded when creating the app. + Frontend feature flags and display settings are configured in [`vcrBuild.env.sh`](vcrBuild.env.sh). The defaults work out of the box — edit that file only when you need to customise behaviour. See [Environment Configuration](#environment-configuration) for the full list of available options. +
- **Start in Development Mode** @@ -225,6 +225,166 @@ yarn storybook:ui This will start the Storybook dev server at [http://localhost:6007](http://localhost:6007). +## UI Customization + +The app theme is configured through the root `designTokens.json` file. + +### Customize your theme + +1. Edit `designTokens.json` at the project root with your palette/theme values. +2. Sync theme artifacts: + +```bash +yarn sync:theme-tokens +``` + +This command always regenerates `designTokens.example.json`, syncs `libs/ui/src/theme/helpers/designTokens/designTokens.json` from root `designTokens.json` when present, creates root `designTokens.json` from defaults when missing, rebuilds the Tailwind plugin, and formats the generated plugin file. + +--- + +## Environment Configuration + +The app has two parts — a **backend** server and a **frontend** UI. The backend is configured through `backend/.env`. Frontend settings are configured through [`vcrBuild.env.sh`](vcrBuild.env.sh), which is the single place for all frontend configuration. + +Create the backend configuration file by running: + +```bash +cp backend/.env.example backend/.env +``` + +Then open it in a text editor and fill in the values described below. + +--- + +### Backend (`backend/.env`) + +Open `backend/.env` and configure the following variables. + +#### Video service provider + +Exactly one provider block must be configured. + +**Vonage Video API (default)** + +| Variable | Required | Description | +|----------|----------|-------------| +| `VIDEO_SERVICE_PROVIDER` | ✅ | Must be `vonage` | +| `VONAGE_APP_ID` | ✅ | Your Vonage application ID from the [dashboard](https://dashboard.vonage.com/applications) | +| `VONAGE_PRIVATE_KEY` | ✅ | Contents of the private key file downloaded when creating the application | + +```ini +VIDEO_SERVICE_PROVIDER='vonage' +VONAGE_APP_ID='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' +VONAGE_PRIVATE_KEY='-----BEGIN PRIVATE KEY----- +... +-----END PRIVATE KEY-----' +``` + +**OpenTok (TokBox) SDK** + +| Variable | Required | Description | +|----------|----------|-------------| +| `VIDEO_SERVICE_PROVIDER` | ✅ | Must be `opentok` | +| `OT_API_KEY` | ✅ | Your OpenTok API key | +| `OT_API_SECRET` | ✅ | Your OpenTok API secret | + +```ini +VIDEO_SERVICE_PROVIDER='opentok' +OT_API_KEY='your-api-key' +OT_API_SECRET='your-api-secret' +``` + +#### Vonage Cloud Runtime (VCR) + +| Variable | Required | Description | +|----------|----------|-------------| +| `VCR_PORT` | ⚠️ VCR only | Port exposed by VCR (typically `3345`). **Do not set this locally** — its presence switches the app to VCR storage. | + +#### Jira feedback integration (optional) + +Enables the in-call issue reporting tool to file tickets directly into Jira. + +| Variable | Description | +|----------|-------------| +| `JIRA_URL` | Base URL of your Jira instance | +| `JIRA_API_URL` | Jira REST API base URL | +| `JIRA_TOKEN` | API token for authentication | +| `JIRA_PROJECT_KEY` | Target project key | +| `JIRA_COMPONENT_ID` | Default component ID for filed issues | +| `JIRA_iOS_COMPONENT_ID` | Component ID for iOS issues | +| `JIRA_ANDROID_COMPONENT_ID` | Component ID for Android issues | +| `JIRA_EPIC_LINK` | Epic link field value | +| `JIRA_EPIC_URL` | URL to the target epic | + +--- + +### Frontend + +Frontend settings control which features are visible, what language the app uses, and how the video room behaves by default. **All frontend configuration lives in a single file: [`vcrBuild.env.sh`](vcrBuild.env.sh).** + +This file is loaded automatically whenever the app is built or deployed. To change a setting, open [`vcrBuild.env.sh`](vcrBuild.env.sh), update the relevant `export` line, and restart or rebuild: + +```bash +# vcrBuild.env.sh +export ALLOW_CHAT=false +export DEFAULT_LAYOUT_MODE='grid' +export I18N_SUPPORTED_LANGUAGES='en|es' +``` + +> **Note:** After editing [`vcrBuild.env.sh`](vcrBuild.env.sh) you need to restart the app (`yarn dev`) or trigger a new build for the changes to take effect. + +#### Network + +| Variable | Default | Description | +|----------|---------|-------------| +| `API_URL` | `http://localhost:3345` (local) / `window.location.origin` (production) | URL of the backend API server | +| `TUNNEL_DOMAIN` | — | ngrok (or similar) domain used when testing across devices. See [Testing on Multiple Devices](#testing-on-multiple-devices) | + +#### Internationalisation + +| Variable | Default | Accepted values | Description | +|----------|---------|-----------------|-------------| +| `I18N_FALLBACK_LANGUAGE` | `en` | `en` \| `en-US` \| `es` \| `es-MX` \| `it` | Language used when the user's locale is not supported | +| `I18N_SUPPORTED_LANGUAGES` | `en` | Pipe-separated list, e.g. `en\|es\|it` | Languages offered in the UI | + +#### Feature flags + +All feature flags are **boolean** (`true` / `false`). + +| Variable | Default | Description | +|----------|---------|-------------| +| `ALLOW_BACKGROUND_EFFECTS` | `true` | Enable virtual background and blur effects | +| `ALLOW_CAMERA_CONTROL` | `true` | Show the camera on/off toggle | +| `ALLOW_VIDEO_ON_JOIN` | `true` | Start with camera enabled when joining | +| `ALLOW_ADVANCED_NOISE_SUPPRESSION` | `true` | Enable the advanced noise-suppression toggle | +| `ALLOW_AUDIO_ON_JOIN` | `true` | Start with microphone enabled when joining | +| `ALLOW_MICROPHONE_CONTROL` | `true` | Show the microphone on/off toggle | +| `WAITING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors in the waiting room | +| `MEETING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors inside the meeting room | +| `ALLOW_ARCHIVING` | `true` | Enable meeting recording (archiving) | +| `ALLOW_CAPTIONS` | `true` | Enable live captions | +| `ALLOW_CHAT` | `true` | Enable the in-call group chat | +| `ALLOW_EMOJIS` | `true` | Enable emoji reactions | +| `ALLOW_SCREEN_SHARE` | `true` | Enable screen sharing | +| `SHOW_PARTICIPANT_LIST` | `true` | Show the participant list panel | +| `ENABLE_REPORT_ISSUE` | `false` | Show the in-call issue reporting tool | +| `BYPASS_WAITING_ROOM` | `false` | Skip the waiting room and join directly | +| `AVOID_FETCHING_APP_CONFIG` | `true` | Skip fetching remote app configuration on startup | + +#### Display defaults + +| Variable | Default | Accepted values | Description | +|----------|---------|-----------------|-------------| +| `DEFAULT_RESOLUTION` | `1280x720` | `1920x1080` \| `1280x960` \| `1280x720` \| `640x480` \| `640x360` \| `320x240` \| `320x180` | Default outgoing video resolution | +| `DEFAULT_LAYOUT_MODE` | `active-speaker` | `active-speaker` \| `grid` | Default in-room layout when a participant joins | +| `MIN_CUSTOM_VIDEO_BITRATE_BPS` | `5000` | Positive integer (bps) | Minimum selectable custom video bitrate in the Advanced Settings dialog | +| `MAX_CUSTOM_VIDEO_BITRATE_BPS` | `10000000` | Positive integer (bps) | Maximum selectable custom video bitrate in the Advanced Settings dialog | +| `SUPPORTED_FRAME_RATES` | `30\|15\|7\|1` | `\|`-separated positive integers (fps) | Frame rate options shown in the Advanced Settings video tab | + +> **Note:** `DEFAULT_LAYOUT_MODE` and `ALLOW_AUDIO_ON_JOIN` / `ALLOW_VIDEO_ON_JOIN` require the participant to **rejoin the room** to take effect after being changed. + +--- + ## Testing on Multiple Devices To test the video API across multiple devices on your local network, you can use **ngrok** to expose your frontend and backend publicly. @@ -277,16 +437,14 @@ To test the video API across multiple devices on your local network, you can use
-5. Copy the domains from both outputs and update your **frontend/.env** file: +5. Copy the domains from both outputs and update [`vcrBuild.env.sh`](vcrBuild.env.sh): - ``` ini - # Frontend tunnel domain - TUNNEL_DOMAIN=your-frontend-domain.ngrok.io - # Backend tunnel domain - API_URL=https://your-backend-domain.ngrok.io + ``` bash + export TUNNEL_DOMAIN=your-frontend-domain.ngrok.io + export API_URL=https://your-backend-domain.ngrok.io ``` - **Note:** ngrok assigns temporary domains. You'll need to update your environment variables each time the domains change. + **Note:** ngrok assigns temporary domains. You'll need to update these values each time the domains change.
@@ -390,7 +548,7 @@ yarn test:backend ### Frontend Suite We have frontend tests using [vitest](https://vitest.dev/) and [React Testing Library](https://testing-library.com/docs/react-testing-library/intro). We recommend using the [vitest VSCode integration]( https://marketplace.visualstudio.com/items?itemName=vitest.explorer) to run tests. -For guidance on writing frontend unit tests, see the [Frontend Unit Testing Guide](./docs/TESTING.md). +For guidance on writing unit tests, see the [Test Instructions](./.github/instructions/test-files.instructions.md). Alternatively you can run the tests in the terminal: - To run frontend tests once: @@ -442,6 +600,12 @@ yarn nx run frontend:docs Please read our [Code of Conduct](CODE_OF_CONDUCT.md). +## Maintainers + +This repository is actively maintained by the Vonage Video team. + +For maintainer responsibilities, review expectations, and project ownership guidelines, see [MAINTAINERS.md](./MAINTAINERS.md). + ## Getting Involved If you wish to contribute to this project, read how in [Contributing](./docs/CONTRIBUTING.md). diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/.env.example b/tutorials/vonage_video_react_app-feature-config/project/backend/.env.example index 9ca6eb49..cf5a9694 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/backend/.env.example +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/.env.example @@ -24,6 +24,9 @@ VONAGE_PRIVATE_KEY='' # OT_API_KEY=api-key # OT_API_SECRET=api-secret +# Secret used to sign and verify session key JWTs. +SESSION_KEY_SECRET='' + # If deploying to Vonage Cloud Runtime (https://developer.vonage.com/en/vonage-cloud-runtime/overview) # enter your port here; the default is 3345. # DO NOT SET THIS VARIABLE IN LOCAL ENV: @@ -36,3 +39,6 @@ VONAGE_PRIVATE_KEY='' # JIRA_TOKEN=jira-token # JIRA_PROJECT_KEY=jira-project-key # JIRA_COMPONENT_ID=jira-component-id +# JIRA_EPIC_URL='jira-epic-url' +# JIRA_EPIC_LINK='jira-epic-link' +# JIRA_SEVERITY_ID='jira-severity-id' diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/errors/ValidationError.ts b/tutorials/vonage_video_react_app-feature-config/project/backend/errors/ValidationError.ts deleted file mode 100644 index 12fdce79..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/backend/errors/ValidationError.ts +++ /dev/null @@ -1,35 +0,0 @@ -import StatusCodeEnum from 'status-code-enum'; -import ApplicationError from '@common/errors/ApplicationError'; - -export type ValidationIssue = { - path: (string | number)[]; - message: string; -}; - -export class ValidationError extends ApplicationError { - public readonly code = 'VALIDATION_ERROR'; - public readonly issues: ValidationIssue[]; - - constructor(issues: ValidationIssue[], message = 'Invalid request') { - super({ - src: new Error(message), - fallbackConfig: { - fallbackMessage: message, - statusCode: StatusCodeEnum.ClientErrorBadRequest, - severity: 'error', - }, - }); - this.name = 'ValidationError'; - this.issues = issues; - } - - public override exportSafely = () => { - const base = this.exportSafelyBase(); - return { - ...base, - code: 'VALIDATION_ERROR', - issues: this.issues, - statusCode: base.statusCode ?? this.statusCode ?? 400, - }; - }; -} diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/__mocks__/config.ts b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/__mocks__/config.ts index 394c7479..1def333a 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/__mocks__/config.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/__mocks__/config.ts @@ -10,6 +10,7 @@ const mockOpentokConfig = () => { privateKey: 'test-private-key', provider: 'opentok', gollumUrl: 'https://example.com', + loggerVerbose: false, }; }), }; diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/config.ts b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/config.ts index 6c072fe4..610a8ae1 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/config.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/config.ts @@ -18,6 +18,9 @@ dotenv.config({ path: path.join(runtimeDir, '.env') }); const loadConfig = (): Config => { const provider = process.env.VIDEO_SERVICE_PROVIDER ?? ''; + const sessionKeySecret = process.env.SESSION_KEY_SECRET ?? ''; + + const loggerVerbose = process.env.LOGGER_VERBOSE === 'true'; const feedbackConfig: FeedbackConfig = { url: process.env.JIRA_URL, @@ -29,18 +32,30 @@ const loadConfig = (): Config => { androidComponentId: process.env.JIRA_ANDROID_COMPONENT_ID, epicLink: process.env.JIRA_EPIC_LINK, epicUrl: process.env.JIRA_EPIC_URL, + severityId: process.env.JIRA_SEVERITY_ID, gollumUrl: process.env.GOLLUM_BASE_URL, }; + if (provider === 'vonage') { const applicationId = process.env.VONAGE_APP_ID ?? ''; const privateKey = process.env.VONAGE_PRIVATE_KEY ?? ''; + const videoHost = process.env.VONAGE_VIDEO_HOST; if (!applicationId || !privateKey) { throw new Error('Missing config values for Vonage'); } - return { ...feedbackConfig, applicationId, privateKey, provider: 'vonage' }; + return { + ...feedbackConfig, + applicationId, + privateKey, + provider: 'vonage', + videoHost, + sessionKeySecret, + loggerVerbose, + }; } + if (provider === 'opentok') { const apiKey = process.env.OT_API_KEY ?? ''; const apiSecret = process.env.OT_API_SECRET ?? ''; @@ -49,8 +64,16 @@ const loadConfig = (): Config => { throw new Error('Missing config values for OpenTok'); } - return { ...feedbackConfig, apiKey, apiSecret, provider: 'opentok' }; + return { + ...feedbackConfig, + apiKey, + apiSecret, + provider: 'opentok', + sessionKeySecret, + loggerVerbose, + }; } + throw new Error(`Unknown video service provider: ${provider || 'undefined'}`); }; diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/getOrCreateSessionKeyFromRoomName.ts b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/getOrCreateSessionKeyFromRoomName.ts new file mode 100644 index 00000000..7c5573fb --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/getOrCreateSessionKeyFromRoomName.ts @@ -0,0 +1,37 @@ +import { VideoClient } from '../routes/video'; +import getSessionStorageService from '../sessionStorageService'; +import blockCallsForArgs from './blockCallsForArgs'; +import { isValidRoomName } from '@common/assertions'; +import { makeBadRequestErrorHandler } from '@api-lib/errors'; + +const sessionService = getSessionStorageService(); + +const getOrCreateSessionKeyFromRoomName = async ({ + videoClient, + roomName, +}: { + roomName: string; + videoClient: VideoClient; +}) => { + return blockCallsForArgs(async () => { + const storedSessionKey = await sessionService.getSessionKeyByRoomName({ roomName }); + if (storedSessionKey) return storedSessionKey; + + if (!isValidRoomName(roomName)) { + throw makeBadRequestErrorHandler(`Invalid room name: ${roomName}.`)(null); + } + + const session = await videoClient.createSession({ roomName }); + const { sessionKey, sessionId } = session; + + await sessionService.setSession({ + roomName, + sessionKey, + sessionId, + }); + + return session.sessionKey; + })(roomName); +}; + +export default getOrCreateSessionKeyFromRoomName; diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/getSessionKeyFromRoomName.ts b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/getSessionKeyFromRoomName.ts new file mode 100644 index 00000000..19ecf5d6 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/getSessionKeyFromRoomName.ts @@ -0,0 +1,16 @@ +import { makeNotFoundErrorHandler } from '@api-lib/errors'; +import getSessionStorageService from '../sessionStorageService'; + +const sessionService = getSessionStorageService(); + +const getSessionKeyFromRoomName = async ({ roomName }: { roomName: string }): Promise => { + const storedSessionKey = await sessionService.getSessionKeyByRoomName({ roomName }); + + if (!storedSessionKey) { + throw makeNotFoundErrorHandler(`No session found for room name: ${roomName}`)(null); + } + + return storedSessionKey; +}; + +export default getSessionKeyFromRoomName; diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/index.ts b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/index.ts new file mode 100644 index 00000000..6a3e710f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/index.ts @@ -0,0 +1,4 @@ +export { default as blockCallsForArgs } from './blockCallsForArgs'; +export { default as loadConfig } from './config'; +export { default as getOrCreateSessionKeyFromRoomName } from './getOrCreateSessionKeyFromRoomName'; +export { default as getSessionKeyFromRoomName } from './getSessionKeyFromRoomName'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/jest.config.js b/tutorials/vonage_video_react_app-feature-config/project/backend/jest.config.js index a2e344b8..3dc769cb 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/backend/jest.config.js +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/jest.config.js @@ -4,16 +4,31 @@ export default { testEnvironment: 'node', clearMocks: true, moduleDirectories: ['ts', 'tsx', 'node_modules'], - moduleNameMapper: { - '^@common/(.*)$': '/../libs/common/src/$1', - '^@common$': '/../libs/common/src', - '^@api-lib/(.*)$': '/../libs/api/src/$1', - '^@api-lib$': '/../libs/api/src', - }, coverageProvider: 'v8', roots: ['/'], + modulePaths: [''], testMatch: ['**/tests/**/*.+(ts|tsx)', '**/?(*.)+(test).+(ts|tsx)'], setupFiles: ['/jest/documentPolyfill.js', '/jest/setEnvVars.js'], + coveragePathIgnorePatterns: ['/node_modules/', '/tests/', '/index\\.ts$'], + collectCoverageFrom: [ + '**/*.{ts,tsx}', + '!**/node_modules/**', + '!**/tests/**', + '!**/index.ts', + + // interfaces/types files, don't need to be tested + '!**/storage/sessionStorage.ts', + ], + moduleNameMapper: { + '^@api-lib$': '/../libs/api/src', + '^@api-lib/(.*)$': '/../libs/api/src/$1', + '^@common$': '/../libs/common/src', + '^@common/(.*)$': '/../libs/common/src/$1', + '^@common-test$': '/../libs/common/test', + '^@common-test/(.*)$': '/../libs/common/test/$1', + '^@node$': '/../libs/common/srcNode', + '^@node/(.*)$': '/../libs/common/srcNode/$1', + }, transform: { '^.+\\.tsx?$': [ 'ts-jest', diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/jest/setEnvVars.js b/tutorials/vonage_video_react_app-feature-config/project/backend/jest/setEnvVars.js index 553e0077..eb30685f 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/backend/jest/setEnvVars.js +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/jest/setEnvVars.js @@ -10,4 +10,5 @@ process.env.VONAGE_APP_ID = 'vonageAppId'; process.env.VONAGE_PRIVATE_KEY = 'vonagePrivateKey'; process.env.OT_API_KEY = 'someOpenTokKey'; process.env.OT_API_SECRET = 'opentokAPISecret'; +process.env.SESSION_KEY_SECRET = 'test-session-key-secret-for-jwt-signing'; process.env.GOLLUM_BASE_URL = 'https://example.com'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/errorHandler.ts b/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/errorHandler.ts index 926eb2c4..2742e0d6 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/errorHandler.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/errorHandler.ts @@ -2,7 +2,6 @@ import type { Request, Response, NextFunction } from 'express'; import StatusCodeEnum from 'status-code-enum'; import { isApplicationError } from '@common/errors/assertions'; import ApplicationServerError from '@api-lib/errors/ApplicationServerError'; -import { ValidationError } from '../errors/ValidationError'; const isDevelopment = process.env.NODE_ENV !== 'production'; @@ -12,8 +11,6 @@ function tryToLogApplicationError(error: unknown): void { console.error('[ApplicationServerError]', error.retrieveErrorLogDetails()); } else if (isApplicationError(error)) { console.error('[ApplicationError]', error.message); - } else if (error instanceof ValidationError) { - console.error('[ValidationError]', JSON.stringify({ issues: error.issues })); } else { console.error('[Error]', error); } @@ -50,23 +47,8 @@ export function errorHandler( }); // avoids exposing sensitive information while still providing useful error information - let safeError = applicationError.exportSafely(); - let statusCode = - applicationError.statusCode ?? (safeError as { statusCode?: number }).statusCode ?? 500; - - // ValidationError: use its exportSafely for proper statusCode and issues (avoids ESM/instanceof quirks) - if ( - typeof error === 'object' && - error !== null && - (error as { code?: string }).code === 'VALIDATION_ERROR' && - Array.isArray((error as { issues?: unknown }).issues) - ) { - const validationSafe = (error as ValidationError).exportSafely(); - safeError = validationSafe; - statusCode = validationSafe.statusCode ?? 400; - } - - const safeErrorWithStatus = { ...safeError, statusCode }; + const safeError = applicationError.exportSafely(); + const { statusCode } = safeError; const accepts = req.headers.accept ?? ''; @@ -76,16 +58,23 @@ export function errorHandler( req.headers?.['content-type']?.includes('application/json'); if (isJsonRequest) { - res.status(statusCode).json(safeErrorWithStatus); + res.status(safeError.statusCode).json(safeError); return; } const isHtmlRequest = accepts.includes('text/html'); if (isHtmlRequest) { - res.status(statusCode).render('index', { - error: safeErrorWithStatus, - }); + const safeMessage = safeError.message + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + + res + .status(statusCode) + .send(`

${statusCode}

${safeMessage}

`); return; } diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/helmetMiddleware/helmetMiddleware.test.ts b/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/helmetMiddleware/helmetMiddleware.test.ts new file mode 100644 index 00000000..60834149 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/helmetMiddleware/helmetMiddleware.test.ts @@ -0,0 +1,70 @@ +import type { Request, Response } from 'express'; +import { beforeEach, describe, expect, it, jest } from '@jest/globals'; + +const helmetHandlerMock = jest.fn(); + +const helmetMock = jest.fn(() => helmetHandlerMock) as jest.Mock & { + contentSecurityPolicy: { + getDefaultDirectives: jest.Mock; + }; +}; + +helmetMock.contentSecurityPolicy = { + getDefaultDirectives: jest.fn(() => ({ + 'default-src': ["'self'"], + })), +}; + +jest.unstable_mockModule('helmet', () => ({ + default: helmetMock, +})); + +describe('helmetMiddleware', () => { + beforeEach(() => { + jest.resetModules(); + jest.clearAllMocks(); + process.env.NODE_ENV = 'production'; + }); + + it('should call the helmet handler', async () => { + const { default: helmetMiddleware } = await import('./helmetMiddleware'); + + const { req, res, next } = createRequestParameters(); + + helmetMiddleware(req, res, next); + + expect(helmetHandlerMock).toHaveBeenCalledWith(req, res, next); + }); + + it('should disable contentSecurityPolicy in development', async () => { + process.env.NODE_ENV = 'development'; + + const { default: helmetMiddleware } = await import('./helmetMiddleware'); + + const { req, res, next } = createRequestParameters(); + + helmetMiddleware(req, res, next); + + expect(helmetMock).toHaveBeenCalledWith( + expect.objectContaining({ + contentSecurityPolicy: false, + hsts: false, + }) + ); + + expect(helmetHandlerMock).toHaveBeenCalledWith(req, res, next); + }); +}); + +function createRequestParameters() { + const req = {} as Request; + + const res = { + setHeader: jest.fn(), + removeHeader: jest.fn(), + } as unknown as Response; + + const next = jest.fn(); + + return { req, res, next }; +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/helmetMiddleware/helmetMiddleware.ts b/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/helmetMiddleware/helmetMiddleware.ts new file mode 100644 index 00000000..58076791 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/helmetMiddleware/helmetMiddleware.ts @@ -0,0 +1,82 @@ +import helmet from 'helmet'; +import { RequestHandler } from 'express'; + +const isDevelopment = process.env.NODE_ENV !== 'production'; + +const helmetHandler = helmet({ + contentSecurityPolicy: isDevelopment + ? false + : { + directives: { + // Allow scripts from self and Vonage/OpenTok static assets. + // Needed by the Vonage/OpenTok SDK to load MediaPipe transformer assets, + // including task-vision.js and worker-side scripts loaded through importScripts(...). + 'script-src': [ + "'self'", + // required for web assembly + "'unsafe-eval'", + 'blob:', + 'data:', + 'https://static.opentok.com', + ], + + // Allow connections to self and Vonage/OpenTok backend services. + // Needed for signaling, logging, REST calls, and WebSocket traffic. + 'connect-src': [ + "'self'", + 'https://*.opentok.com', + 'https://*.tokbox.com', + 'https://*.vonage.com', + 'wss://*.opentok.com', + 'wss://*.tokbox.com', + 'wss://*.vonage.com', + 'https://static.opentok.com', + ], + + // Allow images from self, inline/base64 images, blob URLs, and any HTTPS image source. + 'img-src': ["'self'", 'data:', 'blob:', 'https:'], + + // Allow workers created by the SDK/app, including blob-based and inline data: workers. + // Also allow Vonage/OpenTok static assets because MediaPipe may load worker-side + // scripts from static.opentok.com. + 'worker-src': ["'self'", 'blob:', 'data:', 'https://static.opentok.com'], + + // Allow media resources from self, blob URLs, and HTTPS sources. + 'media-src': ["'self'", 'blob:', 'https:'], + }, + }, + + // Disabled so this page can consume external resources without requiring CORP/COEP headers. + // This helps avoid breaking third-party fonts, CDNs, workers, and integrations. + crossOriginEmbedderPolicy: false, + + // Allow external sites to load resources served by this app. + // Needed when the VeraRoom web component/assets are embedded on third-party sites. + crossOriginResourcePolicy: { policy: 'cross-origin' }, + + // Prevent clickjacking by allowing this page to be framed only by the same origin. + // This does not affect usage as a custom element via + diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/example/vite.example.config.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/example/vite.example.config.ts index 4dc4fffb..80a74d7b 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/example/vite.example.config.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/example/vite.example.config.ts @@ -28,7 +28,7 @@ export default defineConfig((env) => { plugins: [renameOutputHtml()], build: { outDir: path.resolve(__dirname, '../../../distRoom'), - emptyOutDir: false, // Don't clear - vera-room.js should already be there + emptyOutDir: false, // Don't clear - room.js should already be there rollupOptions: { input: path.resolve(__dirname, './index.html'), }, diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/hooks/useLanguageSync.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/hooks/useLanguageSync.ts deleted file mode 100644 index 78325363..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/hooks/useLanguageSync.ts +++ /dev/null @@ -1,29 +0,0 @@ -import i18n from '../../i18n'; -import bridge$ from '../stores/bridge'; -import { useMountEffect } from '@web/hooks'; - -/** - * Syncs the `language` bridge attribute to i18next whenever it changes. - * - * When a host page sets or updates the `language` attribute on , - * the value flows into bridge$ via attributeChangedCallback. This hook - * subscribes to that value and forwards it to i18n.changeLanguage so the - * entire UI re-renders in the requested locale. - * - * An empty string means "no override" — in that case we leave i18n alone - * so the browser-detected language (set during i18n.init) remains active. - */ -const useLanguageSync = () => { - const bridge = bridge$.use.api(); - - useMountEffect(() => { - return bridge.subscribe( - ({ language }) => language, - (language) => { - void i18n.changeLanguage(language); - } - ); - }); -}; - -export default useLanguageSync; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/hooks/useStateSynchronizer.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/hooks/useStateSynchronizer.ts new file mode 100644 index 00000000..6d658aee --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/hooks/useStateSynchronizer.ts @@ -0,0 +1,52 @@ +import { createVideoClient } from '@core/services'; +import i18n from '../../i18n'; +import bridge$ from '../stores/bridge'; +import { runtime$ } from '@core/stores'; +import { useMountEffect } from '@web/hooks'; + +/** + * Syncs the html element with the internal react state + */ +const useStateSynchronizer = () => { + const bridge = bridge$.use.api(); + const runtime = runtime$.use.api(); + const { setLanguage } = runtime$.use.actions(); + + useMountEffect(() => { + const subscriptions = [ + // language changes from the bridge should update i18n and the runtime store + bridge.subscribe( + ({ language }) => language, + (language) => { + void i18n.changeLanguage(language); + setLanguage(language); + }, + { + skipFirst: true, + } + ), + + // clientUrl changes from the bridge should update the video client in the runtime store + bridge.subscribe( + ({ entryPoint }) => entryPoint, + (entryPoint) => { + runtime.setState((state) => ({ + ...state, + videoClient: createVideoClient({ + url: entryPoint, + }), + })); + }, + { + skipFirst: true, + } + ), + ]; + + return () => { + subscriptions.forEach((unsubscribe) => unsubscribe()); + }; + }); +}; + +export default useStateSynchronizer; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/index.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/index.ts index bcee003b..7a2f0840 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/index.ts @@ -1,2 +1,5 @@ +// runs interceptors before vonage sdk initialize resources (XHR, navigator.mediaDevices clones, etc) +import '@core/interceptors'; + import '../i18n'; import './VeraRoomElement'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.spec.tsx index fc3b211c..99e1964e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.spec.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.spec.tsx @@ -19,9 +19,7 @@ vi.mock('@components/GoodBye/GoodbyeMessage', () => ({ })); vi.mock('@components/GoodBye/ReenterRoomButton', () => ({ - default: ({ roomName }: { roomName: string }) => ( -
- ), + default: () =>
, })); vi.mock('@ui', async () => { @@ -46,7 +44,7 @@ const mockUseGoodByePage = useGoodByePage as Mock; describe('GoodByeStage', () => { beforeEach(() => { mockUseGoodByePage.mockReturnValue({ - roomName: 'test-room', + sessionKey: 'test-session-key', archives: [], header: 'You have left the meeting', caption: 'Thank you for joining!', @@ -60,16 +58,15 @@ describe('GoodByeStage', () => { expect(message).toHaveAttribute('data-message', 'Thank you for joining!'); }); - it('renders the ReenterRoomButton with the roomName from the hook', () => { + it('renders the ReenterRoomButton', () => { renderStage(); - const button = screen.getByTestId('reenter-room-button'); - expect(button).toHaveAttribute('data-room', 'test-room'); + expect(screen.getByTestId('reenter-room-button')).toBeInTheDocument(); }); it('renders the ArchiveList with archives from the hook', () => { const archives = [{ id: 'archive-1', status: 'available' }]; mockUseGoodByePage.mockReturnValue({ - roomName: 'test-room', + sessionKey: 'test-session-key', archives, header: 'Gone', caption: 'Bye', @@ -82,7 +79,7 @@ describe('GoodByeStage', () => { it('renders the ArchiveList with "error" when archives failed to load', () => { mockUseGoodByePage.mockReturnValue({ - roomName: 'test-room', + sessionKey: 'test-session-key', archives: 'error', header: 'Gone', caption: 'Bye', diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.tsx index 5438c799..4bd66f1d 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.tsx @@ -2,7 +2,6 @@ import ArchiveList from '@components/GoodBye/ArchiveList'; import GoodByeMessage from '@components/GoodBye/GoodbyeMessage'; import ReenterRoomButton from '@components/GoodBye/ReenterRoomButton'; import useGoodByePage from '@hooks/useGoodByePage'; -import { Stack } from '@mui/material'; import { Card, PageLayoutEmbed } from '@ui'; import type { FC } from 'react'; import { useTranslation } from 'react-i18next'; @@ -19,7 +18,7 @@ import { useTranslation } from 'react-i18next'; */ const GoodByeStage: FC = () => { const { t } = useTranslation(); - const { roomName, archives, header, caption } = useGoodByePage(); + const { archives, header, caption } = useGoodByePage(); return ( @@ -27,21 +26,21 @@ const GoodByeStage: FC = () => { - +
-

+

{t('goodBye.title')}

- +
-

+

{t('archiveList.label')}

- +
); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.spec.tsx index ebd1b6ee..0507388e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.spec.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.spec.tsx @@ -19,10 +19,15 @@ type RenderOptions = { }; function render(ui: ReactElement, { sessionContext, userContext }: RenderOptions = {}) { - const { wrapper, ...context } = makeTestProvider([providers.user, providers.session], { - sessionContext, - userContext, - }); + const { wrapper, ...context } = makeTestProvider( + [providers.user, providers.session, providers.runtime], + + { + sessionContext, + userContext, + runtimeContext: undefined, + } + ); return { ...context, diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.tsx index 71904bd9..606d3693 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.tsx @@ -9,7 +9,7 @@ import MeetingRoom from '@pages/MeetingRoom'; * Embeddable version of the meeting room. Provides SessionProvider and PublisherProvider. */ const MeetingRoomStage: FC = () => ( - + diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.spec.tsx index c90f912e..d325ceaf 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.spec.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.spec.tsx @@ -66,11 +66,24 @@ vi.mock('@ui', async () => { type RenderOptions = { userContext?: ProviderOptions['UserContext']; initialRoute?: string; + sessionIdentifier?: string; }; +function SetBridgeState({ sessionIdentifier }: { sessionIdentifier?: string }) { + const actions = bridge$.use.actions(); + if (sessionIdentifier) { + actions.partialUpdate({ sessionIdentifier }); + } + return null; +} + function render( ui: ReactElement, - { userContext, initialRoute = '/waiting-room/my-room' }: RenderOptions = {} + { + userContext, + initialRoute = '/waiting-room/my-room', + sessionIdentifier = 'my-room', + }: RenderOptions = {} ) { const { wrapper: ProvidersWrapper, ...context } = makeTestProvider([providers.user], { userContext, @@ -80,10 +93,11 @@ function render( ...context, ...renderBase( + - + } /> @@ -105,8 +119,8 @@ describe('WaitingRoomStage', () => { localStorage.clear(); }); - it('renders content when roomName is in URL params', () => { - render(, { initialRoute: '/waiting-room/my-room' }); + it('renders content when sessionIdentifier is set', () => { + render(, { sessionIdentifier: 'my-room' }); expect(screen.getByTestId('video-container')).toBeInTheDocument(); expect(screen.getByTestId('username-input')).toBeInTheDocument(); expect(screen.getByTestId('control-panel')).toBeInTheDocument(); @@ -114,43 +128,20 @@ describe('WaitingRoomStage', () => { it('renders skeletons when isRoomReady is false', () => { localStorage.setItem('videoSourceEnabled', 'true'); - render(, { initialRoute: '/waiting-room/my-room' }); + render(, { sessionIdentifier: 'my-room' }); expect(screen.getByTestId('video-container-skeleton')).toBeInTheDocument(); expect(screen.getByTestId('username-input-skeleton')).toBeInTheDocument(); expect(screen.queryByTestId('video-container')).not.toBeInTheDocument(); }); - it('shows config error message when no roomName and no sessionIdentifier', () => { - render(, { initialRoute: '/waiting-room' }); + it('shows config error message when no sessionIdentifier is set', () => { + render(, { initialRoute: '/waiting-room', sessionIdentifier: '' }); expect(screen.getByText(/session-identifier/i)).toBeInTheDocument(); }); - it('redirects to /waiting-room/:sessionIdentifier when roomName is absent but bridge has a sessionIdentifier', () => { - const Wrapper = () => { - // Set bridge state inside a component rendered within the provider - const actions = bridge$.use.actions(); - actions.partialUpdate({ sessionIdentifier: 'bridge-room' }); - - return ( - - - } - /> - } /> - - - ); - }; - - renderBase( - - - - ); - - expect(screen.getByTestId('redirected-to-room')).toBeInTheDocument(); + it('renders content when bridge has a sessionIdentifier', () => { + render(, { sessionIdentifier: 'bridge-room' }); + expect(screen.getByTestId('video-container')).toBeInTheDocument(); }); }); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.tsx index 6ecadeb8..ecab056c 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.tsx @@ -1,5 +1,5 @@ import { type FC } from 'react'; -import { Navigate, useParams } from 'react-router-dom'; +import { Navigate } from 'react-router-dom'; import Typography from '@mui/material/Typography'; import bridge$ from '../../stores/bridge'; import { PreviewPublisherProvider } from '@Context/PreviewPublisherProvider'; @@ -25,16 +25,15 @@ import { PageLayoutEmbed } from '@ui'; * Navigation to the meeting room is handled by UsernameInput via react-router-dom, * which resolves against the parent MemoryRouter in VeraRoom. * - * If mounted at /waiting-room (no :roomName param) but bridge$ has a sessionIdentifier, + * If mounted at /waiting-room (no :roomIdentifier param) but bridge$ has a sessionIdentifier, * redirects to /waiting-room/:sessionIdentifier so useRoomName() resolves correctly. */ const WaitingRoomStage: FC = () => { - const { roomName } = useParams<{ roomName?: string }>(); const sessionIdentifier = bridge$.use.select((state) => state.sessionIdentifier); - const missingRoomName = !roomName; - const canRedirect = missingRoomName && !!sessionIdentifier; - const isConfigError = missingRoomName && !sessionIdentifier; + const missingRoomIdentifier = !sessionIdentifier; + const canRedirect = missingRoomIdentifier && !!sessionIdentifier; + const isConfigError = missingRoomIdentifier && !sessionIdentifier; if (canRedirect) { return ; @@ -67,6 +66,7 @@ function WaitingRoomStageContent() { setUsername, accessStatus, isRoomReady, + roomName, handleAudioInputOpen, handleVideoInputOpen, handleAudioOutputOpen, @@ -109,6 +109,7 @@ function WaitingRoomStageContent() { className={`flex-col sm:inline-flex h-auto animate-fade-in`} username={username} setUsername={setUsername} + roomName={roomName} /> )} diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stores/index.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stores/index.ts index a32db2c4..38179330 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stores/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stores/index.ts @@ -1 +1 @@ -export { default as htmlAttributes$ } from './bridge'; +export { default as bridge$ } from './bridge'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/styles.css b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/styles.css index 79285e5a..f9b48a6e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/styles.css +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/styles.css @@ -1,5 +1,13 @@ @import 'tailwindcss'; +/* Keeps output pixel exact after migration from muiV5 to muiV9 */ +@layer base { + * { + letter-spacing: 0.15008px; + -webkit-font-smoothing: antialiased; + } +} + /* Tailwind CSS v4 config directive */ @config '../../tailwind.config.cjs'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/vite.veraroom.config.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/vite.veraroom.config.ts index 5f0d100c..c491aa78 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/vite.veraroom.config.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/vite.veraroom.config.ts @@ -4,12 +4,14 @@ import * as path from 'node:path'; export default defineConfig((env) => { const baseConfig = baseConfigFn(env); - const isDevelopment = env.mode === 'development'; return mergeConfig(baseConfig, { base: './', define: { - 'process.env.NODE_ENV': isDevelopment ? '"development"' : '"production"', + 'process.env.NODE_ENV': '"production"', + }, + esbuild: { + jsxDev: false, }, build: { outDir: path.resolve(__dirname, '../../distRoom'), @@ -19,7 +21,7 @@ export default defineConfig((env) => { entry: path.resolve(__dirname, './index.ts'), name: 'VeraRoom', formats: ['iife'], - fileName: () => 'vera-room.js', + fileName: () => 'room.js', }, rollupOptions: { diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/getArchives.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/getArchives.spec.ts new file mode 100644 index 00000000..5e780574 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/getArchives.spec.ts @@ -0,0 +1,76 @@ +import { describe, expect, it, vi } from 'vitest'; +import { serverArchives } from '../tests/data'; +import getArchives from './getArchives'; +import type { ServerArchive } from '../model'; +import type { VideoClient } from '@core/services'; + +const mockSearchArchivesQuery = vi.fn((_args?: unknown) => + Promise.resolve({ items: [] as ServerArchive[] }) +); + +const mockVideoClient = { + searchArchives: (...args: unknown[]) => mockSearchArchivesQuery(...args), +} as unknown as VideoClient; + +describe('getArchives', () => { + it('returns an object with array of Archives and hasPending flag', async () => { + mockSearchArchivesQuery.mockResolvedValue({ items: serverArchives }); + const archives = await getArchives({ + locale: 'en', + sessionKey: 'test-session-id', + videoClient: mockVideoClient, + }); + expect(archives).toEqual({ + archives: [ + { + createdAt: 1725268594000, + createdAtFormatted: 'Mon, Sep 2 5:16 AM', + duration: 0, + id: 'dc91ede6-0d1a-4de6-90d8-692c2113b34a', + size: 0, + status: 'pending', + url: null, + }, + { + createdAt: 1725268141000, + createdAtFormatted: 'Mon, Sep 2 5:09 AM', + duration: 56, + id: 'c32509e3-24a9-4d1f-98a0-66a0f0fdbca6', + size: 278545, + status: 'available', + url: 'https://example.com.com/tokbox.com.archive2.eu/46969164/c32509e3-24a9-4d1f-98a0-66a0f0fdbca6/archive.mp4', + }, + { + createdAt: 1725268111000, + createdAtFormatted: 'Mon, Sep 2 5:08 AM', + duration: 13, + id: '88417e46-6459-435b-b1a4-8524db79946c', + size: 911104, + status: 'failed', + url: null, + }, + ], + hasPending: true, + }); + }); + + it('returns object with empty array when no archives', async () => { + mockSearchArchivesQuery.mockResolvedValue({ items: [] }); + const archives = await getArchives({ + locale: 'en', + sessionKey: 'test-session-id', + videoClient: mockVideoClient, + }); + expect(archives).toEqual({ + archives: [], + hasPending: false, + }); + }); + + it('throws with error when api call throws', async () => { + mockSearchArchivesQuery.mockRejectedValue(new Error('Network Error')); + await expect( + getArchives({ locale: 'en', sessionKey: 'test-session-id', videoClient: mockVideoClient }) + ).rejects.toThrowError(); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/getArchives.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/getArchives.ts new file mode 100644 index 00000000..5ac165b3 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/getArchives.ts @@ -0,0 +1,45 @@ +import { type VideoClient } from '@core/services'; +import { Archive, createArchiveFromServer, hasPending, type ServerArchive } from '../model'; + +export type ArchiveResponse = { + archives: Archive[]; + hasPending: boolean; +}; + +/** + * Returns a list of archives and the status of the archives for a given meeting room. + * @param {string} locale - current locale + * @param {string} sessionId - The session ID to search archives for + * @param {VideoClient} videoClient - The video client instance to use for searching archives + * @returns {Promise} The archives from the meeting room (if any) and whether any archives are pending. + */ +const getArchives = async ({ + locale, + sessionKey, + videoClient, +}: { + locale: string; + sessionKey: string; + videoClient: VideoClient; +}): Promise => { + const response = await videoClient.searchArchives({ sessionKey }); + const archivesFromServer = response?.items; + + if (archivesFromServer instanceof Array) { + const archives = archivesFromServer.map((archiveFromServer) => { + return createArchiveFromServer(locale, archiveFromServer as ServerArchive); + }); + + return { + archives, + hasPending: hasPending(archives), + }; + } + + return { + archives: [], + hasPending: false, + }; +}; + +export default getArchives; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/index.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/index.ts new file mode 100644 index 00000000..1353304c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/index.ts @@ -0,0 +1 @@ +export { default as getArchives, type ArchiveResponse } from './getArchives'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/index.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/index.ts index d31e238b..8b13c86b 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/index.ts @@ -1,33 +1 @@ -import { Archive, createArchiveFromServer, hasPending, type ServerArchive } from './model'; -import { listArchives, startArchiving, stopArchiving } from './routes'; - -export type ArchiveResponse = { - archives: Archive[]; - hasPending: boolean; -}; - -/** - * Returns a list of archives and the status of the archives for a given meeting room. - * @param {string} locale - current locale - * @param {string} roomName - The roomName we check for archives - * @returns {Promise} The archives from the meeting room (if any) and whether any archives are pending. - */ -const getArchives = async (locale: string, roomName: string): Promise => { - const response = await listArchives(roomName); - const archivesFromServer = response?.data?.archives; - if (archivesFromServer instanceof Array) { - const archives = archivesFromServer.map((archiveFromServer: ServerArchive) => - createArchiveFromServer(locale, archiveFromServer) - ); - return { - archives, - hasPending: hasPending(archives), - }; - } - return { - archives: [], - hasPending: false, - }; -}; - -export { startArchiving, stopArchiving, getArchives }; +export { getArchives, type ArchiveResponse } from './getArchives'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/routes.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/routes.ts deleted file mode 100644 index 7a3aeb48..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/routes.ts +++ /dev/null @@ -1,38 +0,0 @@ -import axios, { AxiosResponse } from 'axios'; -import { API_URL } from '../../utils/constants'; - -/** - * Send a request to start archiving. - * See https://developer.vonage.com/en/use-cases/multiparty-with-archiving-with-vonage-video-api#handling-archives - * @param {string} roomName - The name of the meeting room - * @returns {Promise>} The response from the archiving session. - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export const startArchiving = async (roomName: string): Promise> => { - return axios.post(`${API_URL}/session/${roomName}/startArchive`); -}; - -/** - * Send a request to stop archiving. - * See https://developer.vonage.com/en/use-cases/multiparty-with-archiving-with-vonage-video-api#handling-archives - * @param {string} roomName - The name of the meeting room - * @param {string} archiveId - The ID for the currently recording archive. - * @returns {Promise>} The response from the archiving session. - */ -export const stopArchiving = async ( - roomName: string, - archiveId: string - // eslint-disable-next-line @typescript-eslint/no-explicit-any -): Promise> => { - return axios.post(`${API_URL}/session/${roomName}/${archiveId}/stopArchive`); -}; - -/** - * Get list of all of the archives from the meeting room. - * See https://developer.vonage.com/en/use-cases/multiparty-with-archiving-with-vonage-video-api#handling-archives - * @param {string} roomName - The name of the meeting room - * @returns {Promise>} The response from the archiving session. - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export const listArchives = (roomName: string): Promise> => - axios.get(`${API_URL}/session/${roomName}/archives`); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/tests/data.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/tests/data.ts index 8e8b3f3e..cc0e5949 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/tests/data.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/tests/data.ts @@ -1,4 +1,3 @@ -import { AxiosResponse } from 'axios'; import { Archive, ServerArchive } from '../model'; export const startedServerArchive: ServerArchive = { @@ -109,16 +108,3 @@ export const serverArchives: ServerArchive[] = [ availableServerArchive, failedServerArchive, ]; - -export const mockResponse = { - headers: { - 'content-length': '28', - 'content-type': 'application/json; charset=utf-8', - }, - status: 200, - statusText: 'OK', - data: { - archives: serverArchives, - }, - // eslint-disable-next-line @typescript-eslint/no-explicit-any -} as unknown as AxiosResponse; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/tests/index.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/tests/index.spec.ts index 50c56802..c9d3efc5 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/tests/index.spec.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/tests/index.spec.ts @@ -1,16 +1,25 @@ -import { describe, expect, it, Mock, vi } from 'vitest'; -import { AxiosError, AxiosResponse } from 'axios'; -import { listArchives } from '../routes'; -import { mockResponse } from './data'; +import { describe, expect, it, vi } from 'vitest'; +import { serverArchives } from './data'; import { getArchives } from '..'; +import type { ServerArchive } from '../model'; +import type { VideoClient } from '@core/services'; -vi.mock('../routes.ts'); -const mockListArchives = listArchives as Mock<[], ReturnType>; +const mockSearchArchivesQuery = vi.fn((_args?: unknown) => + Promise.resolve({ items: [] as ServerArchive[] }) +); + +const mockVideoClient = { + searchArchives: (...args: unknown[]) => mockSearchArchivesQuery(...args), +} as unknown as VideoClient; describe('getArchives', () => { it('it returns an object with array of Archives and hasPending flag', async () => { - mockListArchives.mockResolvedValue(mockResponse); - const archives = await getArchives('en', 'roomName'); + mockSearchArchivesQuery.mockResolvedValue({ items: serverArchives }); + const archives = await getArchives({ + locale: 'en', + sessionKey: 'test-session-id', + videoClient: mockVideoClient, + }); expect(archives).toEqual({ archives: [ { @@ -46,27 +55,22 @@ describe('getArchives', () => { }); it('it returns object with empty array when no archives', async () => { - mockListArchives.mockResolvedValue({ - headers: { - 'content-length': '28', - 'content-type': 'application/json; charset=utf-8', - }, - status: 200, - statusText: 'OK', - data: { - archives: [], - }, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } as unknown as AxiosResponse); - const archives = await getArchives('en', 'roomName'); + mockSearchArchivesQuery.mockResolvedValue({ items: [] }); + const archives = await getArchives({ + locale: 'en', + sessionKey: 'test-session-id', + videoClient: mockVideoClient, + }); expect(archives).toEqual({ archives: [], hasPending: false, }); }); - it('it throws with error when api call throws', () => { - mockListArchives.mockRejectedValue(new AxiosError('Network Error', 'ERR_NETWORK')); - void expect(getArchives('en', 'roomName')).rejects.toThrowError(); + it('it throws with error when api call throws', async () => { + mockSearchArchivesQuery.mockRejectedValue(new Error('Network Error')); + await expect( + getArchives({ locale: 'en', sessionKey: 'test-session-id', videoClient: mockVideoClient }) + ).rejects.toThrowError(); }); }); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/captions.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/captions.ts deleted file mode 100644 index 2f062e94..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/captions.ts +++ /dev/null @@ -1,47 +0,0 @@ -import axios, { AxiosResponse } from 'axios'; -import { API_URL } from '../utils/constants'; - -/** - * Type definitions for enabling captions. - * @typedef {object} EnableCaptionsType - * @property {string} captionsId - The ID for the currently-enabled captions. - * @property {string} message (optional) - An error message. - */ -export type EnableCaptionsType = { - captionsId: string; - message?: string; -}; - -/** - * Type definitions for disabling captions. - * @typedef {object} DisableCaptionsType - * @property {string} disableResponse - The response message from disabling captions request. - * @property {string} errorMessage (optional) - An error message. - */ -export type DisableCaptionsType = { - messageResponse: string; - message?: string; -}; - -/** - * Send a request to start captions. - * More about enabling captions can be found here: https://developer.vonage.com/en/video/guides/live-caption#steps-to-enable-live-captions - * @param {string} roomName - The name of the meeting room - * @returns {Promise>} The response from starting the captions request. - */ -export const enableCaptions = async (roomName: string) => { - return await axios.post(`${API_URL}/session/${roomName}/enableCaptions`); -}; - -/** - * Send a request to stop captions. - * @param {string} roomName - The name of the meeting room - * @param {string} captionsId - The ID for the currently-enabled captions. - * @returns {Promise>} The response message from disabling captions request. - */ -export const disableCaptions = async ( - roomName: string, - captionsId: string -): Promise> => { - return await axios.post(`${API_URL}/session/${roomName}/${captionsId}/disableCaptions`); -}; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettings/Dialog/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettings/Dialog/index.tsx new file mode 100644 index 00000000..3d759331 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettings/Dialog/index.tsx @@ -0,0 +1 @@ +export { AdvancedSettingsDialog as default } from '../../AdvancedSettingsDialog'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.spec.tsx new file mode 100644 index 00000000..bad02f1b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.spec.tsx @@ -0,0 +1,74 @@ +import { render as renderBase, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import type { ReactElement } from 'react'; +import { beforeEach, afterEach, describe, expect, it } from 'vitest'; +import { MemoryRouter } from 'react-router-dom'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import AdvancedSettingsDialog from './AdvancedSettingsDialog'; + +describe('AdvancedSettingsDialog', () => { + beforeEach(() => { + advancedSettings$.setState((state) => ({ ...state, isOpen: true })); + }); + + afterEach(() => { + advancedSettings$.reset(); + }); + + it('renders dialog when open', async () => { + render(); + + await waitFor(() => { + expect(screen.getByRole('dialog')).toBeInTheDocument(); + }); + + expect(screen.getByText(/^settings$/i)).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /general/i })).toBeInTheDocument(); + }); + + it('switches to the video tab', async () => { + const user = userEvent.setup(); + render(); + + await user.click(screen.getByRole('button', { name: /video/i })); + + expect(screen.getByLabelText(/bitrate/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/codec/i)).toBeInTheDocument(); + }); + + it('switches to the audio tab', async () => { + const user = userEvent.setup(); + render(); + + await user.click(screen.getByRole('button', { name: /audio/i })); + + expect(screen.getByRole('heading', { name: /^audio$/i })).toBeInTheDocument(); + expect(screen.getByLabelText(/audio bitrate/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/enable opus dtx/i)).toBeInTheDocument(); + }); + + it('switches to the statistics tab', async () => { + const user = userEvent.setup(); + render(); + + await user.click(screen.getByRole('button', { name: /statistics/i })); + + expect(screen.getByRole('heading', { name: /^statistics$/i })).toBeInTheDocument(); + expect(screen.getByLabelText(/enable publisher bandwidth estimate/i)).toBeInTheDocument(); + expect(screen.getAllByText(/publisher/i).length).toBeGreaterThan(0); + }); + + it('closes the dialog through context on close', async () => { + render(); + + await userEvent.click(screen.getByLabelText(/close/i)); + + await waitFor(() => { + expect(screen.queryByRole('dialog')).not.toBeInTheDocument(); + }); + }); +}); + +function render(ui: ReactElement) { + return renderBase({ui}); +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.tsx new file mode 100644 index 00000000..025097b3 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.tsx @@ -0,0 +1,67 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import Dialog from '@mui/material/Dialog'; +import classNames from 'classnames'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import VividIcon from '@ui/VividIcon'; +import { AdvancedSettingsAudioTab } from './components/AdvancedSettingsAudioTab'; +import { AdvancedSettingsGeneralTab } from './components/AdvancedSettingsGeneralTab'; +import { AdvancedSettingsSidebar } from './components/AdvancedSettingsSidebar'; +import { AdvancedSettingsStatisticsTab } from './components/AdvancedSettingsStatisticsTab'; +import { AdvancedSettingsVideoTab } from './components/AdvancedSettingsVideoTab'; + +const AdvancedSettingsDialog = (): ReactElement => { + const { t } = useTranslation(); + const isOpen = advancedSettings$.use.select(({ isOpen }) => isOpen); + const selectedTab = advancedSettings$.use.select(({ selectedTab }) => selectedTab); + + const tabContent = (() => { + if (selectedTab === 'general') return ; + if (selectedTab === 'video') return ; + if (selectedTab === 'audio') return ; + return ; + })(); + + return ( + +
+
+

+ {t('advancedSettings.title')} +

+ +
+ +
+ + +
{tabContent}
+
+
+
+ ); +}; + +export default AdvancedSettingsDialog; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.spec.tsx new file mode 100644 index 00000000..bcf09aa6 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.spec.tsx @@ -0,0 +1,69 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import type { ReactElement } from 'react'; +import { afterEach, describe, expect, it } from 'vitest'; +import { MemoryRouter } from 'react-router-dom'; +import type { advancedSettings } from '@Context/AdvancedSettings'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import AdvancedSettingsAudioTab from './AdvancedSettingsAudioTab'; + +describe('AdvancedSettingsAudioTab', () => { + afterEach(() => { + advancedSettings$.reset(); + }); + + it('renders all audio controls with automatic bitrate selected by default', () => { + render(); + + expect(screen.getByRole('heading', { name: /^audio$/i })).toBeInTheDocument(); + expect(screen.getByLabelText(/audio bitrate/i)).toBeInTheDocument(); + expect(screen.getByRole('combobox')).toHaveValue('automatic'); + expect( + screen.queryByTestId('advanced-settings-custom-audio-bitrate-slider') + ).not.toBeInTheDocument(); + expect(screen.getByLabelText(/enable opus dtx/i)).toBeChecked(); + expect(screen.getByLabelText(/publisher audio fallback/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/subscriber audio fallback/i)).toBeInTheDocument(); + }); + + it('renders the custom audio bitrate slider when custom mode is selected', () => { + render(, { dialogState: { audioBitrateMode: 'custom' } }); + + expect(screen.getByTestId('advanced-settings-custom-audio-bitrate-slider')).toBeInTheDocument(); + expect(screen.getByText(/6 kbps/i)).toBeInTheDocument(); + expect(screen.getByText(/510 kbps/i)).toBeInTheDocument(); + expect(screen.getByText(/128 kbps/i)).toBeInTheDocument(); + }); + + it('shows custom slider after selecting custom bitrate mode', async () => { + const user = userEvent.setup(); + render(); + + await user.selectOptions(screen.getByRole('combobox'), 'custom'); + + expect(screen.getByTestId('advanced-settings-custom-audio-bitrate-slider')).toBeInTheDocument(); + }); + + it('toggles enable opus dtx checkbox', async () => { + const user = userEvent.setup(); + render(); + + await user.click(screen.getByRole('checkbox', { name: /enable opus dtx/i })); + + expect(screen.getByRole('checkbox', { name: /enable opus dtx/i })).not.toBeChecked(); + }); +}); +type RenderOptions = { + dialogState?: Partial; + initialPath?: string; +}; +function render( + ui: ReactElement, + { dialogState, initialPath = '/waiting-room' }: RenderOptions = {} +) { + if (dialogState) { + advancedSettings$.setState((state) => ({ ...state, ...dialogState })); + } + + return renderBase({ui}); +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.tsx new file mode 100644 index 00000000..7719c693 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.tsx @@ -0,0 +1,127 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useLocation } from 'react-router-dom'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import SelectField from '@ui/SelectField'; +import SwitchField from '@ui/SwitchField'; +import { ADVANCED_SETTINGS_AUDIO_BITRATE_MODE } from '../../types/types'; + +const { + setAudioBitrateMode, + setCustomAudioBitrate, + setEnableDtx, + setPublisherAudioFallbackEnabled, + setSubscriberAudioFallbackEnabled, +} = advancedSettings$.actions; + +const AdvancedSettingsAudioTab = (): ReactElement => { + const { t } = useTranslation(); + const { pathname } = useLocation(); + const isInWaitingRoom = pathname.startsWith('/waiting-room'); + const nextCallWarningKey = isInWaitingRoom + ? 'advancedSettings.audio.nextCallWarningWaitingRoom' + : 'advancedSettings.audio.nextCallWarningMeetingRoom'; + const audioBitrateMode = advancedSettings$.use.select(({ audioBitrateMode }) => audioBitrateMode); + const customAudioBitrate = advancedSettings$.use.select( + ({ customAudioBitrate }) => customAudioBitrate + ); + const enableDtx = advancedSettings$.use.select(({ enableDtx }) => enableDtx); + const publisherAudioFallbackEnabled = advancedSettings$.use.select( + ({ publisherAudioFallbackEnabled }) => publisherAudioFallbackEnabled + ); + const subscriberAudioFallbackEnabled = advancedSettings$.use.select( + ({ subscriberAudioFallbackEnabled }) => subscriberAudioFallbackEnabled + ); + + const audioBitrateOptions = [ + { + value: ADVANCED_SETTINGS_AUDIO_BITRATE_MODE.automatic, + label: t('advancedSettings.audio.bitrate.options.automatic'), + }, + { + value: ADVANCED_SETTINGS_AUDIO_BITRATE_MODE.custom, + label: t('advancedSettings.audio.bitrate.options.custom'), + }, + ]; + + return ( +
+

+ {t('advancedSettings.tabs.audio')} +

+ +

+ {t(nextCallWarningKey)} +

+ +
+ + + {audioBitrateMode === ADVANCED_SETTINGS_AUDIO_BITRATE_MODE.custom && ( +
+

+ {t('advancedSettings.audio.bitrate.customLabel')} +

+ +
+ { + setCustomAudioBitrate(Number(event.target.value)); + }} + data-testid="advanced-settings-custom-audio-bitrate-slider" + aria-label={t('advancedSettings.audio.bitrate.customLabel')} + /> +
+ {t('advancedSettings.audio.bitrate.minimum')} + + {t('advancedSettings.audio.bitrate.currentValue', { + value: customAudioBitrate, + })} + + {t('advancedSettings.audio.bitrate.maximum')} +
+
+
+ )} +
+ + + + + + +
+ ); +}; + +export default AdvancedSettingsAudioTab; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/index.tsx new file mode 100644 index 00000000..ce91d797 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsAudioTab } from './AdvancedSettingsAudioTab'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.spec.tsx new file mode 100644 index 00000000..6302e208 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.spec.tsx @@ -0,0 +1,40 @@ +import { fireEvent, render, screen, within } from '@testing-library/react'; +import { describe, expect, it, vi } from 'vitest'; +import AdvancedSettingsCodecPriorityField from './AdvancedSettingsCodecPriorityField'; + +describe('AdvancedSettingsCodecPriorityField', () => { + it('reorders codecs through drag and drop', () => { + const setCodecPriority = vi.fn(); + + render( + + ); + + const vp9Item = screen.getByTestId('advanced-settings-codec-priority-item-vp9'); + const h264Item = screen.getByTestId('advanced-settings-codec-priority-item-h264'); + + fireEvent.dragStart(vp9Item); + fireEvent.dragOver(h264Item); + fireEvent.drop(h264Item); + + expect(setCodecPriority).toHaveBeenCalledWith(['vp8', 'h264', 'vp9']); + }); + + it('renders the codec labels in SDK order by default', () => { + render( + + ); + + const codecItems = within(screen.getByTestId('advanced-settings-codec-priority-list')) + .getAllByRole('listitem') + .map((item) => item.textContent); + + expect(codecItems).toEqual(expect.arrayContaining(['1VP9', '2VP8', '3H.264'])); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.tsx new file mode 100644 index 00000000..3b221c3a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.tsx @@ -0,0 +1,139 @@ +import { useState } from 'react'; +import type { DragEvent, ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import classNames from 'classnames'; +import type { + AdvancedSettingsManualCodecOrder, + AdvancedSettingsVideoCodec, +} from '../../types/types'; + +type AdvancedSettingsCodecPriorityFieldProps = { + codecPriority: AdvancedSettingsManualCodecOrder; + setCodecPriority: (value: AdvancedSettingsManualCodecOrder) => void; +}; + +const AdvancedSettingsCodecPriorityField = ({ + codecPriority, + setCodecPriority, +}: AdvancedSettingsCodecPriorityFieldProps): ReactElement => { + const { t } = useTranslation(); + const [draggedCodec, setDraggedCodec] = useState(null); + const [dropTargetCodec, setDropTargetCodec] = useState(null); + + const handleDragStart = (event: DragEvent, codec: AdvancedSettingsVideoCodec) => { + if (event.dataTransfer) { + event.dataTransfer.effectAllowed = 'move'; + event.dataTransfer.setData('text/plain', codec); + } + + setDraggedCodec(codec); + setDropTargetCodec(codec); + }; + + const handleDragEnd = () => { + setDraggedCodec(null); + setDropTargetCodec(null); + }; + + const handleDragOver = ( + event: DragEvent, + targetCodec: AdvancedSettingsVideoCodec + ) => { + event.preventDefault(); + + if (!draggedCodec || draggedCodec === targetCodec) return; + + setDropTargetCodec(targetCodec); + }; + + const handleDrop = (event: DragEvent, targetCodec: AdvancedSettingsVideoCodec) => { + event.preventDefault(); + + const draggedCodecFromEvent = event.dataTransfer?.getData('text/plain') as + | AdvancedSettingsVideoCodec + | undefined; + const activeDraggedCodec = draggedCodec ?? draggedCodecFromEvent; + + if (!activeDraggedCodec || activeDraggedCodec === targetCodec) { + handleDragEnd(); + return; + } + + const reorderedCodecs = reorderCodecPriority({ + codecPriority, + draggedCodec: activeDraggedCodec, + targetCodec, + }); + + setCodecPriority(reorderedCodecs); + handleDragEnd(); + }; + + return ( +
+

+ {t('advancedSettings.video.codec.priority.label')} +

+ +

+ {t('advancedSettings.video.codec.priority.description')} +

+ +
    + {codecPriority.map((codec, index) => { + const isDraggedCodec = draggedCodec === codec; + const isDropTarget = dropTargetCodec === codec && draggedCodec !== codec; + + return ( +
  1. { + handleDragStart(event, codec); + }} + onDragEnd={handleDragEnd} + onDragOver={(event) => { + handleDragOver(event, codec); + }} + onDrop={(event) => { + handleDrop(event, codec); + }} + className={classNames( + 'flex cursor-grab items-center gap-3 rounded-vera-medium border bg-vera-surface px-4 py-3', + isDraggedCodec ? 'border-vera-primary opacity-60' : 'border-vera-border', + isDropTarget ? 'border-vera-primary' : null + )} + data-testid={`advanced-settings-codec-priority-item-${codec}`} + > + + {index + 1} + + + + {t(`advancedSettings.video.codec.priority.options.${codec}`)} + +
  2. + ); + })} +
+
+ ); +}; + +function reorderCodecPriority(args: { + codecPriority: AdvancedSettingsManualCodecOrder; + draggedCodec: AdvancedSettingsVideoCodec; + targetCodec: AdvancedSettingsVideoCodec; +}): AdvancedSettingsManualCodecOrder { + const { codecPriority, draggedCodec, targetCodec } = args; + const reorderedCodecs = [...codecPriority]; + const draggedCodecIndex = reorderedCodecs.indexOf(draggedCodec); + const targetCodecIndex = reorderedCodecs.indexOf(targetCodec); + + reorderedCodecs.splice(draggedCodecIndex, 1); + reorderedCodecs.splice(targetCodecIndex, 0, draggedCodec); + + return reorderedCodecs as AdvancedSettingsManualCodecOrder; +} + +export default AdvancedSettingsCodecPriorityField; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/index.tsx new file mode 100644 index 00000000..488e84d7 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsCodecPriorityField } from './AdvancedSettingsCodecPriorityField'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.spec.tsx new file mode 100644 index 00000000..7034aa8f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.spec.tsx @@ -0,0 +1,51 @@ +import { fireEvent, render as renderBase, screen } from '@testing-library/react'; +import type { ReactElement } from 'react'; +import { afterEach, describe, expect, it, vi } from 'vitest'; +import type { advancedSettings } from '@Context/AdvancedSettings'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import AdvancedSettingsCustomVideoBitrateField from './AdvancedSettingsCustomVideoBitrateField'; + +describe('AdvancedSettingsCustomVideoBitrateField', () => { + afterEach(() => { + advancedSettings$.reset(); + }); + + it('renders the current bitrate and range labels', () => { + render(); + + expect(screen.getByText(/custom bitrate/i)).toBeInTheDocument(); + expect(screen.getByTestId('advanced-settings-custom-video-bitrate-slider')).toHaveAttribute( + 'type', + 'range' + ); + expect(screen.getAllByText(/5 kbps/i).length).toBeGreaterThan(0); + expect(screen.getByText(/^10 Mbps$/i)).toBeInTheDocument(); + expect(screen.getByText(/^500 kbps$/i)).toBeInTheDocument(); + }); + + it('calls onChange with the clamped value when slider exceeds the maximum', () => { + const handleChange = vi.fn(); + + render(, { + dialogState: { customVideoBitrate: 9_995_000 }, + }); + + const slider = screen.getByTestId('advanced-settings-custom-video-bitrate-slider'); + + fireEvent.change(slider, { target: { value: '20000000' } }); + + expect(handleChange).toHaveBeenCalledWith(10_000_000); + }); +}); + +type RenderOptions = { + dialogState?: Partial; +}; + +function render(ui: ReactElement, { dialogState }: RenderOptions = {}) { + if (dialogState) { + advancedSettings$.setState((state) => ({ ...state, ...dialogState })); + } + + return renderBase(ui); +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.tsx new file mode 100644 index 00000000..ccdabcf1 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.tsx @@ -0,0 +1,87 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import { env } from '../../../../env'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import type { AdvancedSettingsCustomVideoBitrate } from '../../types/types'; + +const CUSTOM_VIDEO_BITRATE_STEP_BPS = 5_000; + +type Props = { + onChange: (value: AdvancedSettingsCustomVideoBitrate) => void; +}; + +const AdvancedSettingsCustomVideoBitrateField = ({ onChange }: Props): ReactElement => { + const { t } = useTranslation(); + const customVideoBitrate = advancedSettings$.use.select((state) => state.customVideoBitrate); + const currentCustomVideoBitrate = Number(customVideoBitrate); + + return ( +
+

+ {t('advancedSettings.video.customBitrate.label')} +

+ +

+ {t('advancedSettings.video.customBitrate.description')} +

+ +
+ { + onChange(clampCustomVideoBitrate(Number(event.target.value))); + }} + className="w-full accent-vera-primary" + data-testid="advanced-settings-custom-video-bitrate-slider" + aria-label={t('advancedSettings.video.customBitrate.label')} + /> + +
+ {t('advancedSettings.video.customBitrate.minimum')} + + {formatVideoBitrateLabel({ + customVideoBitrate: currentCustomVideoBitrate, + lowerUnitLabel: t('advancedSettings.video.customBitrate.units.lower'), + higherUnitLabel: t('advancedSettings.video.customBitrate.units.higher'), + })} + + {t('advancedSettings.video.customBitrate.maximum')} +
+
+
+ ); +}; + +function clampCustomVideoBitrate(customVideoBitrate: number): number { + if (customVideoBitrate < env.MIN_CUSTOM_VIDEO_BITRATE_BPS) { + return Number(env.MIN_CUSTOM_VIDEO_BITRATE_BPS); + } + + if (customVideoBitrate > env.MAX_CUSTOM_VIDEO_BITRATE_BPS) { + return Number(env.MAX_CUSTOM_VIDEO_BITRATE_BPS); + } + + return customVideoBitrate; +} + +function formatVideoBitrateLabel({ + customVideoBitrate, + lowerUnitLabel, + higherUnitLabel, +}: { + customVideoBitrate: number; + lowerUnitLabel: string; + higherUnitLabel: string; +}): string { + if (customVideoBitrate >= 1_000_000) { + return `${customVideoBitrate / 1_000_000} ${higherUnitLabel}`; + } + + return `${Math.round(customVideoBitrate / 1_000)} ${lowerUnitLabel}`; +} + +export default AdvancedSettingsCustomVideoBitrateField; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/index.tsx new file mode 100644 index 00000000..d81b6d94 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsCustomVideoBitrateField } from './AdvancedSettingsCustomVideoBitrateField'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.spec.tsx new file mode 100644 index 00000000..e2264000 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.spec.tsx @@ -0,0 +1,13 @@ +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; +import AdvancedSettingsGeneralTab from './AdvancedSettingsGeneralTab'; + +describe('AdvancedSettingsGeneralTab', () => { + it('renders the general tab content', () => { + render(); + + expect(screen.getByRole('heading', { name: /general/i })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /reset default values/i })).toBeInTheDocument(); + expect(screen.getByText(/restore all settings to their default values/i)).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.tsx new file mode 100644 index 00000000..32a85788 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.tsx @@ -0,0 +1,27 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; + +const AdvancedSettingsGeneralTab = (): ReactElement => { + const { t } = useTranslation(); + + return ( +
+

+ {t('advancedSettings.tabs.general')} +

+
+ +

+ {t('advancedSettings.general.resetDescription')} +

+
+
+ ); +}; + +export default AdvancedSettingsGeneralTab; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/index.tsx new file mode 100644 index 00000000..fce95ded --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsGeneralTab } from './AdvancedSettingsGeneralTab'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.spec.tsx new file mode 100644 index 00000000..3fa311b9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.spec.tsx @@ -0,0 +1,29 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import type { ReactElement } from 'react'; +import { describe, expect, it } from 'vitest'; +import AdvancedSettingsSidebar from './AdvancedSettingsSidebar'; + +describe('AdvancedSettingsSidebar', () => { + it('renders all tabs', () => { + render(); + + expect(screen.getByRole('button', { name: /general/i })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /video/i })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /audio/i })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /statistics/i })).toBeInTheDocument(); + }); + + it('updates selected tab when clicking another tab', async () => { + const user = userEvent.setup(); + render(); + + await user.click(screen.getByRole('button', { name: /statistics/i })); + + expect(screen.getByRole('button', { name: /statistics/i })).toHaveClass('bg-vera-surface'); + }); +}); + +function render(ui: ReactElement) { + return renderBase(ui); +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.tsx new file mode 100644 index 00000000..3d38f6aa --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.tsx @@ -0,0 +1,41 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import classNames from 'classnames'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import type { AdvancedSettingsTab } from '../../types/types'; + +const tabs: AdvancedSettingsTab[] = ['general', 'video', 'audio', 'statistics']; +const { setSelectedTab } = advancedSettings$.actions; + +const AdvancedSettingsSidebar = (): ReactElement => { + const { t } = useTranslation(); + const selectedTab = advancedSettings$.use.select((state) => state.selectedTab); + + return ( +
+ {tabs.map((tab) => { + const isSelected = selectedTab === tab; + + return ( + + ); + })} +
+ ); +}; + +export default AdvancedSettingsSidebar; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/index.tsx new file mode 100644 index 00000000..d3f7c8b9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsSidebar } from './AdvancedSettingsSidebar'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.spec.tsx new file mode 100644 index 00000000..cd1a5bad --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.spec.tsx @@ -0,0 +1,21 @@ +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; +import AdvancedSettingsStatisticsGroup from './AdvancedSettingsStatisticsGroup'; + +describe('AdvancedSettingsStatisticsGroup', () => { + it('renders only the statistics sections that have items', () => { + render( + + ); + + expect(screen.getAllByText(/publisher/i).length).toBeGreaterThan(0); + expect(screen.queryByRole('heading', { name: /audio/i })).not.toBeInTheDocument(); + expect(screen.getByRole('heading', { name: /video/i })).toBeInTheDocument(); + expect(screen.getByText(/bytes received/i)).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.tsx new file mode 100644 index 00000000..0cf5ac3a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.tsx @@ -0,0 +1,89 @@ +import { useMemo, type ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Collapsible } from '@ui/components'; +import LabeledValueList from '@ui/LabeledValueList'; +import type { IMetricValue } from '@core/metrics'; +import type { Any } from '@common/types'; + +type AdvancedSettingsStatisticItem = { + label: string; + value: IMetricValue | string; +}; + +type AdvancedSettingsStatisticsGroupProps = { + title: string; + audioItems: AdvancedSettingsStatisticItem[]; + videoItems: AdvancedSettingsStatisticItem[]; + defaultExpanded?: boolean; +}; + +const AdvancedSettingsStatisticsGroup = ({ + title, + audioItems, + videoItems, + defaultExpanded = false, +}: AdvancedSettingsStatisticsGroupProps): ReactElement => { + const { t } = useTranslation(); + const hasStatistics = audioItems.length > 0 || videoItems.length > 0; + + const formattedAudioItems = useMemo( + () => + audioItems.map(({ label, value }) => ({ + label, + value: value.toString(), + })), + [audioItems] + ); + + const formattedVideoItems = useMemo( + () => + videoItems.map(({ label, value }) => ({ + label, + value: value.toString(), + })), + [videoItems] + ); + + return ( + + + + {title} + + + + + + + {hasStatistics && ( +
+ {audioItems.length > 0 && ( + + )} + + {videoItems.length > 0 && ( + + )} +
+ )} + + {!hasStatistics && ( +

+ {t('advancedSettings.statistics.empty')} +

+ )} +
+
+ ); +}; + +export default AdvancedSettingsStatisticsGroup; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/index.tsx new file mode 100644 index 00000000..913d618f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsStatisticsGroup } from './AdvancedSettingsStatisticsGroup'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.spec.tsx new file mode 100644 index 00000000..8736f1c1 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.spec.tsx @@ -0,0 +1,161 @@ +import { render as renderBase, screen, waitFor } from '@testing-library/react'; +import type { ReactElement } from 'react'; +import { describe, expect, it, vi } from 'vitest'; +import type { Publisher, Subscriber } from '@vonage/client-sdk-video'; +import type { SubscriberWrapper } from '@app-types/session'; +import AdvancedSettingsStatisticsTab from './AdvancedSettingsStatisticsTab'; +import makeTestProvider, { ProviderOptions, providers } from '@test/providers/makeTestProvider'; +import { DEVICE_ACCESS_STATUS } from '@utils/constants'; + +describe('AdvancedSettingsStatisticsTab', () => { + vi.mock('@hooks/usePermissions', () => ({ + default: () => ({ + accessStatus: DEVICE_ACCESS_STATUS.ACCEPTED, + setAccessStatus: vi.fn(), + }), + })); + + it('renders collection and an empty publisher statistics group', () => { + render(); + + expect(screen.getByRole('heading', { name: /^statistics$/i })).toBeInTheDocument(); + expect(screen.getByLabelText(/enable publisher bandwidth estimate/i)).toBeInTheDocument(); + expect(screen.getAllByText(/publisher/i).length).toBeGreaterThan(0); + expect(screen.getByText(/statistics/i)).toBeInTheDocument(); + }); + + it('renders live publisher stats when statistics are enabled', async () => { + const publisher = { + videoWidth: vi.fn(() => 1280), + videoHeight: vi.fn(() => 720), + getStats: vi.fn((callback) => { + callback(undefined, [ + { + stats: { + audio: { packetsSent: 10, packetsLost: 0, bytesSent: 1024 }, + video: { + packetsSent: 50, + packetsLost: 1, + bytesSent: 51200, + frameRate: 30, + bitrate: 3_000_000, + connectionEstimatedBandwidthBps: 3_000_000, + layers: [], + }, + mediaLink: { transport: { connectionEstimatedBandwidth: 3_000_000 } }, + }, + }, + ]); + }), + } as unknown as Publisher; + + render(, { + publisherContext: { + __interceptor: (context) => { + if (context) { + context.publisher = publisher; + } + }, + }, + }); + + await waitFor(() => { + expect(screen.getByText('30 fps')).toBeInTheDocument(); + expect(screen.getByText('1280x720')).toBeInTheDocument(); + // expect(screen.getByText('3.00 Mbps')).toBeInTheDocument(); + }); + }); + + it('renders subscriber group with codec, decoded frame rate and freeze count', async () => { + const subscriberWrapper: SubscriberWrapper = { + id: 'sub-1', + element: document.createElement('video'), + isScreenshare: false, + isPinned: false, + subscriber: { + stream: { name: 'Bob' }, + getStats: vi.fn((callback) => { + callback(undefined, { + audio: { packetsReceived: 10, packetsLost: 0, bytesReceived: 500 }, + video: { + packetsReceived: 40, + packetsLost: 0, + bytesReceived: 20000, + width: 640, + height: 480, + codec: 'VP9', + frameRate: 24, + decodedFrameRate: 23, + bitrate: 600_000, + freezeCount: 5, + totalFreezesDuration: 1200, + }, + mediaLink: { + transport: { connectionEstimatedBandwidth: 1_000_000 }, + remotePublisherTransport: { connectionEstimatedBandwidth: 900_000 }, + }, + }); + }), + } as unknown as Subscriber, + }; + + render(, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.subscriberWrappers = [subscriberWrapper]; + } + }, + }, + }); + + await waitFor(() => { + expect(screen.getByText('Bob')).toBeInTheDocument(); + expect(screen.getByText('VP9')).toBeInTheDocument(); + expect(screen.getByText('5')).toBeInTheDocument(); + }); + }); +}); + +type RenderOptions = { + advancedSettingsContext?: ProviderOptions['AdvancedSettingsContext']; + userContext?: ProviderOptions['UserContext']; + publisherContext?: ProviderOptions['PublisherContext']; + previewPublisherContext?: ProviderOptions['PreviewPublisherContext']; + sessionContext?: ProviderOptions['SessionContext']; +}; + +function render( + ui: ReactElement, + { + advancedSettingsContext, + userContext, + publisherContext, + previewPublisherContext, + sessionContext, + }: RenderOptions = {} +) { + const { wrapper, ...context } = makeTestProvider( + [ + providers.advancedSettings, + providers.runtime, + providers.user, + providers.publisher, + providers.previewPublisher, + providers.session, + ], + { + advancedSettingsContext, + runtimeContext: undefined, + userContext, + sessionContext, + publisherContext, + previewPublisherContext, + } + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.tsx new file mode 100644 index 00000000..17cb5ad7 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.tsx @@ -0,0 +1,55 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import usePublisherContext from '@hooks/usePublisherContext'; +import SwitchField from '@ui/SwitchField'; +import PublisherStatistics from './components/PublisherStatistics'; +import usePreviewPublisherContext from '@hooks/usePreviewPublisherContext'; +import SubscriberStatistics from './components/SubscriberStatistics'; +import useSessionContext from '@hooks/useSessionContext'; + +const { setPublisherStatisticsEnabled } = advancedSettings$.actions; + +const AdvancedSettingsStatisticsTab = (): ReactElement => { + const { t } = useTranslation(); + const { publisher: meetingPublisher } = usePublisherContext(); + const { publisher: previewPublisher } = usePreviewPublisherContext(); + const { subscriberWrappers } = useSessionContext(); + + const publisher = meetingPublisher ?? previewPublisher; + + const publisherStatisticsEnabled = advancedSettings$.use.select( + (state) => state.publisherStatisticsEnabled + ); + + return ( +
+

+ {t('advancedSettings.tabs.statistics')} +

+ + +
+ {publisher && } + + {subscriberWrappers.length > 0 && ( +

+ {t('advancedSettings.statistics.groups.subscribers')} +

+ )} + + {subscriberWrappers.map(({ subscriber }, index) => ( + + ))} +
+
+ ); +}; + +export default AdvancedSettingsStatisticsTab; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/PublisherStatistics.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/PublisherStatistics.tsx new file mode 100644 index 00000000..382f105b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/PublisherStatistics.tsx @@ -0,0 +1,117 @@ +import { type ReactElement, useMemo } from 'react'; +import { usePublisherStats } from '@core/hooks'; +import { useTranslation } from 'react-i18next'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import { AdvancedSettingsStatisticsGroup } from '../../AdvancedSettingsStatisticsGroup'; +import { Publisher } from '@vonage/client-sdk-video'; +import { BitrateValue, FrameRateValue, optionalValue, ResolutionValue } from '@core/metrics'; + +interface PublisherStatisticsProps { + publisher: Publisher; +} + +const optionalValueArgs = { fallback: '–' }; + +const PublisherStatistics = ({ publisher }: PublisherStatisticsProps): ReactElement => { + const { t } = useTranslation(); + + const publisherStatisticsEnabled = advancedSettings$.use.select( + (state) => state.publisherStatisticsEnabled + ); + const fixedFrameRate = advancedSettings$.use.select((state) => state.frameRate); + + const { data } = usePublisherStats({ + publisher, + publisherStatisticsEnabled, + fixedFrameRate: fixedFrameRate ?? null, + }); + + const publisherAudioStatistics = useMemo(() => { + if (!data?.audio) { + return []; + } + + return [ + { + label: t('advancedSettings.statistics.metrics.packetsSent'), + value: data.audio.packetsSent, + }, + { + label: t('advancedSettings.statistics.metrics.packetsLostSent'), + value: data.audio.packetsLost, + }, + { + label: t('advancedSettings.statistics.metrics.bytesSent'), + value: data.audio.bytesSent, + }, + ]; + }, [data, t]); + + const publisherVideoStatistics = useMemo(() => { + if (!data?.video) { + return []; + } + + return [ + { + label: t('advancedSettings.statistics.metrics.resolution'), + value: data.resolution, + }, + { + label: t('advancedSettings.statistics.metrics.frameRate'), + value: data.frameRate, + }, + { + label: t('advancedSettings.statistics.metrics.bitrate'), + value: data.bitrateBps, + }, + { + label: t('advancedSettings.statistics.metrics.packetLoss'), + value: data.packetLossRatio, + }, + { + label: t('advancedSettings.statistics.metrics.packetsSent'), + value: data.video.packetsSent, + }, + { + label: t('advancedSettings.statistics.metrics.packetsLostSent'), + value: data.video.packetsLost, + }, + { + label: t('advancedSettings.statistics.metrics.bytesSent'), + value: data.video.bytesSent, + }, + { + label: t('advancedSettings.statistics.metrics.estimatedBandwidth'), + value: data.connectionEstimatedBandwidthBps, + }, + + ...(data.videoLayers ?? []).map((layer, index) => ({ + label: t('advancedSettings.statistics.metrics.videoLayer', { + index: index + 1, + codec: layer.codec, + }), + + value: [ + optionalValue(ResolutionValue, layer, optionalValueArgs), + optionalValue(FrameRateValue, layer.encodedFrameRate, optionalValueArgs), + optionalValue(BitrateValue, layer.bitrate, optionalValueArgs), + layer.qualityLimitationReason !== 'none' ? layer.qualityLimitationReason : null, + ] + .filter(Boolean) + .join(' · '), + })), + ]; + }, [data, t]); + + return ( + + ); +}; + +export default PublisherStatistics; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/SubscriberStatistics.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/SubscriberStatistics.tsx new file mode 100644 index 00000000..211aebbc --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/SubscriberStatistics.tsx @@ -0,0 +1,110 @@ +import { useMemo, type ReactElement } from 'react'; +import { useSubscriberStats } from '@core/hooks'; +import { useTranslation } from 'react-i18next'; +import { AdvancedSettingsStatisticsGroup } from '../../AdvancedSettingsStatisticsGroup'; +import { Subscriber } from '@vonage/client-sdk-video'; + +interface SubscriberStatisticsProps { + subscriber: Subscriber; +} + +const SubscriberStatistics = ({ subscriber }: SubscriberStatisticsProps): ReactElement => { + const { t } = useTranslation(); + + const { data } = useSubscriberStats({ subscriber }); + + const subscriberStatisticsGroups = useMemo(() => { + if (!data) { + return { + id: 'no-stats', + title: '...', + audioItems: [], + videoItems: [], + }; + } + + return { + id: data.id, + title: data?.title, + audioItems: [ + { + label: t('advancedSettings.statistics.metrics.packetsReceived'), + value: data.audio.packetsReceived, + }, + { + label: t('advancedSettings.statistics.metrics.packetsLostReceived'), + value: data.audio.packetsLost, + }, + { + label: t('advancedSettings.statistics.metrics.bytesReceived'), + value: data.audio.bytesReceived, + }, + ], + videoItems: [ + { + label: t('advancedSettings.statistics.metrics.resolution'), + value: data.video.resolution, + }, + { + label: t('advancedSettings.statistics.metrics.codec'), + value: data.video.codec ?? '–', + }, + { + label: t('advancedSettings.statistics.metrics.frameRate'), + value: data.video.frameRate, + }, + { + label: t('advancedSettings.statistics.metrics.decodedFrameRate'), + value: data.video.decodedFrameRate, + }, + { + label: t('advancedSettings.statistics.metrics.bitrate'), + value: data.video.bitrateBps, + }, + { + label: t('advancedSettings.statistics.metrics.packetLoss'), + value: data.packetLossRatio, + }, + { + label: t('advancedSettings.statistics.metrics.freezeCount'), + value: data.video.freezeCount, + }, + { + label: t('advancedSettings.statistics.metrics.totalFreezesDuration'), + value: data.video.totalFreezesDuration, + }, + { + label: t('advancedSettings.statistics.metrics.packetsReceived'), + value: data.video.packetsReceived, + }, + { + label: t('advancedSettings.statistics.metrics.packetsLostReceived'), + value: data.video.packetsLost, + }, + { + label: t('advancedSettings.statistics.metrics.bytesReceived'), + value: data.video.bytesReceived, + }, + { + label: t('advancedSettings.statistics.metrics.estimatedBandwidth'), + value: data.connectionEstimatedBandwidthBps, + }, + { + label: t('advancedSettings.statistics.metrics.remotePublisherEstimatedBandwidth'), + value: data.remotePublisherConnectionEstimatedBandwidthBps, + }, + ], + }; + }, [data, t]); + + return ( + + ); +}; + +export default SubscriberStatistics; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/index.tsx new file mode 100644 index 00000000..86d768f9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsStatisticsTab } from './AdvancedSettingsStatisticsTab'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.spec.tsx new file mode 100644 index 00000000..2069b2d3 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.spec.tsx @@ -0,0 +1,54 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import type { ReactElement } from 'react'; +import { afterEach, describe, expect, it } from 'vitest'; +import type { advancedSettings } from '@Context/AdvancedSettings'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import AdvancedSettingsVideoTab from './AdvancedSettingsVideoTab'; + +type RenderOptions = { + dialogState?: Partial; +}; + +describe('AdvancedSettingsVideoTab', () => { + afterEach(() => { + advancedSettings$.reset(); + }); + + it('renders all video sections', () => { + render(); + + expect(screen.getByRole('heading', { name: /video/i })).toBeInTheDocument(); + expect(screen.getByLabelText(/bitrate/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/codec/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/frame rate/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/resolution/i)).toBeInTheDocument(); + }); + + it('renders codec priority drag and drop when codec mode is manual', () => { + render(, { + dialogState: { codecMode: 'manual', codecPriority: ['vp9', 'vp8', 'h264'] }, + }); + + expect(screen.getByText(/codec priority/i)).toBeInTheDocument(); + expect(screen.getByTestId('advanced-settings-codec-priority-item-vp9')).toBeInTheDocument(); + expect(screen.getByTestId('advanced-settings-codec-priority-item-vp8')).toBeInTheDocument(); + expect(screen.getByTestId('advanced-settings-codec-priority-item-h264')).toBeInTheDocument(); + }); + + it('renders custom video bitrate controls when bitrate mode is custom', () => { + render(, { dialogState: { bitrateMode: 'custom' } }); + + expect(screen.getByText(/custom bitrate/i)).toBeInTheDocument(); + expect(screen.getByTestId('advanced-settings-custom-video-bitrate-slider')).toBeInTheDocument(); + expect(screen.getAllByText(/5 kbps/i).length).toBeGreaterThan(0); + expect(screen.getByText(/^10 Mbps$/i)).toBeInTheDocument(); + }); +}); + +function render(ui: ReactElement, { dialogState }: RenderOptions = {}) { + if (dialogState) { + advancedSettings$.setState((state) => ({ ...state, ...dialogState })); + } + + return renderBase(ui); +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.tsx new file mode 100644 index 00000000..bbfab1dc --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.tsx @@ -0,0 +1,135 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import { env, RESOLUTIONS } from '../../../../env'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import SelectField from '@ui/SelectField'; +import { AdvancedSettingsCodecPriorityField } from '../AdvancedSettingsCodecPriorityField'; +import { AdvancedSettingsCustomVideoBitrateField } from '../AdvancedSettingsCustomVideoBitrateField'; +import type { + AdvancedSettingsFrameRate, + AdvancedSettingsResolution, + AdvancedSettingsSelectOption, +} from '../../types/types'; +import { ADVANCED_SETTINGS_BITRATE_MODE, ADVANCED_SETTINGS_CODEC_MODE } from '../../types/types'; +import useAdvancedSettingsVideoHandlers from './useAdvancedSettingsVideoHandlers'; + +const { setCodecMode, setCodecPriority } = advancedSettings$.actions; + +const AdvancedSettingsVideoTab = (): ReactElement => { + const { t } = useTranslation(); + const bitrateMode = advancedSettings$.use.select(({ bitrateMode }) => bitrateMode); + const codecMode = advancedSettings$.use.select(({ codecMode }) => codecMode); + const codecPriority = advancedSettings$.use.select(({ codecPriority }) => codecPriority); + const frameRate = advancedSettings$.use.select(({ frameRate }) => frameRate); + const resolution = advancedSettings$.use.select(({ resolution }) => resolution); + const customVideoBitrate = advancedSettings$.use.select( + ({ customVideoBitrate }) => customVideoBitrate + ); + + const { + handleFrameRateChange, + handleResolutionChange, + handleBitrateModeChange, + handleCustomVideoBitrateChange, + } = useAdvancedSettingsVideoHandlers({ bitrateMode, customVideoBitrate }); + + const bitrateOptions = [ + { + value: ADVANCED_SETTINGS_BITRATE_MODE.default, + label: t('advancedSettings.video.bitrate.options.default'), + }, + { + value: ADVANCED_SETTINGS_BITRATE_MODE.bwSaver, + label: t('advancedSettings.video.bitrate.options.bw_saver'), + }, + { + value: ADVANCED_SETTINGS_BITRATE_MODE.extraBwSaver, + label: t('advancedSettings.video.bitrate.options.extra_bw_saver'), + }, + { + value: ADVANCED_SETTINGS_BITRATE_MODE.custom, + label: t('advancedSettings.video.bitrate.options.custom'), + }, + ]; + + const codecOptions = [ + { + value: ADVANCED_SETTINGS_CODEC_MODE.automatic, + label: t('advancedSettings.video.codec.options.automatic'), + }, + { + value: ADVANCED_SETTINGS_CODEC_MODE.manual, + label: t('advancedSettings.video.codec.options.manual'), + }, + ]; + + const frameRateOptions: AdvancedSettingsSelectOption[] = ( + env.SUPPORTED_FRAME_RATES as AdvancedSettingsFrameRate[] + ).map((supportedFrameRate) => ({ + value: supportedFrameRate, + label: t(`advancedSettings.video.frameRate.options.${supportedFrameRate}`), + })); + + const resolutionOptions: AdvancedSettingsSelectOption[] = + RESOLUTIONS.map((supportedResolution) => ({ + value: supportedResolution, + label: supportedResolution, + })); + + return ( +
+

+ {t('advancedSettings.tabs.video')} +

+ +
+ + + {bitrateMode === ADVANCED_SETTINGS_BITRATE_MODE.custom && ( + + )} + + + + {codecMode === ADVANCED_SETTINGS_CODEC_MODE.manual && ( + + )} + + + + +
+
+ ); +}; + +export default AdvancedSettingsVideoTab; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/index.tsx new file mode 100644 index 00000000..5c01c3b9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsVideoTab } from './AdvancedSettingsVideoTab'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.spec.ts new file mode 100644 index 00000000..d06fdb14 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.spec.ts @@ -0,0 +1,283 @@ +import { act, renderHook, waitFor } from '@testing-library/react'; +import { afterEach, describe, expect, it, vi, beforeEach } from 'vitest'; +import type { Mock } from 'vitest'; +import type { Publisher } from '@vonage/client-sdk-video'; +import type { PublisherContextType } from '@Context/PublisherProvider'; +import type { PreviewPublisherContextType } from '@Context/PreviewPublisherProvider'; +import usePublisherContext from '@hooks/usePublisherContext'; +import usePreviewPublisherContext from '@hooks/usePreviewPublisherContext'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import { handleClientApplicationError } from '@ui/helpers'; +import useAdvancedSettingsVideoHandlers from './useAdvancedSettingsVideoHandlers'; + +vi.mock('@hooks/usePublisherContext'); +vi.mock('@hooks/usePreviewPublisherContext'); +vi.mock('@ui/helpers', () => ({ + handleClientApplicationError: vi.fn(), +})); + +const mockUsePublisherContext = usePublisherContext as Mock<[], PublisherContextType>; +const mockUsePreviewPublisherContext = usePreviewPublisherContext as Mock< + [], + PreviewPublisherContextType +>; +const mockHandleClientApplicationError = vi.mocked(handleClientApplicationError); + +const createMockPublisher = () => + ({ + getVideoSource: vi.fn().mockReturnValue({ track: {} }), + setPreferredFrameRate: vi.fn().mockResolvedValue(undefined), + setPreferredResolution: vi.fn().mockResolvedValue(undefined), + setMaxVideoBitrate: vi.fn().mockResolvedValue(undefined), + setVideoBitratePreset: vi.fn().mockResolvedValue(undefined), + }) as unknown as Publisher; + +describe('useAdvancedSettingsVideoHandlers', () => { + beforeEach(() => { + vi.restoreAllMocks(); + mockUsePublisherContext.mockReturnValue({ publisher: null } as PublisherContextType); + mockUsePreviewPublisherContext.mockReturnValue({ + publisher: null, + } as unknown as PreviewPublisherContextType); + }); + + afterEach(() => { + advancedSettings$.reset(); + }); + + describe('handleFrameRateChange', () => { + it('applies frame rate to publisher then updates store', async () => { + const publisher = createMockPublisher(); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleFrameRateChange(15); + }); + + await waitFor(() => { + expect(publisher.setPreferredFrameRate).toHaveBeenCalledWith(15); + expect(advancedSettings$.getState().frameRate).toBe(15); + }); + }); + + it('still updates store when no publisher is active', async () => { + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleFrameRateChange(7); + }); + + await waitFor(() => { + expect(advancedSettings$.getState().frameRate).toBe(7); + }); + }); + + it('does not update store when publisher call fails', async () => { + const publisher = createMockPublisher(); + (publisher.setPreferredFrameRate as Mock).mockRejectedValue(new Error('hardware error')); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const initialFrameRate = advancedSettings$.getState().frameRate; + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleFrameRateChange(15); + }); + + await waitFor(() => { + expect(publisher.setPreferredFrameRate).toHaveBeenCalledWith(15); + }); + + expect(advancedSettings$.getState().frameRate).toBe(initialFrameRate); + }); + + it('reports a notification after a failed frame rate update', async () => { + const publisher = createMockPublisher(); + (publisher.setPreferredFrameRate as Mock).mockRejectedValue(new Error('hardware error')); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleFrameRateChange(15); + }); + + await waitFor(() => { + expect(mockHandleClientApplicationError).toHaveBeenCalledTimes(1); + }); + }); + }); + + describe('handleResolutionChange', () => { + it('applies resolution to publisher then updates store', async () => { + const publisher = createMockPublisher(); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleResolutionChange('640x480'); + }); + + await waitFor(() => { + expect(publisher.setPreferredResolution).toHaveBeenCalledWith({ width: 640, height: 480 }); + expect(advancedSettings$.getState().resolution).toBe('640x480'); + }); + }); + + it('does not update store when resolution update fails', async () => { + const publisher = createMockPublisher(); + (publisher.setPreferredResolution as Mock).mockRejectedValue(new Error('unsupported')); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + const initialResolution = advancedSettings$.getState().resolution; + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleResolutionChange('640x480'); + }); + + await waitFor(() => { + expect(mockHandleClientApplicationError).toHaveBeenCalledTimes(1); + }); + + expect(advancedSettings$.getState().resolution).toBe(initialResolution); + }); + }); + + describe('handleBitrateModeChange', () => { + it('applies bitrate preset to publisher then updates store', async () => { + const publisher = createMockPublisher(); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleBitrateModeChange('bw_saver'); + }); + + await waitFor(() => { + expect(publisher.setVideoBitratePreset).toHaveBeenCalledWith('bw_saver'); + expect(advancedSettings$.getState().bitrateMode).toBe('bw_saver'); + }); + }); + + it('uses preview publisher when no meeting room publisher is active', async () => { + const previewPublisher = createMockPublisher(); + mockUsePreviewPublisherContext.mockReturnValue({ + publisher: previewPublisher, + } as unknown as PreviewPublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleBitrateModeChange('bw_saver'); + }); + + await waitFor(() => { + expect(previewPublisher.setVideoBitratePreset).toHaveBeenCalledWith('bw_saver'); + }); + }); + + it('does not update store when bitrate preset update fails', async () => { + const publisher = createMockPublisher(); + (publisher.setVideoBitratePreset as Mock).mockRejectedValue(new Error('unsupported')); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + const initialBitrateMode = advancedSettings$.getState().bitrateMode; + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleBitrateModeChange('bw_saver'); + }); + + await waitFor(() => { + expect(mockHandleClientApplicationError).toHaveBeenCalledTimes(1); + }); + + expect(advancedSettings$.getState().bitrateMode).toBe(initialBitrateMode); + }); + }); + + describe('handleCustomVideoBitrateChange', () => { + it('applies custom bitrate to publisher then updates store when mode is custom', async () => { + const publisher = createMockPublisher(); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'custom', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleCustomVideoBitrateChange(750_000); + }); + + await waitFor(() => { + expect(publisher.setMaxVideoBitrate).toHaveBeenCalledWith(750_000); + expect(advancedSettings$.getState().customVideoBitrate).toBe(750_000); + }); + }); + + it('updates store without calling the publisher when mode is not custom', async () => { + const publisher = createMockPublisher(); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleCustomVideoBitrateChange(750_000); + }); + + await waitFor(() => { + expect(advancedSettings$.getState().customVideoBitrate).toBe(750_000); + }); + + expect(publisher.setMaxVideoBitrate).not.toHaveBeenCalled(); + expect(publisher.setVideoBitratePreset).not.toHaveBeenCalled(); + }); + + it('does not update store when custom bitrate update fails', async () => { + const publisher = createMockPublisher(); + (publisher.setMaxVideoBitrate as Mock).mockRejectedValue(new Error('unsupported')); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + const initialCustomVideoBitrate = advancedSettings$.getState().customVideoBitrate; + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'custom', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleCustomVideoBitrateChange(750_000); + }); + + await waitFor(() => { + expect(mockHandleClientApplicationError).toHaveBeenCalledTimes(1); + }); + + expect(advancedSettings$.getState().customVideoBitrate).toBe(initialCustomVideoBitrate); + }); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.ts new file mode 100644 index 00000000..a5a966a3 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.ts @@ -0,0 +1,89 @@ +import usePublisherContext from '@hooks/usePublisherContext'; +import usePreviewPublisherContext from '@hooks/usePreviewPublisherContext'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import { makeApplicationErrorMapper } from '@core/errors'; +import { handleClientApplicationError } from '@ui/helpers'; +import { + applyFrameRate, + applyResolution, + applyBitrate, +} from '@Context/PublisherProvider/useApplyAdvancedSettings'; +import { t } from 'i18next'; +import type { + AdvancedSettingsBitrateMode, + AdvancedSettingsCustomVideoBitrate, + AdvancedSettingsFrameRate, + AdvancedSettingsResolution, +} from '../../types/types'; +import { ADVANCED_SETTINGS_BITRATE_MODE } from '../../types/types'; + +const { setBitrateMode, setCustomVideoBitrate, setFrameRate, setResolution } = + advancedSettings$.actions; + +type UseAdvancedSettingsVideoHandlersArgs = { + bitrateMode: AdvancedSettingsBitrateMode; + customVideoBitrate: AdvancedSettingsCustomVideoBitrate; +}; + +type UseAdvancedSettingsVideoHandlers = { + handleFrameRateChange: (value: AdvancedSettingsFrameRate) => Promise; + handleResolutionChange: (value: AdvancedSettingsResolution) => Promise; + handleBitrateModeChange: (value: AdvancedSettingsBitrateMode) => Promise; + handleCustomVideoBitrateChange: (value: AdvancedSettingsCustomVideoBitrate) => Promise; +}; + +const useAdvancedSettingsVideoHandlers = ({ + bitrateMode, + customVideoBitrate, +}: UseAdvancedSettingsVideoHandlersArgs): UseAdvancedSettingsVideoHandlers => { + const { publisher: meetingRoomPublisher } = usePublisherContext(); + const { publisher: previewPublisher } = usePreviewPublisherContext(); + const publisher = meetingRoomPublisher ?? previewPublisher ?? null; + + const handleFrameRateChange = async (value: AdvancedSettingsFrameRate) => { + try { + await applyFrameRate(publisher, value); + setFrameRate(value); + } catch (error) { + handleClientApplicationError(makeApplicationErrorMapper(t('errors.unknown'))(error)); + } + }; + + const handleResolutionChange = async (value: AdvancedSettingsResolution) => { + try { + await applyResolution(publisher, value); + setResolution(value); + } catch (error) { + handleClientApplicationError(makeApplicationErrorMapper(t('errors.unknown'))(error)); + } + }; + + const handleBitrateModeChange = async (value: AdvancedSettingsBitrateMode) => { + try { + await applyBitrate(publisher, value, customVideoBitrate); + setBitrateMode(value); + } catch (error) { + handleClientApplicationError(makeApplicationErrorMapper(t('errors.unknown'))(error)); + } + }; + + const handleCustomVideoBitrateChange = async (value: AdvancedSettingsCustomVideoBitrate) => { + try { + if (bitrateMode === ADVANCED_SETTINGS_BITRATE_MODE.custom) { + await applyBitrate(publisher, bitrateMode, value); + } + setCustomVideoBitrate(value); + } catch (error) { + handleClientApplicationError(makeApplicationErrorMapper(t('errors.unknown'))(error)); + } + }; + + return { + handleFrameRateChange, + handleResolutionChange, + handleBitrateModeChange, + handleCustomVideoBitrateChange, + }; +}; + +export default useAdvancedSettingsVideoHandlers; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/index.tsx new file mode 100644 index 00000000..c24c46ba --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsDialog } from './AdvancedSettingsDialog'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/types/types.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/types/types.ts new file mode 100644 index 00000000..4859d66b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/types/types.ts @@ -0,0 +1,49 @@ +import type { Resolution } from '../../../env'; + +export type AdvancedSettingsTab = 'general' | 'video' | 'audio' | 'statistics'; + +export type AdvancedSettingsBitrateMode = 'default' | 'bw_saver' | 'extra_bw_saver' | 'custom'; + +export const ADVANCED_SETTINGS_BITRATE_MODE = { + default: 'default', + bwSaver: 'bw_saver', + extraBwSaver: 'extra_bw_saver', + custom: 'custom', +} as const satisfies Record; + +export type AdvancedSettingsCustomVideoBitrate = number; + +export type AdvancedSettingsCodecMode = 'automatic' | 'manual'; + +export const ADVANCED_SETTINGS_CODEC_MODE = { + automatic: 'automatic' as AdvancedSettingsCodecMode, + manual: 'manual' as AdvancedSettingsCodecMode, +}; + +export type AdvancedSettingsVideoCodec = 'vp8' | 'vp9' | 'h264'; + +export type AdvancedSettingsManualCodecOrder = [ + AdvancedSettingsVideoCodec, + AdvancedSettingsVideoCodec, + AdvancedSettingsVideoCodec, +]; + +export type AdvancedSettingsFrameRate = NonNullable< + import('@vonage/client-sdk-video').GetUserMediaProperties['frameRate'] +>; + +export type AdvancedSettingsResolution = Resolution; + +export type AdvancedSettingsAudioBitrateMode = 'automatic' | 'custom'; + +export const ADVANCED_SETTINGS_AUDIO_BITRATE_MODE = { + automatic: 'automatic' as AdvancedSettingsAudioBitrateMode, + custom: 'custom' as AdvancedSettingsAudioBitrateMode, +}; + +export type AdvancedSettingsCustomAudioBitrate = number; + +export type AdvancedSettingsSelectOption = { + value: TValue; + label: string; +}; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AvatarInitials/AvatarInitials.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AvatarInitials/AvatarInitials.tsx index c5097e05..46240185 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AvatarInitials/AvatarInitials.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AvatarInitials/AvatarInitials.tsx @@ -9,6 +9,7 @@ export type InitialsProps = { sx?: SxProps; height?: number; width?: number; + 'data-testid'?: string; }; /** @@ -29,11 +30,14 @@ const AvatarInitials = ({ sx = {}, height = 80, width = 80, + 'data-testid': dataTestId, }: InitialsProps): ReactElement => { const diameter = Math.min(height, width) * 0.5; return ( diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.spec.tsx index 874f9ca1..4ce68f1d 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.spec.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.spec.tsx @@ -48,6 +48,7 @@ function render(ui: ReactElement) { providers.session, providers.publisher, providers.backgroundPublisher, + providers.runtime, ]); return { diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.tsx index d0c05602..870cfcaa 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.tsx @@ -1,6 +1,6 @@ import { ReactElement } from 'react'; +import classNames from 'classnames'; import Box from '@mui/material/Box'; -import useTheme from '@ui/theme'; import EffectOptionButtons from '../EffectOptionButtons/EffectOptionButtons'; import BackgroundGallery from '../BackgroundGallery/BackgroundGallery'; import { DEFAULT_SELECTABLE_OPTION_WIDTH } from '@utils/constants'; @@ -19,8 +19,6 @@ type BackgroundEffectOptionsProps = { * @returns {ReactElement} The background effect tabs component. */ const BackgroundEffectOptions = ({ mode }: BackgroundEffectOptionsProps): ReactElement => { - const theme = useTheme(); - return ( diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.spec.tsx index 3946aedb..e0585ac0 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.spec.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.spec.tsx @@ -182,6 +182,7 @@ function render(ui: ReactElement) { providers.publisher, providers.backgroundPublisher, providers.previewPublisher, + providers.runtime, ]); const wrapper = composeProviders(SuspenseBoundary, roomWrapper); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.tsx index b76aa716..75db6854 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.tsx @@ -3,7 +3,6 @@ import { useTranslation } from 'react-i18next'; import useMediaQuery from '@mui/material/useMediaQuery'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; -import useTheme from '@ui/theme'; import usePublisherContext from '../../../hooks/usePublisherContext'; import BackgroundVideoContainer from '../BackgroundVideoContainer'; import BackgroundEffectOptions from '../BackgroundEffectOptions/BackgroundEffectOptions'; @@ -35,7 +34,6 @@ const BackgroundEffectsLayout = ({ mode, }: BackgroundEffectsLayoutProps): ReactElement | false => { const { t } = useTranslation(); - const theme = useTheme(); const isShortScreen = useMediaQuery('(max-height:825px)'); const publisherContext = usePublisherContext(); @@ -80,7 +78,7 @@ const BackgroundEffectsLayout = ({ ); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx index 59355e23..b0adcb98 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx @@ -1,8 +1,8 @@ import { ReactElement } from 'react'; import { useTranslation } from 'react-i18next'; +import classNames from 'classnames'; import Box from '@mui/material/Box'; import Typography from '@mui/material/Typography'; -import useTheme from '@ui/theme'; /** * LandingPageWelcome Component @@ -11,7 +11,6 @@ import useTheme from '@ui/theme'; */ const LandingPageWelcome = (): ReactElement => { const { t } = useTranslation(); - const theme = useTheme(); const primaryWord = t('landing.primary.word'); const renderTitle = (titleKey: string) => { @@ -22,9 +21,10 @@ const LandingPageWelcome = (): ReactElement => { {text} @@ -42,10 +42,10 @@ const LandingPageWelcome = (): ReactElement => { }} > { ({ +vi.mock('@ui/VividIcon', () => ({ default: ({ name, customSize }: { name: string; customSize: number }) => (
{name} diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/LanguageSelector/LanguageSelector.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/LanguageSelector/LanguageSelector.tsx index 892697af..795ab99a 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/LanguageSelector/LanguageSelector.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/LanguageSelector/LanguageSelector.tsx @@ -5,10 +5,9 @@ import MenuItem from '@mui/material/MenuItem'; import FormControl from '@mui/material/FormControl'; import Select from '@mui/material/Select'; import type { SelectChangeEvent } from '@mui/material/Select'; -import useTheme from '@ui/theme'; import { LanguageOption, LanguageSelectorProps } from './LanguageSelector.types'; import useIsSmallViewport from '../../hooks/useIsSmallViewport'; -import VividIcon from '../VividIcon/VividIcon'; +import VividIcon from '@ui/VividIcon'; import { env } from '../../env'; const languageOptions: LanguageOption[] = [ @@ -20,13 +19,23 @@ const languageOptions: LanguageOption[] = [ { code: 'es-MX', name: 'Español (México)', flag: 'flag-mexico' }, ]; -const ChevronIcon = ({ color, ...props }: { color: string } & Record) => ( - +const ChevronIcon = ({ className, ...props }: { className?: string } & Record) => ( + + + ); const SelectIconComponent = - (themeColor: string) => - (props: Record): ReactElement => ; + (_iconClassName: string) => + (props: Record): ReactElement => ; /** * LanguageSelector Component @@ -38,7 +47,6 @@ const SelectIconComponent = */ const LanguageSelector = ({ showFlag = true }: LanguageSelectorProps): ReactElement => { const { i18n } = useTranslation(); - const theme = useTheme(); const isSmallViewport = useIsSmallViewport(); const supportedLanguages = languageOptions.filter((option) => @@ -57,19 +65,9 @@ const LanguageSelector = ({ showFlag = true }: LanguageSelectorProps): ReactElem + ) { + transform$(actionKey, transform); + return middleware as VideoHandler; + }, + + /** + * Use this callback to completely override the handler of a specific action. + */ + override$< + ActionKey extends PublicActionKey, + Input = InputOf, + Output = Awaited>, + >( + actionKey: ActionKey, + handler: (opts: ProcedureResolverOptions) => Output | Promise + ) { + override$(actionKey, handler); + return middleware as VideoHandler; + }, + + use$, + + onSettled$, + + makeVideoClient$: (...args: Parameters) => { + return makeVideoClient$(...args); + }, + + router$, + }; + + return Object.assign(middleware, extensions); +} + +export default createVideoHandler; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoHandler/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoHandler/index.ts new file mode 100644 index 00000000..15cb1436 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoHandler/index.ts @@ -0,0 +1 @@ +export { default } from './createVideoHandler'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/createVideoRouter.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/createVideoRouter.test.ts new file mode 100644 index 00000000..92bead6b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/createVideoRouter.test.ts @@ -0,0 +1,718 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import express from 'express'; +import request from 'supertest'; +import { MediaMode, type SingleArchiveResponse, ArchiveMode } from '@vonage/video'; +import jwt from 'jsonwebtoken'; +import createVideoHandler from '../videoHandler/createVideoHandler'; +import { TokenRole } from '@api-lib/types'; + +const mockApiKey = 'test-api-key'; +const mockSessionId = '1_MX4xMjM0NTY3OH4-VGh1IEZlYiAyNyAwODozMjozNCBQU1QgMjAyMH4wLjI0NDYxMjE'; +const mockSessionKey = jwt.sign({ sessionId: mockSessionId }, mockApiKey, { algorithm: 'HS256' }); + +const h = vi.hoisted(() => ({ + createSessionSpy: vi.fn(), + startArchiveSpy: vi.fn(), + stopArchiveSpy: vi.fn(), + searchArchivesSpy: vi.fn(), + enableCaptionsSpy: vi.fn(), + disableCaptionsSpy: vi.fn(), + generateClientTokenSpy: vi.fn(() => 'mock-token-12345'), +})); + +vi.mock('@vonage/video', async () => { + const mockVideoModule = (await import('@node-test/helpers/mockVideoModule')).default; + const actual = await vi.importActual('@vonage/video'); + + return mockVideoModule(actual, () => ({ + Video: ({ spyOn }) => { + spyOn({ + createSession: h.createSessionSpy, + startArchive: h.startArchiveSpy, + stopArchive: h.stopArchiveSpy, + searchArchives: h.searchArchivesSpy, + enableCaptions: h.enableCaptionsSpy, + disableCaptions: h.disableCaptionsSpy, + generateClientToken: h.generateClientTokenSpy, + }); + }, + })); +}); + +beforeEach(() => { + h.createSessionSpy.mockReset(); + h.startArchiveSpy.mockReset(); + h.stopArchiveSpy.mockReset(); + h.searchArchivesSpy.mockReset(); + h.enableCaptionsSpy.mockReset(); + h.disableCaptionsSpy.mockReset(); + h.generateClientTokenSpy.mockReset(); + h.generateClientTokenSpy.mockReturnValue('mock-token-12345'); +}); + +describe('createVideoHandler', () => { + describe('createSession', () => { + it('should create a session successfully', async () => { + h.createSessionSpy.mockResolvedValue({ + sessionId: mockSessionId, + location: 'US', + mediaMode: MediaMode.ROUTED, + archiveMode: 'manual', + }); + + const app = createTestApp(); + + const response = await request(app).post('/video/createSession').send({}).expect(200); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + sessionId: mockSessionId, + }); + + expect(h.createSessionSpy).toHaveBeenCalledWith(undefined); + }); + + it('should create a session and join it successfully', async () => { + h.createSessionSpy.mockResolvedValue({ + sessionId: mockSessionId, + location: 'US', + mediaMode: MediaMode.ROUTED, + archiveMode: 'manual', + }); + + const app = createTestApp(); + + await request(app).post('/video/createSession').send({}).expect(200); + + const joinResponse = await request(app) + .post('/video/joinSession') + .send({ sessionKey: mockSessionKey }) + .expect(200); + + const joinData = extractResponseData(joinResponse.body); + + expect(joinData).toMatchObject({ + location: expect.any(String), + token: expect.any(String), + }); + }); + + it('should create a session with custom options', async () => { + h.createSessionSpy.mockResolvedValue({ + sessionId: mockSessionId, + location: '12.34.56.78', + mediaMode: MediaMode.ROUTED, + archiveMode: 'manual', + }); + + const app = createTestApp(); + + const customOptions = { + location: '12.34.56.78', + archiveMode: 'manual' as const, + }; + + await request(app) + .post('/video/createSession') + .send({ sessionOptions: customOptions }) + .expect(200); + + expect(h.createSessionSpy).toHaveBeenCalledWith(customOptions); + }); + + it('should return an error response when creating a session fails', async () => { + h.createSessionSpy.mockRejectedValue(new Error('Failed to create session on Vonage side')); + + const app = createTestApp(); + + const response = await request(app).post('/video/createSession').send({}); + + expect(response.status).toBeGreaterThanOrEqual(400); + }); + }); + + describe('decodeSessionId', () => { + it('should decode a valid sessionId via VideoClient method (not a TRPC route)', async () => { + const app = createTestApp(); + + const input = encodeURIComponent(JSON.stringify({ sessionId: mockSessionId })); + + // decodeSessionId is not exposed as a TRPC route + const response = await request(app).get(`/video/decodeSessionId?input=${input}`); + expect(response.status).toBeGreaterThanOrEqual(400); + }); + + it('should return an error response for invalid sessionId', async () => { + const app = createTestApp(); + + const input = encodeURIComponent(JSON.stringify({ sessionId: 'invalid-session-id' })); + + const response = await request(app).get(`/video/decodeSessionId?input=${input}`); + + expect(response.status).toBeGreaterThanOrEqual(400); + }); + }); + + describe('joinSession', () => { + it('should join a session and return token', async () => { + const app = createTestApp(); + + const response = await request(app) + .post('/video/joinSession') + .send({ sessionKey: mockSessionKey }) + .expect(200); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + location: expect.any(String), + token: expect.any(String), + }); + }); + + it('should join session with custom client token options', async () => { + const app = createTestApp(); + + const clientTokenOptions = { + role: TokenRole.PUBLISHER, + data: 'custom-data', + }; + + const response = await request(app) + .post('/video/joinSession') + .send({ + sessionKey: mockSessionKey, + clientTokenOptions, + }) + .expect(200); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + token: expect.any(String), + }); + }); + }); + + describe('startArchive', () => { + it('should start an archive successfully', async () => { + const mockArchive: SingleArchiveResponse = { + id: 'archive-id-123', + sessionId: mockSessionId, + name: 'test-archive', + status: 'started', + createdAt: Date.now(), + size: 0, + duration: 0, + hasAudio: true, + hasVideo: true, + outputMode: 'composed', + resolution: '640x480', + } as SingleArchiveResponse; + + h.startArchiveSpy.mockResolvedValue(mockArchive); + + const app = createTestApp(); + + const response = await request(app) + .post('/video/startArchive') + .send({ + sessionKey: mockSessionKey, + archiveOptions: { name: 'test-archive' }, + }) + .expect(200); + + expect(h.startArchiveSpy).toHaveBeenCalledWith(mockSessionId, { + name: 'test-archive', + }); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + id: 'archive-id-123', + sessionId: mockSessionId, + name: 'test-archive', + }); + }); + + it('should return an error response when starting archive fails', async () => { + h.startArchiveSpy.mockRejectedValue(new Error('Failed to start archive')); + + const app = createTestApp(); + + const response = await request(app).post('/video/startArchive').send({ + sessionKey: mockSessionKey, + archiveOptions: {}, + }); + + expect(response.status).toBeGreaterThanOrEqual(400); + }); + }); + + describe('stopArchive', () => { + it('should stop an archive successfully', async () => { + const mockArchive: SingleArchiveResponse = { + id: 'archive-id-123', + sessionId: mockSessionId, + status: 'stopped', + } as SingleArchiveResponse; + + h.stopArchiveSpy.mockResolvedValue(mockArchive); + + const app = createTestApp(); + + const response = await request(app) + .post('/video/stopArchive') + .send({ + sessionKey: mockSessionKey, + archiveId: 'archive-id-123', + }) + .expect(200); + + expect(h.stopArchiveSpy).toHaveBeenCalledWith('archive-id-123'); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + id: 'archive-id-123', + status: 'stopped', + }); + }); + + it('should return an error response when stopping archive fails', async () => { + h.stopArchiveSpy.mockRejectedValue(new Error('Failed to stop archive')); + + const app = createTestApp(); + + const response = await request(app).post('/video/stopArchive').send({ + sessionKey: mockSessionKey, + archiveId: 'archive-id-123', + }); + + expect(response.status).toBeGreaterThanOrEqual(400); + }); + }); + + describe('searchArchives', () => { + it('should search archives successfully', async () => { + const mockArchives = { + items: [ + { + id: 'archive-1', + sessionId: mockSessionId, + name: 'archive-1', + createdAt: Date.now(), + duration: 100, + hasAudio: true, + hasVideo: true, + outputMode: 'composed' as const, + resolution: '640x480', + status: 'available' as const, + size: 12345, + }, + { + id: 'archive-2', + sessionId: mockSessionId, + name: 'archive-2', + createdAt: Date.now(), + duration: 200, + hasAudio: true, + hasVideo: true, + outputMode: 'composed' as const, + resolution: '640x480', + status: 'available' as const, + size: 23456, + }, + ], + count: 2, + }; + + h.searchArchivesSpy.mockResolvedValue(mockArchives); + + const app = createTestApp(); + + const response = await request(app) + .post('/video/searchArchives') + .send({ sessionKey: mockSessionKey }) + .expect(200); + + expect(h.searchArchivesSpy).toHaveBeenCalledWith({ + sessionId: mockSessionId, + }); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + items: expect.arrayContaining([ + expect.objectContaining({ id: 'archive-1' }), + expect.objectContaining({ id: 'archive-2' }), + ]), + count: 2, + }); + }); + + it('should return an error response when searching archives fails', async () => { + h.searchArchivesSpy.mockRejectedValue(new Error('Failed to search archives')); + + const app = createTestApp(); + + const response = await request(app) + .post('/video/searchArchives') + .send({ sessionKey: mockSessionKey }); + + expect(response.status).toBeGreaterThanOrEqual(400); + }); + }); + + describe('enableCaptions', () => { + it('should enable captions successfully', async () => { + h.enableCaptionsSpy.mockResolvedValue({ + captionsId: 'caption-id-123', + }); + + const app = createTestApp(); + + await request(app) + .post('/video/enableCaptions') + .send({ sessionKey: mockSessionKey }) + .expect(200); + + expect(h.enableCaptionsSpy).toHaveBeenCalledWith( + mockSessionId, + expect.any(String), + undefined + ); + }); + + it('should enable captions with custom options', async () => { + h.enableCaptionsSpy.mockResolvedValue({ + captionsId: 'caption-id-456', + }); + + const app = createTestApp(); + + const captionOptions = { + languageCode: 'en-US', + maxDuration: 300, + partialCaptions: 'false' as const, + statusCallbackUrl: 'https://example.com/callback', + }; + + await request(app) + .post('/video/enableCaptions') + .send({ + sessionKey: mockSessionKey, + captionOptions, + }) + .expect(200); + + expect(h.enableCaptionsSpy).toHaveBeenCalledWith( + mockSessionId, + expect.any(String), + captionOptions + ); + }); + + it('should return an error response when enabling captions fails', async () => { + h.enableCaptionsSpy.mockRejectedValue(new Error('Failed to enable captions')); + + const app = createTestApp(); + + const response = await request(app) + .post('/video/enableCaptions') + .send({ sessionKey: mockSessionKey }); + + expect(response.status).toBeGreaterThanOrEqual(400); + }); + }); + + describe('ensureCaptionsEnabled', () => { + it('should ensure captions are enabled, treat idempotent failures as success, and fail when session does not exist', async () => { + expect.assertions(6); + + const app = createTestApp(); + const requestEnsureCaptionsEnabled = () => { + return request(app) + .post('/video/ensureCaptionsEnabled') + .send({ sessionKey: mockSessionKey }); + }; + + h.enableCaptionsSpy + .mockResolvedValueOnce({ captionsId: 'caption-id-789' }) + .mockRejectedValueOnce(new Error('Live captions have already started for this session')) + .mockRejectedValueOnce(new Error('Session does not exist')); + + const successfulResponse = await requestEnsureCaptionsEnabled().expect(200); + const alreadyStartedResponse = await requestEnsureCaptionsEnabled().expect(200); + const missingSessionResponse = await requestEnsureCaptionsEnabled(); + + expect(missingSessionResponse.status).toBeGreaterThanOrEqual(400); + expect(missingSessionResponse.body.error).toBeDefined(); + expect(h.enableCaptionsSpy).toHaveBeenCalledTimes(3); + expect(h.enableCaptionsSpy).toHaveBeenCalledWith( + mockSessionId, + expect.any(String), + undefined + ); + + const successfulData = extractResponseData<{ captionsId: string | null }>( + successfulResponse.body + ); + + const alreadyStartedData = extractResponseData<{ captionsId: string | null }>( + alreadyStartedResponse.body + ); + + expect(successfulData).toMatchObject({ captionsId: 'caption-id-789' }); + expect(alreadyStartedData).toMatchObject({ captionsId: null }); + }); + }); + + describe('disableCaptions', () => { + it('should disable captions successfully', async () => { + h.disableCaptionsSpy.mockResolvedValue(undefined); + + const app = createTestApp(); + + await request(app) + .post('/video/disableCaptions') + .send({ + sessionKey: mockSessionKey, + captionsId: 'caption-id-123', + }) + .expect(200); + + expect(h.disableCaptionsSpy).toHaveBeenCalledWith('caption-id-123'); + }); + + it('should return an error response when disabling captions fails', async () => { + h.disableCaptionsSpy.mockRejectedValue(new Error('Failed to disable captions')); + + const app = createTestApp(); + + const response = await request(app).post('/video/disableCaptions').send({ + sessionKey: mockSessionKey, + captionsId: 'caption-id-123', + }); + + expect(response.status).toBeGreaterThanOrEqual(400); + }); + }); + + describe('error handling', () => { + it('should format errors in the response body', async () => { + h.createSessionSpy.mockRejectedValue(new Error('Vonage API error: Unauthorized')); + + const app = createTestApp(); + + const response = await request(app).post('/video/createSession').send({}); + + expect(response.status).toBeGreaterThanOrEqual(400); + expect(response.body.error).toBeDefined(); + }); + }); + + describe('onSettled$', () => { + it('should execute global onSettled after createSession success', async () => { + h.createSessionSpy.mockResolvedValue({ + sessionId: mockSessionId, + location: 'US', + mediaMode: MediaMode.ROUTED, + archiveMode: 'manual', + }); + + const onSettledSpy = vi.fn(); + const app = createTestApp((videoHandler) => { + videoHandler.onSettled$(onSettledSpy); + }); + + await request(app).post('/video/createSession').send({}).expect(200); + + expect(onSettledSpy).toHaveBeenCalledTimes(1); + expect(onSettledSpy).toHaveBeenCalledWith( + expect.objectContaining({ + videoAction: 'createSession', + error: null, + result: expect.objectContaining({ sessionId: mockSessionId }), + }) + ); + }); + + it('should execute action onSettled when createSession fails', async () => { + h.createSessionSpy.mockRejectedValue(new Error('Failed to create session in onSettled test')); + + const onSettledSpy = vi.fn(); + const app = createTestApp((videoHandler) => { + videoHandler.onSettled$('createSession', onSettledSpy); + }); + + const response = await request(app).post('/video/createSession').send({}); + + expect(response.status).toBeGreaterThanOrEqual(400); + expect(onSettledSpy).toHaveBeenCalledTimes(1); + expect(onSettledSpy).toHaveBeenCalledWith( + expect.objectContaining({ + videoAction: 'createSession', + result: null, + error: expect.any(Error), + }) + ); + + const settledCall = onSettledSpy.mock.calls[0]?.[0] as { error: Error }; + expect(settledCall.error.message).toContain('Failed to create session'); + }); + }); + + describe('use$', () => { + it('should allow middleware to transform createSession input', async () => { + h.createSessionSpy.mockResolvedValue({ + sessionId: mockSessionId, + location: 'US', + mediaMode: MediaMode.ROUTED, + archiveMode: 'manual', + }); + + const app = createTestApp((videoHandler) => { + videoHandler.use$('createSession', ({ input, next }) => { + const baseInput = (input ?? {}) as Record; + + return next({ + input: { + ...baseInput, + sessionOptions: { + location: '12.34.56.78', + archiveMode: ArchiveMode.MANUAL, + }, + }, + }); + }); + }); + + await request(app).post('/video/createSession').send({}).expect(200); + + expect(h.createSessionSpy).toHaveBeenCalledWith({ + location: '12.34.56.78', + archiveMode: 'manual', + }); + }); + + it('should fail when middleware does not return next()', async () => { + h.createSessionSpy.mockResolvedValue({ + sessionId: mockSessionId, + location: 'US', + mediaMode: MediaMode.ROUTED, + archiveMode: 'manual', + }); + + const app = createTestApp((videoHandler) => { + videoHandler.use$('createSession', () => { + return {} as never; + }); + }); + + const response = await request(app).post('/video/createSession').send({}); + + expect(response.status).toBeGreaterThanOrEqual(400); + }); + }); + + describe('TRPC client compatibility', () => { + it('should accept mutations with TRPC json-wrapped body', async () => { + const app = createTestApp(); + + const response = await request(app) + .post('/video/joinSession') + .send({ json: { sessionKey: mockSessionKey } }) + .expect(200); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + location: expect.any(String), + token: expect.any(String), + }); + }); + + it('should accept mutations with raw body', async () => { + const app = createTestApp(); + + const response = await request(app) + .post('/video/joinSession') + .send({ sessionKey: mockSessionKey }) + .expect(200); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + location: expect.any(String), + token: expect.any(String), + }); + }); + + it('should accept mutations with TRPC json-wrapped body for searchArchives', async () => { + h.searchArchivesSpy.mockResolvedValue({ items: [], count: 0 }); + + const app = createTestApp(); + + const response = await request(app) + .post('/video/searchArchives') + .send({ json: { sessionKey: mockSessionKey } }) + .expect(200); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + items: expect.any(Array), + count: 0, + }); + }); + + it('should accept mutations with raw body for searchArchives', async () => { + h.searchArchivesSpy.mockResolvedValue({ items: [], count: 0 }); + + const app = createTestApp(); + + const response = await request(app) + .post('/video/searchArchives') + .send({ sessionKey: mockSessionKey }) + .expect(200); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + items: expect.any(Array), + count: 0, + }); + }); + }); +}); + +function createTestApp( + setupHandler?: (videoHandler: ReturnType) => void +) { + const app = express(); + + const handler = createVideoHandler({ + auth: { + authType: 'apiKey', + apiKey: mockApiKey, + apiSecret: 'test-api-secret', + }, + }); + + if (setupHandler) { + setupHandler(handler); + } + + app.use('/video', handler); + + return app; +} + +/** + * Extracts the response data from the TRPC JSON response body. + */ +function extractResponseData(body: unknown): T { + return (body as { result: { data: T } }).result.data; +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/createVideoRouter.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/createVideoRouter.ts new file mode 100644 index 00000000..d90c63fb --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/createVideoRouter.ts @@ -0,0 +1,670 @@ +import { initTRPC, TRPCBuilder, type AnyMutationProcedure } from '@trpc/server'; +import { + assertVideoRouterConfig, + CreateSessionAndJoinPayloadSchema, + JoinSessionPayloadSchema, + type VideoRouterConfig, +} from '@api-lib/schemas'; +import { VideoClient } from '@api-lib/core'; +import type { HandlerConfig, HandlersConfig, HandlersDefaults } from '@api-lib/types'; +import { VideoAction } from '@api-lib/types'; +import { Any, Prettify } from '@common/types'; +import { makeBadRequestErrorHandler, makeInternalErrorHandler } from '@api-lib/errors'; +import { toTRPCError } from '@api-lib/errors/helpers'; +import { schemasByAction } from '@api-lib/constants'; +import { assertResult, tryCatch } from '@common/execution'; +import { isFunction } from '@common/assertions'; + +export const OKAY = Symbol('OKAY'); + +const OKAY_RESULT = { [OKAY]: true } as NextResult; + +function createVideoRouter< + TContext extends Record, + TMeta extends object, + Context extends { + videoClient: VideoClient; + } = Prettify< + TContext & { + videoClient: VideoClient; + } + >, +>(routerConfig: VideoRouterConfig) { + assertVideoRouterConfig(routerConfig); + + const { auth, videoParams, routerOptions, handlersConfig } = routerConfig; + + const handlersDefaults: HandlersDefaults = Object.fromEntries( + Object.entries(handlersConfig ?? {}).map(([action, config]) => [action, config?.addDefaults]) + ); + + const trpcRoot = (initTRPC as unknown as TRPCBuilder).create({ + errorFormatter: ({ error: unsafeError }) => { + const error = makeInternalErrorHandler('An internal error occurred')( + unsafeError.cause ?? unsafeError + ); + + return toTRPCError(error); + }, + ...routerOptions, + }); + + // prettify is necessary to hide the internal TRPC types and prevent d.ts errors. + type TRPCRouter = Prettify; + + type Middleware = Parameters[0]; + + /** + * These maps are used to store the custom logic added by the transform$, override$ and use$ callbacks. + * The keys are the action names and the values are the corresponding callbacks. + * When a request is made, we check if there's a custom callback for the action and execute it if it exists. + */ + const transforms = new Map unknown>(); + const overrides = new Map< + PublicActionKey, + (opts: ProcedureResolverOptions) => Any + >(); + + const middlewaresPerAction = new Map< + PublicActionKey | null, + ((opts: CustomMiddlewareParameters) => NextResult | Promise)[] + >(); + + const settledPerAction = new Map< + PublicActionKey | null, + ((opts: OnSettledParameters) => void | Promise)[] + >(); + + const tryAssertInput = ( + actionKey: ActionKey, + input: unknown + ) => { + return assertResult( + () => schemasByAction[actionKey].parse(input), + makeBadRequestErrorHandler(`Invalid input for action ${actionKey}`) + ); + }; + + const setupPipeline: Middleware = async (opts) => { + const { ctx, next } = opts; + + if (!ctx.videoClient) ctx.videoClient = makeVideoClient$(); + + const actionKey = extractProcedureKey(opts.path); + const globalMiddlewares = middlewaresPerAction.get(null) ?? []; + const actionMiddlewares = middlewaresPerAction.get(actionKey) ?? []; + const middlewares = [...globalMiddlewares, ...actionMiddlewares]; + + if (!middlewares.length) return next(); + + try { + const rawInput = await opts.getRawInput(); + const unwrappedInput = unwrapTrpcInput(rawInput); + + const args = Object.assign(opts, { + input: unwrappedInput, + assertInput: (input: unknown) => tryAssertInput(actionKey, input), + next: innerNextFn, + videoAction: actionKey, + videoClient: ctx.videoClient, + }) as CustomMiddlewareParameters; + + function innerNextFn(opts$?: InnerNextParameters): NextResult { + if (!opts$) return OKAY_RESULT; + + if (opts$.ctx) { + args.ctx = { + ...args.ctx, + ...opts$.ctx, + }; + } + + if (Object.hasOwn(opts$, 'input')) { + args.input = opts$.input; + } + + return OKAY_RESULT; + } + + for (const middleware of middlewares) { + const result = await middleware(args); + + if (!result[OKAY]) { + throw makeInternalErrorHandler( + `Middleware for action ${actionKey} did not return next()` + )(null); + } + } + + return next({ + getRawInput: () => Promise.resolve(args.input), + }); + } catch (error) { + throw makeInternalErrorHandler(`Failed to initialize pipeline for action ${actionKey}`)( + error + ); + } + }; + + // We used callbacks to easily track the videoClient methods and their types + const router = trpcRoot.router({ + createSession: makeMutation({ + key: VideoAction.createSession, + config: handlersConfig?.createSession, + callback: (videoClient, input) => { + return videoClient.createSession(input); + }, + }), + + startArchive: makeMutation({ + key: VideoAction.startArchive, + config: handlersConfig?.startArchive, + callback: (videoClient, input) => { + return videoClient.startArchive(input); + }, + }), + + stopArchive: makeMutation({ + key: VideoAction.stopArchive, + config: handlersConfig?.stopArchive, + callback: (videoClient, input) => { + return videoClient.stopArchive(input); + }, + }), + + searchArchives: makeMutation({ + key: VideoAction.searchArchives, + config: handlersConfig?.searchArchives, + callback: (videoClient, input) => { + return videoClient.searchArchives(input); + }, + }), + + enableCaptions: makeMutation({ + key: VideoAction.enableCaptions, + config: handlersConfig?.enableCaptions, + callback: (videoClient, input) => { + return videoClient.enableCaptions(input); + }, + }), + + ensureCaptionsEnabled: makeMutation({ + key: VideoAction.ensureCaptionsEnabled, + config: handlersConfig?.enableCaptions, + callback: (videoClient, input) => { + return videoClient.ensureCaptionsEnabled(input); + }, + }), + + disableCaptions: makeMutation({ + key: VideoAction.disableCaptions, + config: handlersConfig?.disableCaptions, + callback: (videoClient, input) => { + return videoClient.disableCaptions(input); + }, + }), + + joinSession: makeMutation({ + key: VideoAction.joinSession, + config: { + transformInput: (opts) => { + // potentially allow extra properties as long as the basic schema is valid + const { + clientTokenOptions: { + // remove sensitive options from the input + role: _role, + expireTime: _expireTime, + + ...clientTokenOptions + } = {}, + ...rest + } = JoinSessionPayloadSchema.loose().parse(opts.input); + + const input = { + ...rest, + clientTokenOptions, + }; + + return handlersConfig?.joinSession?.transformInput?.({ ...opts, input }) ?? input; + }, + defaults: handlersConfig?.joinSession?.addDefaults, + }, + callback: (videoClient, input) => { + return videoClient.joinSession(input); + }, + }), + + createSessionAndJoin: makeMutation({ + key: VideoAction.createSessionAndJoin, + config: { + transformInput: (opts) => { + // potentially allow extra properties as long as the basic schema is valid + const { + clientTokenOptions: { + // remove sensitive options from the input + role: _role, + expireTime: _expireTime, + + ...clientTokenOptions + } = {}, + ...rest + } = CreateSessionAndJoinPayloadSchema.loose().optional().parse(opts.input) ?? {}; + + const input = { + ...rest, + clientTokenOptions, + }; + + return ( + handlersConfig?.createSessionAndJoin?.transformInput?.({ ...opts, input }) ?? input + ); + }, + + /** + * Combines the defaults of createSession and joinSession handlers + */ + addDefaults: (() => { + if (handlersConfig?.createSessionAndJoin?.addDefaults) { + return handlersConfig.createSessionAndJoin.addDefaults; + } + + if (!handlersConfig?.createSession && !handlersConfig?.joinSession) { + return undefined; + } + + const createSessionDefaults = ( + isFunction(handlersConfig?.createSession?.addDefaults) + ? handlersConfig.createSession.addDefaults + : (payload: unknown) => payload + ) as (payload: unknown) => Record; + + const joinSessionDefaults = ( + isFunction(handlersConfig?.joinSession?.addDefaults) + ? handlersConfig.joinSession.addDefaults + : (payload: unknown) => payload + ) as (payload: unknown) => Record; + + return (input) => ({ + ...input, + ...(createSessionDefaults(input) ?? {}), + ...(joinSessionDefaults(input) ?? {}), + }); + })() as HandlersConfig['createSessionAndJoin']['addDefaults'], + }, + callback: async (videoClient, input) => { + return videoClient.createSessionAndJoin(input); + }, + }), + }) satisfies IVideoRouterContract; + + function unwrapTrpcInput(rawInput: unknown): unknown { + if ( + rawInput && + typeof rawInput === 'object' && + 'json' in rawInput && + Object.keys(rawInput).length === 1 + ) { + return (rawInput as { json: unknown }).json; + } + + return rawInput; + } + + function makeInput< + ActionKey extends PublicActionKey, + Config extends HandlerConfig, Parameters[0]>, + >(videoAction: ActionKey, config: Config | undefined) { + type Input = Parameters[0]; + + // input validation is performed by video videoClient handlers + // trpc requires an input schema to parse the request body, so we provide dummy parser with the correct type + const parser = (input: unknown): Input => { + if (!config?.transformInput) return input as Input; + + return config.transformInput({ + input, + assertInput: (val: unknown) => tryAssertInput(videoAction, val), + }) as Input; + }; + + const input = trpcRoot.procedure.use(setupPipeline).input(async (rawInput) => { + try { + const unwrappedInput = unwrapTrpcInput(rawInput); + const transform = transforms.get(videoAction); + if (transform) return parser(await transform(unwrappedInput)); + + return parser(unwrappedInput); + } catch (error) { + throw makeInternalErrorHandler(`Failed to parse input for action ${videoAction}`)(error); + } + }); + + return { input, parser }; + } + + function makeMutation< + ActionKey extends PublicActionKey, + Action extends ( + videoClient: VideoClient, + input: Parameters[0] + ) => ReturnType, + Config extends HandlerConfig, Parameters[0]>, + >({ key, callback, config }: { key: ActionKey; callback: Action; config: Config | undefined }) { + const { input, parser } = makeInput(key, config); + + return input.mutation(async (opts) => { + const handleSettledError = makeInternalErrorHandler((error) => ({ + fallbackMessage: `Failed to execute onSettled$ for action ${key}`, + issues: [ + !error + ? 'The action executed successfully, but the onSettled$ callback threw an error.' + : 'The action threw an error, and the onSettled$ callback also threw.', + ], + })); + + const executeOnSettledAndResolve = async ({ + result, + error, + didFail, + }: { + result: unknown; + error: unknown; + didFail: boolean; + }): Promise> => { + const globalSettled = settledPerAction.get(null) ?? []; + const actionSettled = settledPerAction.get(key) ?? []; + + // onSettled$ callbacks execute here — after the action, before responding to the client. + // Runs even if the action threw an error. If a callback throws, it is wrapped and re-thrown, + // preventing the response from being sent. + for (const settled of [...globalSettled, ...actionSettled]) { + await Promise.resolve( + settled({ + result, + error, + ctx: opts.ctx as Context, + videoAction: key as unknown as VideoAction, + input, + }) + ).catch((settledError: unknown) => { + throw handleSettledError(settledError); + }); + } + + if (didFail) throw error; + + return result as ReturnType; + }; + + try { + const override = overrides.get(key); + + if (override) { + const args = Object.assign(opts, { + assertInput: (input: unknown) => tryAssertInput(key, input), + videoClient: opts.ctx.videoClient, + }) as ProcedureResolverOptions; + + const { result, error, didFail } = await tryCatch( + () => override(args) as ReturnType + ); + + return executeOnSettledAndResolve({ result, error, didFail }); + } + + const input = parser(opts.input) as Parameters[0]; + + const onSettleArgs = await tryCatch(() => callback(opts.ctx.videoClient, input)); + + const result = await executeOnSettledAndResolve(onSettleArgs); + + return result as ReturnType; + } catch (error) { + throw makeInternalErrorHandler(`Failed to execute mutation ${key}`)(error); + } + }); + } + + function extractProcedureKey(path: string): PublicActionKey { + const i = path.lastIndexOf('.'); + return (i === -1 ? path : path.slice(i + 1)) as PublicActionKey; + } + + function makeVideoClient$() { + return new VideoClient({ + auth, + videoParams, + handlersDefaults, + }); + } + + /** + * Use this callback to run custom code before the original handlers, for example to implement custom authorization logic. + * + * @example Middleware for all actions + * ```ts + * videoHandler.use$(async ({ videoAction, ctx, input, next }) => { + * ... + * }); + * ``` + */ + function use$( + this: typeof extensions, + middleware: (opts: CustomMiddlewareParameters) => NextResult | Promise + ): typeof extensions; + + /** + * Use this callback to run custom code before the original handlers, for example to implement custom authorization logic. + * + * @example Middleware for a specific action + * ```ts + * videoHandler.use$('joinSession', async ({ ctx, input, next }) => { + * ... + * }); + * ``` + */ + function use$>( + this: typeof extensions, + actionKey: ActionKey, + handler: (opts: CustomMiddlewareParameters) => NextResult | Promise + ): typeof extensions; + + function use$( + this: typeof extensions, + arg1: + | ActionKey + | ((opts: CustomMiddlewareParameters) => NextResult | Promise), + arg2?: (opts: CustomMiddlewareParameters) => NextResult | Promise + ) { + const actionKey = arg2 ? (arg1 as ActionKey) : null; + const handler = (arg2 ?? arg1) as ( + opts: CustomMiddlewareParameters + ) => NextResult | Promise; + + let middlewares = middlewaresPerAction.get(actionKey); + if (!middlewares) middlewaresPerAction.set(actionKey, (middlewares = [])); + + middlewares.push( + handler as ( + opts: CustomMiddlewareParameters + ) => NextResult | Promise + ); + + return this; + } + + function onSettled$( + this: typeof extensions, + handler: (opts: OnSettledParameters) => void | Promise + ): typeof extensions; + + function onSettled$< + ActionKey extends PublicActionKey, + Output = OutputOf, + Input = InputOf, + >( + this: typeof extensions, + actionKey: ActionKey, + handler: (opts: OnSettledParameters) => void | Promise + ): typeof extensions; + + function onSettled$( + this: typeof extensions, + arg1: ActionKey | ((opts: OnSettledParameters) => void | Promise), + arg2?: (opts: OnSettledParameters) => void | Promise + ) { + const actionKey = arg2 ? (arg1 as ActionKey) : null; + const handler = (arg2 ?? arg1) as ( + opts: OnSettledParameters + ) => void | Promise; + + let settled = settledPerAction.get(actionKey); + if (!settled) settledPerAction.set(actionKey, (settled = [])); + + settled.push(handler); + + return this; + } + + const extensions = { + /** + * Use this callback if you need to transform the raw input before it's evaluated by the handlers, + * For example adding extra properties to the input + */ + transform$>( + actionKey: ActionKey, + transform: (input: unknown) => Input | Promise + ) { + transforms.set(actionKey, transform); + return extensions; + }, + + /** + * Use this callback to completely override the handler of a specific action. + */ + override$< + ActionKey extends PublicActionKey, + Input = InputOf, + Output = Awaited>, + >( + actionKey: ActionKey, + handler: (opts: ProcedureResolverOptions) => Output | Promise + ) { + overrides.set(actionKey, handler); + return extensions; + }, + + /** + * Use this callback to run custom code before the original handlers, for example to implement custom authorization logic. + */ + use$, + + /** + * Use this callback to run custom code after the action executes but before the response is sent. + * Receives both the result and any error from the action, runs even if the action threw. + * Errors thrown inside onSettled$ callbacks will propagate and prevent the response from being sent. + * + * @example For all actions + * ```ts + * videoHandler.onSettled$(({ videoAction, input, result, error }) => { ... }); + * ``` + * + * @example For a specific action + * ```ts + * videoHandler.onSettled$('createSession', ({ input, result, error }) => { ... }); + * ``` + */ + onSettled$, + + /** + * Make a vonage client instance with the configuration provided to the router. + */ + makeVideoClient$, + } as const; + + return Object.assign(router as TRPCRouter, extensions); +} + +export type IVideoRouter = ReturnType; + +type IVideoRouterContract = { + // exclude private handlers + [K in Exclude<`${VideoAction}`, 'createEphemeralToken'>]: AnyMutationProcedure; +}; + +export type PublicActionKey = keyof IVideoRouterContract; + +export type AsActionKey = T extends VideoAction ? T : never; + +export type NextResult = { + [OKAY]: true; +}; + +export type ProcedureResolverOptions< + Input, + Context extends { + videoClient: VideoClient; + }, +> = { + ctx: Context; + path: string; + signal: AbortSignal | undefined; + batchIndex?: number | undefined; + input: unknown; + + /** + * Use this function to validate the input against the Zod schema for the given action. It will throw a TRPCError with code 'BAD_REQUEST' if the validation fails. + * + * @example + * ```ts + * const { assertInput } = opts; + * const input = assertInput(opts.input); // input is now correctly typed and validated + * ``` + */ + assertInput(input: unknown): Input; + + /** + * Contains known video client methods + */ + videoClient: VideoClient; +}; + +export type InnerNextFn = { + (): NextResult; + + (opts: { ctx?: Context; input?: Input }): NextResult; +}; + +export type InnerNextParameters = Parameters< + InnerNextFn +>[0]; + +export type CustomMiddlewareParameters< + Result, + Context extends { videoClient: VideoClient }, +> = Prettify< + ProcedureResolverOptions & { + next: InnerNextFn; + videoAction: VideoAction; + } +>; + +export type InputOf = Parameters[0]; + +export type OutputOf = Awaited< + ReturnType +>; + +export type OnSettledParameters< + Output, + Input, + Context extends { videoClient: VideoClient }, +> = Prettify<{ + videoAction: VideoAction; + input: Input; + result: Output | null; + error: unknown; + ctx: Context; +}>; + +export default createVideoRouter; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/index.ts new file mode 100644 index 00000000..24ec6623 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/index.ts @@ -0,0 +1,2 @@ +export { default } from './createVideoRouter'; +export * from './createVideoRouter'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ACL.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ACL.schema.ts new file mode 100644 index 00000000..9b8189d8 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ACL.schema.ts @@ -0,0 +1,9 @@ +import { z } from 'zod'; +import type { ACL } from '@vonage/jwt'; +import ACLRuleSchema from './ACLRule.schema'; + +export const ACLSchema = z.object({ + paths: z.record(z.string(), ACLRuleSchema), +}) satisfies z.ZodType; + +export default ACLSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ACLRule.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ACLRule.schema.ts new file mode 100644 index 00000000..956a5c2b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ACLRule.schema.ts @@ -0,0 +1,9 @@ +import { z } from 'zod'; +import type { ACLRule } from '@vonage/jwt'; + +export const ACLRuleSchema = z.object({ + methods: z.array(z.enum(['POST', 'PUT', 'PATCH', 'GET', 'DELETE'])).optional(), + filters: z.record(z.string(), z.unknown()).optional(), +}) satisfies z.ZodType; + +export default ACLRuleSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/AlgorithmTypes.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/AlgorithmTypes.schema.ts new file mode 100644 index 00000000..a4e45236 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/AlgorithmTypes.schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod'; +import { AlgorithmTypes } from '@vonage/auth'; + +export const AlgorithmTypesSchema = z.enum(AlgorithmTypes) satisfies z.ZodType; + +export default AlgorithmTypesSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ArchiveSearchFilter.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ArchiveSearchFilter.schema.ts new file mode 100644 index 00000000..78149be8 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ArchiveSearchFilter.schema.ts @@ -0,0 +1,20 @@ +import type { ArchiveSearchFilter } from '@vonage/video'; +import z from 'zod'; + +/** + * Schema for filtering archive search results + */ +export const ArchiveSearchFilterSchema = z.object({ + /** + * The start offset in the list of existing archives. + */ + offset: z.number().int().nonnegative().optional(), + + /** + * The number of archives to retrieve starting at the offset. + * Default is 50, with a maximum of 1000. + */ + count: z.number().int().min(1).max(1000).optional(), +}) satisfies z.ZodType; + +export default ArchiveSearchFilterSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/AuthParams.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/AuthParams.schema.ts new file mode 100644 index 00000000..8ad4d4c2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/AuthParams.schema.ts @@ -0,0 +1,40 @@ +import { z } from 'zod'; +import type { AuthParams as AuthParamsVonage } from '@vonage/auth'; +import SignedHashParamsSchema from './SignedHashParams.schema'; +import GeneratorOptionsSchema from './GeneratorOptions.schema'; + +/** + * We use our own AuthParams to force using a discriminated union which avoids confusion around which fields are required for each auth type + */ +export type AuthParams = z.infer; + +const ApiKeyAuthSchema = z.object({ + authType: z.literal('apiKey'), + apiKey: z.string(), + apiSecret: z.string(), +}); + +const JwtAuthSchema = z.object({ + authType: z.literal('jwt'), + applicationId: z.string(), + privateKey: z.union([z.string(), z.instanceof(Buffer)]), + jwtOptions: GeneratorOptionsSchema.optional(), +}); + +const SignatureAuthSchema = z.object({ + authType: z.literal('signature'), + apiKey: z.string(), + signature: SignedHashParamsSchema, +}); + +export const AuthParamsSchema = z.discriminatedUnion('authType', [ + ApiKeyAuthSchema, + JwtAuthSchema, + SignatureAuthSchema, +]) satisfies z.ZodType; + +export function assertAuthParams(params: unknown): asserts params is AuthParams { + AuthParamsSchema.parse(params); +} + +export default AuthParamsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CaptionOptions.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CaptionOptions.schema.ts new file mode 100644 index 00000000..873299df --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CaptionOptions.schema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; +import type { CaptionOptions } from '@vonage/video'; + +export const CaptionOptionsSchema = z.object({ + languageCode: z.string().optional(), + maxDuration: z.number().optional(), + partialCaptions: z.enum(['true', 'false']).optional(), + statusCallbackUrl: z.string().optional(), +}) satisfies z.ZodType; + +export default CaptionOptionsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ClientTokenOptions.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ClientTokenOptions.schema.ts new file mode 100644 index 00000000..f5d34f90 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ClientTokenOptions.schema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; +import type { ClientTokenOptions } from '@vonage/video'; + +export const ClientTokenOptionsSchema = z.object({ + role: z.string().optional(), + data: z.string().optional(), + expireTime: z.number().optional(), + initialLayoutClassList: z.array(z.string()).optional(), +}) satisfies z.ZodType; + +export default ClientTokenOptionsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ConfigParams.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ConfigParams.schema.ts new file mode 100644 index 00000000..20880296 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ConfigParams.schema.ts @@ -0,0 +1,15 @@ +import { z } from 'zod'; +import type { ConfigParams } from '@vonage/server-client'; +import ResponseTypesSchema from './ResponseTypes.schema'; + +export const ConfigParamsSchema = z.object({ + restHost: z.string().optional(), + apiHost: z.string().optional(), + videoHost: z.string().optional(), + responseType: ResponseTypesSchema.optional(), + timeout: z.number().optional(), + meetingsHost: z.string().optional(), + appendUserAgent: z.string().optional(), +}) satisfies z.ZodType; + +export default ConfigParamsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateEphemeralTokenPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateEphemeralTokenPayload.schema.ts new file mode 100644 index 00000000..065e926b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateEphemeralTokenPayload.schema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; +import VideoPayloadSchema from './VideoPayload.schema'; +import ClientTokenOptionsSchema from './ClientTokenOptions.schema'; + +export const CreateEphemeralTokenPayloadSchema = VideoPayloadSchema.extend({ + clientTokenOptions: ClientTokenOptionsSchema.optional(), +}); + +export type CreateEphemeralTokenPayload = z.infer; + +export default CreateEphemeralTokenPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateSessionAndJoinPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateSessionAndJoinPayload.schema.ts new file mode 100644 index 00000000..74c44749 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateSessionAndJoinPayload.schema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; +import CreateSessionPayloadSchema from './CreateSessionPayload.schema'; +import ClientTokenOptionsSchema from './ClientTokenOptions.schema'; + +export const CreateSessionAndJoinPayloadSchema = CreateSessionPayloadSchema.extend({ + clientTokenOptions: ClientTokenOptionsSchema.optional(), +}); + +export type CreateSessionAndJoinPayload = z.infer; + +export default CreateSessionAndJoinPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateSessionPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateSessionPayload.schema.ts new file mode 100644 index 00000000..7b1a60c4 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateSessionPayload.schema.ts @@ -0,0 +1,18 @@ +import z from 'zod'; +import SessionOptionsSchema from './SessionOptions.schema'; +import { RoomNameSchema } from '@common/schemas'; + +export const CreateSessionPayloadSchema = z.object({ + roomName: RoomNameSchema.optional().nullable(), + sessionOptions: SessionOptionsSchema.optional(), +}); + +export type CreateSessionPayload = z.infer; + +export function assertCreateSessionPayload( + payload: unknown +): asserts payload is CreateSessionPayload { + CreateSessionPayloadSchema.parse(payload); +} + +export default CreateSessionPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/DecodeSessionIdPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/DecodeSessionIdPayload.schema.ts new file mode 100644 index 00000000..fd81b7c0 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/DecodeSessionIdPayload.schema.ts @@ -0,0 +1,14 @@ +import z from 'zod'; +import VideoPayloadSchema from './VideoPayload.schema'; + +export const DecodeSessionIdPayloadSchema = VideoPayloadSchema; + +export type DecodeSessionIdPayload = z.infer; + +export function assertDecodeSessionIdPayload( + payload: unknown +): asserts payload is DecodeSessionIdPayload { + DecodeSessionIdPayloadSchema.parse(payload); +} + +export default DecodeSessionIdPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/DisableCaptionsPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/DisableCaptionsPayload.schema.ts new file mode 100644 index 00000000..a58ed5bf --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/DisableCaptionsPayload.schema.ts @@ -0,0 +1,10 @@ +import z from 'zod'; +import VideoPayloadSchema from './VideoPayload.schema'; + +export const DisableCaptionsPayloadSchema = VideoPayloadSchema.extend({ + captionsId: z.string(), +}); + +export type DisableCaptionsPayload = z.infer; + +export default DisableCaptionsPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/EnableCaptionsPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/EnableCaptionsPayload.schema.ts new file mode 100644 index 00000000..dc5748cb --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/EnableCaptionsPayload.schema.ts @@ -0,0 +1,11 @@ +import z from 'zod'; +import VideoPayloadSchema from './VideoPayload.schema'; +import CaptionOptionsSchema from './CaptionOptions.schema'; + +export const EnableCaptionsPayloadSchema = VideoPayloadSchema.extend({ + captionOptions: CaptionOptionsSchema.optional(), +}); + +export type EnableCaptionsPayload = z.infer; + +export default EnableCaptionsPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/GeneratorOptions.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/GeneratorOptions.schema.ts new file mode 100644 index 00000000..df2e3c3f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/GeneratorOptions.schema.ts @@ -0,0 +1,18 @@ +import { z } from 'zod'; +import type { GeneratorOptions } from '@vonage/jwt'; +import ACLSchema from './ACL.schema'; + +export const GeneratorOptionsSchema = z + .object({ + ttl: z.number().optional(), + issued_at: z.number().optional(), + subject: z.string().optional(), + jti: z.string().optional(), + notBefore: z.number().optional(), + acl: ACLSchema.optional(), + key: z.string().optional(), + exp: z.number().optional(), + }) + .catchall(z.unknown()) satisfies z.ZodType; + +export default GeneratorOptionsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/JoinSessionPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/JoinSessionPayload.schema.ts new file mode 100644 index 00000000..cff427a4 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/JoinSessionPayload.schema.ts @@ -0,0 +1,15 @@ +import { z } from 'zod'; +import VideoPayloadSchema from './VideoPayload.schema'; +import ClientTokenOptionsSchema from './ClientTokenOptions.schema'; + +export const JoinSessionPayloadSchema = VideoPayloadSchema.extend({ + clientTokenOptions: ClientTokenOptionsSchema.optional(), +}); + +export type JoinSessionPayload = z.infer; + +export function assertJoinSessionPayload(payload: unknown): asserts payload is JoinSessionPayload { + JoinSessionPayloadSchema.parse(payload); +} + +export default JoinSessionPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ListArchivesPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ListArchivesPayload.schema.ts new file mode 100644 index 00000000..daa9d129 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ListArchivesPayload.schema.ts @@ -0,0 +1,8 @@ +import z from 'zod'; +import VideoPayloadSchema from './VideoPayload.schema'; + +export const SearchArchivesPayloadSchema = VideoPayloadSchema; + +export type SearchArchivesPayload = z.infer; + +export default SearchArchivesPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/Metadata.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/Metadata.schema.ts new file mode 100644 index 00000000..5fc4914b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/Metadata.schema.ts @@ -0,0 +1,7 @@ +import z from 'zod'; + +export const MetadataSchema = z.object({}).loose().optional(); + +export type Metadata = z.infer; + +export default MetadataSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ResponseTypes.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ResponseTypes.schema.ts new file mode 100644 index 00000000..bb7806ac --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ResponseTypes.schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod'; +import { ResponseTypes } from '@vonage/vetch'; + +export const ResponseTypesSchema = z.enum(ResponseTypes) satisfies z.ZodType; + +export default ResponseTypesSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SearchArchivesPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SearchArchivesPayload.schema.ts new file mode 100644 index 00000000..6d71b5cc --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SearchArchivesPayload.schema.ts @@ -0,0 +1,14 @@ +import z from 'zod'; +import VideoPayloadSchema from './VideoPayload.schema'; +import ArchiveSearchFilterSchema from './ArchiveSearchFilter.schema'; + +export const SearchArchivesPayloadSchema = VideoPayloadSchema.omit({ + sessionKey: true, +}).extend({ + ...ArchiveSearchFilterSchema.shape, + sessionKey: VideoPayloadSchema.shape.sessionKey.optional(), +}); + +export type SearchArchivesPayload = z.infer; + +export default SearchArchivesPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SessionOptions.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SessionOptions.schema.ts new file mode 100644 index 00000000..90587bab --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SessionOptions.schema.ts @@ -0,0 +1,16 @@ +import { z } from 'zod'; +import { ArchiveModeSchema, MediaModeSchema } from '@node/schemas'; + +export const SessionOptionsSchema = z.object({ + archiveMode: ArchiveModeSchema.optional(), + location: z.string().optional(), + mediaMode: MediaModeSchema.optional(), +}); + +export type SessionOptions = z.infer; + +export function assertSessionOptions(options: unknown): asserts options is SessionOptions { + SessionOptionsSchema.parse(options); +} + +export default SessionOptionsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SessionSigning.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SessionSigning.schema.ts new file mode 100644 index 00000000..d81ad817 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SessionSigning.schema.ts @@ -0,0 +1,30 @@ +import z from 'zod'; +import type { Algorithm } from 'jsonwebtoken'; + +export const SessionSigningSchema = z.object({ + secret: z.string().nonempty(), + algorithm: z + .enum([ + 'HS256', + 'HS384', + 'HS512', + 'RS256', + 'RS384', + 'RS512', + 'ES256', + 'ES384', + 'ES512', + 'PS256', + 'PS384', + 'PS512', + 'none', + ]) + .optional(), +}) satisfies z.ZodType; + +export type SessionSigning = { + secret: string; + algorithm?: Algorithm; +}; + +export default SessionSigningSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SignedHashParams.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SignedHashParams.schema.ts new file mode 100644 index 00000000..59948ba7 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SignedHashParams.schema.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; +import type { SignedHashParams } from '@vonage/auth'; +import AlgorithmTypesSchema from './AlgorithmTypes.schema'; + +export const SignedHashParamsSchema = z.object({ + secret: z.string(), + algorithm: AlgorithmTypesSchema, +}) satisfies z.ZodType; + +export default SignedHashParamsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/StartArchivePayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/StartArchivePayload.schema.ts new file mode 100644 index 00000000..11b01cfa --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/StartArchivePayload.schema.ts @@ -0,0 +1,17 @@ +import z from 'zod'; +import VideoPayloadSchema from './VideoPayload.schema'; +import { ArchiveOptionsSchema } from '@node/schemas'; + +export const StartArchivePayloadSchema = VideoPayloadSchema.extend({ + archiveOptions: ArchiveOptionsSchema.optional(), +}); + +export type StartArchivePayload = z.infer; + +export function assertStartArchivePayload( + payload: unknown +): asserts payload is StartArchivePayload { + StartArchivePayloadSchema.parse(payload); +} + +export default StartArchivePayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/StopArchivePayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/StopArchivePayload.schema.ts new file mode 100644 index 00000000..867c48ba --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/StopArchivePayload.schema.ts @@ -0,0 +1,10 @@ +import z from 'zod'; +import VideoPayloadSchema from './VideoPayload.schema'; + +export const StopArchivePayloadSchema = VideoPayloadSchema.extend({ + archiveId: z.string(), +}); + +export type StopArchivePayload = z.infer; + +export default StopArchivePayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/TRPCRuntimeConfigOptions.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/TRPCRuntimeConfigOptions.schema.ts new file mode 100644 index 00000000..1069df27 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/TRPCRuntimeConfigOptions.schema.ts @@ -0,0 +1,9 @@ +import { z } from 'zod'; +import type { TRPCRuntimeConfigOptions } from '@trpc/server'; +import type { Any } from '@common/types'; + +export const TRPCRuntimeConfigOptionsSchema: z.ZodType> = z + .object({}) + .loose(); + +export default TRPCRuntimeConfigOptionsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoAction.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoAction.schema.ts new file mode 100644 index 00000000..b4707d9d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoAction.schema.ts @@ -0,0 +1,13 @@ +import { VideoAction } from '@api-lib/types'; +import z from 'zod'; + +/** + * All known Vera actions + */ +export const VideoActionSchema = z.enum(VideoAction); + +export function assertVideoAction(action: unknown): asserts action is VideoAction { + VideoActionSchema.parse(action); +} + +export default VideoActionSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoClientConfig.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoClientConfig.schema.ts new file mode 100644 index 00000000..1e287527 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoClientConfig.schema.ts @@ -0,0 +1,46 @@ +import z from 'zod'; +import { AuthParamsSchema, AuthParams } from './AuthParams.schema'; +import ConfigParamsSchema from './ConfigParams.schema'; +import { SessionSigningSchema, type SessionSigning } from './SessionSigning.schema'; +import { Auth } from '@vonage/auth'; +import { makeBadRequestErrorHandler } from '@api-lib/errors'; +import type { HandlersDefaults } from '@api-lib/types'; + +export const VideoClientConfigSchema = z.object({ + auth: AuthParamsSchema.or(z.instanceof(Auth)), + videoParams: ConfigParamsSchema.optional(), + handlersDefaults: z.object({}).loose().optional(), + sessionSigning: SessionSigningSchema.optional(), +}) satisfies z.ZodType; + +export type VideoClientConfig = { + /** + * Vonage API authentication parameters + */ + auth: AuthParams | Auth; + + /** + * Vonage Video API configuration parameters + */ + videoParams?: z.infer; + + /** + * Allows you to define defaults values for the video actions + */ + handlersDefaults?: Partial; + + /** + * Optional configuration for signing session keys. This provides lightweight integrity verification of session keys, + * Helps ensure consistency when associating sessions with an application. + * Not intended for authentication or authorization. + */ + sessionSigning?: SessionSigning; +}; + +export function assertVideoClientConfig(config: unknown): asserts config is VideoClientConfig { + const { error } = VideoClientConfigSchema.safeParse(config); + + if (error) { + throw makeBadRequestErrorHandler('Invalid video client config')(error); + } +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoPayload.schema.ts new file mode 100644 index 00000000..8d417e67 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoPayload.schema.ts @@ -0,0 +1,10 @@ +import z from 'zod'; +import { SessionKeySchema } from '@node/schemas'; + +export const VideoPayloadSchema = z.object({ + sessionKey: SessionKeySchema, +}); + +export type VideoPayload = z.infer; + +export default VideoPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoRouterConfig.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoRouterConfig.schema.ts new file mode 100644 index 00000000..eca6de75 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoRouterConfig.schema.ts @@ -0,0 +1,50 @@ +import { z } from 'zod'; +import { AuthParamsSchema } from './AuthParams.schema'; +import ConfigParamsSchema from './ConfigParams.schema'; +import TRPCRuntimeConfigOptionsSchema from './TRPCRuntimeConfigOptions.schema'; +import { Auth } from '@vonage/auth'; +import type { Any, Prettify } from '@common/types'; +import { makeBadRequestErrorHandler } from '@api-lib/errors'; +import { SessionSigningSchema } from './SessionSigning.schema'; +import type { HandlersConfig, VideoClientConfig } from '@api-lib/types'; +import { TRPCRuntimeConfigOptions } from '@trpc/server'; + +type IVideoClientConfig = Omit; + +// Forces the VideoRouterConfigSchema to match the VideoClientConfig type +type IVideoClientConfigSchema = { + [K in keyof IVideoClientConfig]-?: z.ZodType; +}; + +const BaseVideoRouterConfigSchema = z.object({ + routerOptions: TRPCRuntimeConfigOptionsSchema.optional(), + handlersConfig: z.object({}).loose().optional(), +}); + +export const VideoRouterConfigSchema = BaseVideoRouterConfigSchema.extend({ + auth: AuthParamsSchema.or(z.instanceof(Auth)), + videoParams: ConfigParamsSchema.optional(), + sessionSigning: SessionSigningSchema.optional(), +} satisfies IVideoClientConfigSchema) satisfies z.ZodType>; + +export type VideoRouterConfig = Prettify< + { + [K in keyof IVideoClientConfig]: IVideoClientConfig[K]; + } & { + // extensions + handlersConfig?: Partial; + routerOptions?: TRPCRuntimeConfigOptions; + } +>; + +export function assertVideoRouterConfig( + config: unknown +): asserts config is VideoRouterConfig { + const { error } = VideoRouterConfigSchema.safeParse(config); + + if (error) { + throw makeBadRequestErrorHandler('Invalid video router configuration')(error); + } +} + +export default VideoRouterConfigSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/index.ts new file mode 100644 index 00000000..41bd8c2d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/index.ts @@ -0,0 +1,29 @@ +export * from './Metadata.schema'; +export * from './VideoPayload.schema'; +export * from './VideoRouterConfig.schema'; +export * from './EnableCaptionsPayload.schema'; +export * from './DisableCaptionsPayload.schema'; +export * from './CreateSessionPayload.schema'; +export * from './CreateSessionAndJoinPayload.schema'; +export * from './DecodeSessionIdPayload.schema'; +export * from './SearchArchivesPayload.schema'; +export * from './StartArchivePayload.schema'; +export * from './StopArchivePayload.schema'; +export * from './ArchiveSearchFilter.schema'; +export * from './VideoAction.schema'; +export * from './VideoClientConfig.schema'; +export * from './AlgorithmTypes.schema'; +export * from './SignedHashParams.schema'; +export * from './ACLRule.schema'; +export * from './ACL.schema'; +export * from './GeneratorOptions.schema'; +export * from './AuthParams.schema'; +export * from './ResponseTypes.schema'; +export * from './ConfigParams.schema'; +export * from './CaptionOptions.schema'; +export * from './ClientTokenOptions.schema'; +export * from './SessionOptions.schema'; +export * from './CreateEphemeralTokenPayload.schema'; +export * from './JoinSessionPayload.schema'; +export * from './TRPCRuntimeConfigOptions.schema'; +export * from './SessionSigning.schema'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationErrorMiddleware.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationErrorMiddleware.ts new file mode 100644 index 00000000..87664610 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationErrorMiddleware.ts @@ -0,0 +1,21 @@ +import type { NextFunction, Response as ExpressResponse } from 'express'; +import ApplicationRequest from './ApplicationRequest'; +import ParamsDictionary from './ParamsDictionary'; +import Query from './Query'; +import type { Any } from '@common/types/Any'; + +export type ApplicationErrorMiddleware< + P = ParamsDictionary, + ResBody = Any, + ReqBody = Any, + ReqQuery = Query, + LocalsObj extends Record = Record, +> = ( + error: Any, + // brings an application request which could contain metadata like the session or the user + req: ApplicationRequest, + res: ExpressResponse, + next: NextFunction +) => void | Promise; + +export default ApplicationErrorMiddleware; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationHandler.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationHandler.ts new file mode 100644 index 00000000..b87a54dc --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationHandler.ts @@ -0,0 +1,27 @@ +import type { + NextFunction, + Response as ExpressResponse, + RequestHandler as ExpressRequestHandler, +} from 'express'; +import ApplicationRequest from './ApplicationRequest'; +import ParamsDictionary from './ParamsDictionary'; +import Query from './Query'; +import type { Any } from '@common/types'; + +export type ApplicationHandler< + P = ParamsDictionary, + ResBody = Any, + ReqBody = Any, + ReqQuery = Query, + LocalsObj extends Record = Record, +> = ( + // brings an application request which could contain metadata like the session or the user + req: ApplicationRequest, + res: ExpressResponse, + next: NextFunction, + error?: Any +) => + | ReturnType> + | Promise>>; + +export default ApplicationHandler; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationRequest.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationRequest.ts new file mode 100644 index 00000000..1ea46ff8 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationRequest.ts @@ -0,0 +1,14 @@ +import type { Request as ExpressRequest } from 'express'; +import ParamsDictionary from './ParamsDictionary'; +import type { Any } from '@common/types'; +import type { ParsedQs } from 'qs'; + +export type ApplicationRequest< + P = ParamsDictionary, + ResBody = Any, + ReqBody = Any, + ReqQuery = ParsedQs, + Locals extends Record = Record, +> = ExpressRequest; + +export default ApplicationRequest; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationRequestHandler.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationRequestHandler.ts new file mode 100644 index 00000000..e58de200 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationRequestHandler.ts @@ -0,0 +1,24 @@ +import type { NextFunction, Response as ExpressResponse } from 'express'; +import ApplicationRequest from './ApplicationRequest'; +import ParamsDictionary from './ParamsDictionary'; +import Query from './Query'; +import type { Any } from '@common/types'; + +export type ApplicationRequestHandler< + P = ParamsDictionary, + ResBody = Any, + ReqBody = Any, + ReqQuery = Query, + LocalsObj extends Record = Record, +> = ( + // brings an application request which could contain metadata like the session or the user + req: ApplicationRequest, + res: ExpressResponse, + next: NextFunction + + /** + * forces the handler to return an ExpressResponse, this prevent dead ends + */ +) => ExpressResponse | Promise; + +export default ApplicationRequestHandler; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlerConfig.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlerConfig.ts new file mode 100644 index 00000000..dbad670e --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlerConfig.ts @@ -0,0 +1,20 @@ +import type { VideoAction } from './VideoAction'; +import type { IVideoClient } from './IVideoClient'; + +export type HandlerConfig< + Action extends VideoAction, + Input = Parameters[0], + Defaults = Partial>, +> = { + /** + * Optional function to transform the input before it's passed to the the videoClient instance. + */ + transformInput?: (args: { input: unknown; assertInput(input: unknown): Input }) => Partial; + + /** + * Optional default values for the specific video action + */ + addDefaults?: Defaults | ((input: Input) => Defaults); +}; + +export default HandlerConfig; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlersConfig.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlersConfig.ts new file mode 100644 index 00000000..20b5f657 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlersConfig.ts @@ -0,0 +1,17 @@ +import type { VideoAction } from './VideoAction'; +import type HandlerConfig from './HandlerConfig'; + +type AllowedKeys = Exclude< + VideoAction, + /** + * This are non methods which are not accessible through the api or which configuration is inherited from other handlers + */ + 'createEphemeralToken' | 'ensureCaptionsEnabled' +>; + +export type HandlersConfig = { + // exclude private handlers + [K in AllowedKeys]: HandlerConfig; +}; + +export default HandlersConfig; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlersDefaults.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlersDefaults.ts new file mode 100644 index 00000000..f021c803 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlersDefaults.ts @@ -0,0 +1,10 @@ +import type HandlersConfig from './HandlersConfig'; + +/** + * Defines the default values for the handlers in the video API + */ +export type HandlersDefaults = { + [key in keyof HandlersConfig]?: HandlersConfig[key]['addDefaults']; +}; + +export default HandlersDefaults; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/IVideoClient.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/IVideoClient.ts new file mode 100644 index 00000000..779c88c6 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/IVideoClient.ts @@ -0,0 +1 @@ +export type IVideoClient = import('../core/VideoClient').default; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/IVideoRouter.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/IVideoRouter.ts new file mode 100644 index 00000000..8fa07dad --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/IVideoRouter.ts @@ -0,0 +1 @@ +export type IVideoRouter = import('../routing/videoRouter/createVideoRouter').IVideoRouter; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ParamsDictionary.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ParamsDictionary.ts new file mode 100644 index 00000000..6f23422b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ParamsDictionary.ts @@ -0,0 +1,5 @@ +export interface ParamsDictionary { + [key: string]: string; +} + +export default ParamsDictionary; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/Query.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/Query.ts new file mode 100644 index 00000000..bf2f50f2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/Query.ts @@ -0,0 +1,5 @@ +export interface Query { + [key: string]: undefined | string | Query | (string | Query)[]; +} + +export default Query; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/TokenRole.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/TokenRole.ts new file mode 100644 index 00000000..9ac8f772 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/TokenRole.ts @@ -0,0 +1,8 @@ +export enum TokenRole { + PUBLISHER = 'publisher', + PUBLISHER_ONLY = 'publisheronly', + SUBSCRIBER = 'subscriber', + MODERATOR = 'moderator', +} + +export default TokenRole; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/VideoAction.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/VideoAction.ts new file mode 100644 index 00000000..8a588dda --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/VideoAction.ts @@ -0,0 +1,17 @@ +/** + * Public api actions to export through the video router. + */ +export enum VideoAction { + createEphemeralToken = 'createEphemeralToken', + createSession = 'createSession', + createSessionAndJoin = 'createSessionAndJoin', + startArchive = 'startArchive', + stopArchive = 'stopArchive', + searchArchives = 'searchArchives', + enableCaptions = 'enableCaptions', + disableCaptions = 'disableCaptions', + joinSession = 'joinSession', + ensureCaptionsEnabled = 'ensureCaptionsEnabled', +} + +export default VideoAction; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/index.ts new file mode 100644 index 00000000..46652a4e --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/index.ts @@ -0,0 +1,32 @@ +export type * from './IVideoClient'; + +// Schema types +export type { + VideoClientConfig, + CreateSessionPayload, + CreateSessionAndJoinPayload, + DecodeSessionIdPayload, + CreateEphemeralTokenPayload, + StartArchivePayload, + StopArchivePayload, + SearchArchivesPayload, + EnableCaptionsPayload, + JoinSessionPayload, + SessionOptions, + VideoPayload, + VideoRouterConfig, + SessionSigning, +} from '../schemas'; + +export type * from './IVideoRouter'; +export type * from './ApplicationErrorMiddleware'; +export type * from './ApplicationHandler'; +export type * from './ApplicationRequest'; +export type * from './ApplicationRequestHandler'; +export type * from './ParamsDictionary'; +export type * from './Query'; +export * from './TokenRole'; +export * from './VideoAction'; +export type * from './HandlerConfig'; +export type * from './HandlersConfig'; +export type * from './HandlersDefaults'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.json b/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.json index 5cfec05b..656f84b5 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.json @@ -21,7 +21,11 @@ "@common": ["../common/src"], "@common/*": ["../common/src/*"], "@node": ["../common/srcNode"], - "@node/*": ["../common/srcNode/*"] + "@node/*": ["../common/srcNode/*"], + "@common-test": ["../common/test"], + "@common-test/*": ["../common/test/*"], + "@node-test": ["../common/testNode"], + "@node-test/*": ["../common/testNode/*"] }, "lib": ["ESNext"] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.lib.json b/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.lib.json index 45c0cab3..a18f6335 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.lib.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.lib.json @@ -1,5 +1,5 @@ { - "extends": ["./tsconfig.json"], + "extends": "./tsconfig.json", "compilerOptions": { "composite": true, "outDir": "dist", @@ -8,6 +8,13 @@ "types": ["node"], "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo" }, - "include": ["src/**/*.ts", "../common/src/**/*.ts"], - "exclude": ["**/*.spec.*", "**/*.test.*"] + "include": [ + "src/**/*.ts", + "../common/src/**/*.ts", + "../common/srcNode/**/*.ts", + "../common/test/**/*.ts", + "../common/testNode/**/*.ts", + "../common/src/types/FacingMode.ts" + ], + "exclude": ["**/*.spec.*", "**/*.test.*", "../common/**/*.spec.*", "../common/**/*.test.*"] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.spec.json b/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.spec.json index 5e269da8..c3852cf4 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.spec.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.spec.json @@ -11,6 +11,11 @@ "test/**/*.ts", "src/**/*.ts", "src/**/*.test.ts", - "src/**/*.spec.ts" + "src/**/*.spec.ts", + "../common/src/**/*.ts", + "../common/srcNode/**/*.ts", + "../common/test/**/*.ts", + "../common/testNode/**/*.ts", + "../common/src/types/FacingMode.ts" ] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/vite.config.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/vite.config.ts index 3638ee45..3057ca85 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/api/vite.config.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/vite.config.ts @@ -9,6 +9,9 @@ export default defineConfig(() => ({ alias: { '@api-lib': path.resolve(__dirname, './src'), '@common': path.resolve(__dirname, '../common/src'), + '@node': path.resolve(__dirname, '../common/srcNode'), + '@common-test': path.resolve(__dirname, '../common/test'), + '@node-test': path.resolve(__dirname, '../common/testNode'), }, }, test: { @@ -23,6 +26,13 @@ export default defineConfig(() => ({ reportsDirectory: './coverage', provider: 'v8' as const, reporter: ['text', 'lcov'], + allowExternal: true, + include: [ + `${path.resolve(__dirname, 'src')}/**/*.{ts,tsx}`, + `${path.resolve(__dirname, '../common/src')}/**/*.{ts,tsx}`, + `${path.resolve(__dirname, '../common/srcNode')}/**/*.{ts,tsx}`, + ], + exclude: ['test/**', '**/index.ts'], }, }, })); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotEmptyString.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotEmptyString.ts new file mode 100644 index 00000000..e3d08fbe --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotEmptyString.ts @@ -0,0 +1,9 @@ +import isString from './isString'; + +function assertNotEmptyString(value: unknown, message?: string): asserts value is string { + if (!isString(value) || value.length === 0) { + throw new TypeError(message ?? `Expected a non-empty string but received ${typeof value}`); + } +} + +export default assertNotEmptyString; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/assertNotNil.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/assertNotNil.test.ts new file mode 100644 index 00000000..341255d4 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/assertNotNil.test.ts @@ -0,0 +1,15 @@ +import { describe, it, expect } from 'vitest'; +import assertNotNil from './assertNotNil'; + +describe('assertNotNil', () => { + it('should not throw for a non-nil value', () => { + expect(() => assertNotNil({ key: 'value' })).not.toThrow(); + }); + + it('should throw for nil values with default message', () => { + expect(() => assertNotNil(null)).toThrow(TypeError); + expect(() => assertNotNil(undefined)).toThrow( + 'Expected value to be non-null and non-undefined' + ); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/assertNotNil.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/assertNotNil.ts new file mode 100644 index 00000000..95dad6f2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/assertNotNil.ts @@ -0,0 +1,9 @@ +import isNil from '../isNil'; + +function assertNotNil(value: T, message?: string): asserts value is NonNullable { + if (isNil(value)) { + throw new TypeError(message || 'Expected value to be non-null and non-undefined'); + } +} + +export default assertNotNil; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/index.ts new file mode 100644 index 00000000..eb9c935e --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/index.ts @@ -0,0 +1 @@ +export { default } from './assertNotNil'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNumericString/assertNumericString.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNumericString/assertNumericString.ts new file mode 100644 index 00000000..e392a4ae --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNumericString/assertNumericString.ts @@ -0,0 +1,9 @@ +import isNumericString from '../isNumericString'; + +function assertNumericString(value: unknown, message?: string): asserts value is string { + if (!isNumericString(value)) { + throw new TypeError(message ?? `${String(value)} is not a valid number string`); + } +} + +export default assertNumericString; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNumericString/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNumericString/index.ts new file mode 100644 index 00000000..120257c0 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNumericString/index.ts @@ -0,0 +1 @@ +export { default } from './assertNumericString'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/assertSessionId.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/assertSessionId.test.ts new file mode 100644 index 00000000..50f1e738 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/assertSessionId.test.ts @@ -0,0 +1,15 @@ +import { describe, it, expect } from 'vitest'; +import { VALID_SESSION_ID } from '@common-test/fixtures'; +import assertSessionId from '.'; + +describe('assertSessionId', () => { + it('should not throw for a valid session ID', () => { + expect(() => assertSessionId(VALID_SESSION_ID)).not.toThrow(); + }); + + it('should throw for invalid values', () => { + expect(() => assertSessionId('invalid-session-id')).toThrow(); + expect(() => assertSessionId(null)).toThrow(); + expect(() => assertSessionId(undefined)).toThrow(); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/assertSessionId.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/assertSessionId.ts new file mode 100644 index 00000000..2b483409 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/assertSessionId.ts @@ -0,0 +1,10 @@ +import { assertString } from '@common/assertions'; +import type { SessionId } from '../../types'; +import decodeSessionId from '../../helpers/decodeSessionId'; + +function assertSessionId(value: unknown): asserts value is SessionId { + assertString(value, 'SessionId must be a string'); + decodeSessionId({ sessionId: value }); +} + +export default assertSessionId; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/index.ts new file mode 100644 index 00000000..7208c8ce --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/index.ts @@ -0,0 +1 @@ +export { default } from './assertSessionId'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertString.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertString.ts new file mode 100644 index 00000000..021b94ad --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertString.ts @@ -0,0 +1,9 @@ +import isString from './isString'; + +function assertString(value: unknown, message?: string): asserts value is string { + if (!isString(value)) { + throw new TypeError(message ?? `Expected a string but received ${typeof value}`); + } +} + +export default assertString; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/index.ts index 430e3f92..43ea8a57 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/index.ts @@ -1,4 +1,6 @@ +export { default as assertNotEmptyString } from './assertNotEmptyString'; export { default as assertRecord } from './assertRecord'; +export { default as assertNotNil } from './assertNotNil'; export { default as isErrorLike } from './isErrorLike'; export { default as isFunction } from './isFunction'; export { default as isNil } from './isNil'; @@ -8,3 +10,13 @@ export { default as isRecord } from './isRecord'; export { default as isString } from './isString'; export { default as isUndefined } from './isUndefined'; export { default as isNotNil } from './isNotNil'; +export { default as assertString } from './assertString'; +export { default as isValidRoomName } from './isValidRoomName'; +export { default as isSessionKeyLike } from './isSessionKeyLike'; +export { default as isSessionIdLike } from './isSessionIdLike'; +export { default as assertSessionId } from './assertSessionId'; +export { default as isValidSessionId } from './isValidSessionId'; +export { default as isValidSessionKey } from './isValidSessionKey'; +export { default as isNumber } from './isNumber'; +export { default as isNumericString } from './isNumericString'; +export { default as assertNumericString } from './assertNumericString'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumber/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumber/index.ts new file mode 100644 index 00000000..442986ee --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumber/index.ts @@ -0,0 +1 @@ +export { default } from './isNumber'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumber/isNumber.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumber/isNumber.ts new file mode 100644 index 00000000..83a3b265 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumber/isNumber.ts @@ -0,0 +1,5 @@ +function isNumber(value: unknown): value is number { + return typeof value === 'number' && Number.isFinite(value); +} + +export default isNumber; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumericString/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumericString/index.ts new file mode 100644 index 00000000..733100ef --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumericString/index.ts @@ -0,0 +1 @@ +export { default } from './isNumericString'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumericString/isNumericString.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumericString/isNumericString.ts new file mode 100644 index 00000000..e39d3076 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumericString/isNumericString.ts @@ -0,0 +1,17 @@ +import isString from '../isString'; + +function isNumericString(value: unknown): value is string { + if (!isString(value)) { + return false; + } + + const trimmed = value.trim(); + + if (!trimmed) { + return false; + } + + return Number.isFinite(Number(trimmed)); +} + +export default isNumericString; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/index.ts new file mode 100644 index 00000000..34b3736c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/index.ts @@ -0,0 +1 @@ +export { default } from './isSessionIdLike'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/isSessionIdLike.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/isSessionIdLike.test.ts new file mode 100644 index 00000000..4f7c8e90 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/isSessionIdLike.test.ts @@ -0,0 +1,11 @@ +import { describe, it, expect } from 'vitest'; +import isSessionIdLike from './isSessionIdLike'; + +describe('isSessionIdLike', () => { + it('should distinguish session ids from plain room names', () => { + expect( + isSessionIdLike('1_MX4xMjM0NTY3OH4VGh1IEZlYiAyNyAwODozMjozNCBQU1QgMjAyMH4wLjI0NDYxMjE') + ).toBe(true); + expect(isSessionIdLike('my-room')).toBe(false); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/isSessionIdLike.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/isSessionIdLike.ts new file mode 100644 index 00000000..80992d62 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/isSessionIdLike.ts @@ -0,0 +1,17 @@ +/** + * Determines whether a given string is a Vonage Video API sessionId-like string. + * A sessionId-like string has the format `prefix_base64data` (exactly two parts split by `_`). + * @param {string} value - The value to check. + * @returns {boolean} True if the value matches the sessionId-like format. + */ +const isSessionIdLike = (value: string): boolean => { + const parts = value.split('_'); + const looksLikeBase64 = /^[a-z0-9+/=-]+$/i.test(parts[1]); + + const isSessionId = + parts.length === 2 && parts[0].length > 0 && parts[1].length > 50 && looksLikeBase64; + + return Boolean(isSessionId); +}; + +export default isSessionIdLike; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/index.ts new file mode 100644 index 00000000..45c0edc4 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/index.ts @@ -0,0 +1 @@ +export { default } from './isSessionKeyLike'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/isSessionKeyLike.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/isSessionKeyLike.test.ts new file mode 100644 index 00000000..3ce95e6d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/isSessionKeyLike.test.ts @@ -0,0 +1,11 @@ +import { describe, it, expect } from 'vitest'; +import isSessionKeyLike from './isSessionKeyLike'; + +describe('isSessionKeyLike', () => { + it('should distinguish session keys from plain room names', () => { + expect(isSessionKeyLike('eyJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uSWQiOiIxX01YNH0.abc123def456')).toBe( + true + ); + expect(isSessionKeyLike('my-room')).toBe(false); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/isSessionKeyLike.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/isSessionKeyLike.ts new file mode 100644 index 00000000..adae7e9f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/isSessionKeyLike.ts @@ -0,0 +1,10 @@ +const isSessionKeyLike = (value: string) => { + const parts = value.split('.'); + const hasThreeParts = parts.length === 3; + const allPartsNonEmpty = hasThreeParts && parts.every((part) => part.length > 0); + const looksLikeBase64Url = hasThreeParts && parts.every((part) => /^[a-z0-9_-]+$/i.test(part)); + + return Boolean(allPartsNonEmpty && looksLikeBase64Url); +}; + +export default isSessionKeyLike; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidRoomName/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidRoomName/index.ts new file mode 100644 index 00000000..52f3537c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidRoomName/index.ts @@ -0,0 +1 @@ +export { default } from './isValidRoomName'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/utils/isValidRoomName/isValidRoomName.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidRoomName/isValidRoomName.spec.ts similarity index 100% rename from tutorials/vonage_video_react_app-feature-config/project/frontend/src/utils/isValidRoomName/isValidRoomName.spec.ts rename to tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidRoomName/isValidRoomName.spec.ts diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/utils/isValidRoomName/isValidRoomName.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidRoomName/isValidRoomName.ts similarity index 54% rename from tutorials/vonage_video_react_app-feature-config/project/frontend/src/utils/isValidRoomName/isValidRoomName.ts rename to tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidRoomName/isValidRoomName.ts index 475b47e8..187b7e60 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/utils/isValidRoomName/isValidRoomName.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidRoomName/isValidRoomName.ts @@ -1,7 +1,12 @@ +/** + * Eventually we are going to remove roomNames as identifiers + */ const isValidRoomName = (name: string) => { // Regular expression to allow letters, numbers, underscores, hyphens, and plus sign only const regex = /^[a-z0-9_+-]+$/; - return regex.test(name) && name.length >= 1 && name.length <= 100; + const isRoomName = regex.test(name) && name.length >= 1 && name.length <= 100; + + return isRoomName; }; export default isValidRoomName; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/index.ts new file mode 100644 index 00000000..fd3e5347 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/index.ts @@ -0,0 +1 @@ +export { default } from './isValidSessionId'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/isValidSessionId.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/isValidSessionId.test.ts new file mode 100644 index 00000000..686f2096 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/isValidSessionId.test.ts @@ -0,0 +1,16 @@ +import { describe, it, expect } from 'vitest'; +import isValidSessionId from '.'; + +describe('isValidSessionId', () => { + it('should return true for a valid session ID', () => { + expect( + isValidSessionId('1_MX4xMjM0NTY3OH4-VGh1IEZlYiAyNyAwODozMjozNCBQU1QgMjAyMH4wLjI0NDYxMjE') + ).toBe(true); + }); + + it('should return false for invalid values', () => { + expect(isValidSessionId('invalid-session-id')).toBe(false); + expect(isValidSessionId(null)).toBe(false); + expect(isValidSessionId(undefined)).toBe(false); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/isValidSessionId.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/isValidSessionId.ts new file mode 100644 index 00000000..de163e14 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/isValidSessionId.ts @@ -0,0 +1,15 @@ +import { tryCatch } from '@common/execution'; +import type { SessionId } from '../../types'; +import { assertString } from '@common/assertions'; +import assertSessionId from '../assertSessionId'; + +function isValidSessionId(value: unknown): value is SessionId { + const { error } = tryCatch(() => { + assertString(value); + assertSessionId(value); + }); + + return !error; +} + +export default isValidSessionId; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionKey/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionKey/index.ts new file mode 100644 index 00000000..e65bbe10 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionKey/index.ts @@ -0,0 +1 @@ +export { default } from './isValidSessionKey'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionKey/isValidSessionKey.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionKey/isValidSessionKey.ts new file mode 100644 index 00000000..65f04f45 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionKey/isValidSessionKey.ts @@ -0,0 +1,14 @@ +import { tryCatch } from '@common/execution'; +import { assertString } from '@common/assertions'; +import { decodeSessionKey } from '@common/helpers'; + +function isValidSessionKey(value: unknown): value is string { + const { error } = tryCatch(() => { + assertString(value); + decodeSessionKey({ sessionKey: value }); + }); + + return !error; +} + +export default isValidSessionKey; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/frontFacingKeywords.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/frontFacingKeywords.ts new file mode 100644 index 00000000..363b120b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/frontFacingKeywords.ts @@ -0,0 +1,3 @@ +const frontFacingKeywords = ['front', 'user', 'facetime', 'selfie', 'face'] as const; + +export default frontFacingKeywords; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/index.ts new file mode 100644 index 00000000..2263b10c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/index.ts @@ -0,0 +1,2 @@ +export { default as frontFacingKeywords } from './frontFacingKeywords'; +export { default as rearFacingKeywords } from './rearFacingKeywords'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/rearFacingKeywords.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/rearFacingKeywords.ts new file mode 100644 index 00000000..a36597b0 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/rearFacingKeywords.ts @@ -0,0 +1,3 @@ +const rearFacingKeywords = ['rear', 'back', 'environment', 'world', 'main'] as const; + +export default rearFacingKeywords; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/ApplicationError.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/ApplicationError.test.ts index 47bd9bcf..33b8416c 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/ApplicationError.test.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/ApplicationError.test.ts @@ -20,7 +20,7 @@ describe('ApplicationError', () => { expect(error.message).toBe('Test error'); expect(error.severity).toBe('validation'); - expect(error.values).toEqual(['Email is required', 'Password too short']); + expect(error.issues).toEqual(['Email is required', 'Password too short']); expect(error.statusCode).toBe(StatusCodeEnum.ClientErrorUnauthorized); expect(() => error.assert()).toThrow(ApplicationError); }); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/ApplicationError.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/ApplicationError.ts index 8ecb8d3c..de537f23 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/ApplicationError.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/ApplicationError.ts @@ -1,16 +1,34 @@ -import StatusCodeEnum from 'status-code-enum'; +import { StatusCode } from 'status-code-enum'; import type { ApplicationErrorState, ApplicationErrorFallbackConfig, ErrorSeverity } from './types'; import mapSourceToState from './helpers/mapSourceToState'; +import { Any } from '@common/types'; +import { removeUndefinedProps } from '@common/helpers'; class ApplicationError extends Error { - public values: string[] = []; + /** + * An array to hold any specific issues related to the error, such as validation errors, zod issues etc + */ + public issues: Any[] = []; public severity: ErrorSeverity; - public statusCode: StatusCodeEnum; + public statusCode: StatusCode; public fallbackConfig: ApplicationErrorFallbackConfig; + /** + * A string to categorize the error, useful for error tracking and analytics. + */ + public type?: string; + + public get fallbackMessage() { + return this.fallbackConfig.fallbackMessage; + } + + public set fallbackMessage(message: string) { + this.fallbackConfig.fallbackMessage = message; + } + /** * Creates a new instance of the custom application error. * @param src - The source of the error, can be a string, an instance of `IApplicationError`, or an `Error` object. @@ -23,7 +41,7 @@ class ApplicationError extends Error { src: unknown; fallbackConfig: ApplicationErrorFallbackConfig; }) { - const state: Partial & { + const state: ApplicationErrorState & { message: string; fallbackConfig: ApplicationErrorFallbackConfig; } = { @@ -37,16 +55,20 @@ class ApplicationError extends Error { * If the message is already in the values array * We replace it with the fallback message to provide more context and avoid redundancy. */ - const hasMessageRedundancy = state.message === state.values?.[0]; + const hasMessageRedundancy = state.message === state.issues?.[0]; const message = hasMessageRedundancy ? state.fallbackConfig.fallbackMessage : state.message; super(message); this.stack = state.stack ?? this.stack; this.severity = state.severity ?? 'error'; - this.values = state.values ?? []; + this.issues = state.issues ?? []; this.fallbackConfig = state.fallbackConfig; - this.statusCode = state.statusCode ?? StatusCodeEnum.ServerErrorInternal; + this.statusCode = state.statusCode ?? StatusCode.ServerErrorInternal; + + // optional properties + this.name = state.name ?? this.constructor.name; + this.type = state.type ?? this.fallbackConfig.type ?? this.type; } /** @@ -61,12 +83,12 @@ class ApplicationError extends Error { */ add = (message: string, map?: Record) => { if (!map) { - this.values.push(message); + this.issues.push(message); return this; } - this.values.push( + this.issues.push( message.replace(/{(\w+)}/g, (match, propName) => { const propValue = map[propName]; if (propValue === undefined) return match; @@ -78,7 +100,7 @@ class ApplicationError extends Error { return this; }; - setStatusCode(statusCode: StatusCodeEnum): this { + setStatusCode(statusCode: StatusCode): this { this.statusCode = statusCode; return this; @@ -88,7 +110,7 @@ class ApplicationError extends Error { * Check if the custom validation has any violations and throw the error if it does. */ assert = () => { - if (this.values.length) throw this; + if (this.issues.length) throw this; }; public exportSafely = () => { @@ -98,31 +120,42 @@ class ApplicationError extends Error { public exportSafelyBase = (): { message: string; severity: ErrorSeverity; - values?: string[]; + issues?: string[]; stack?: string; fallbackMessage?: string; - statusCode: StatusCodeEnum; + statusCode: StatusCode; + type: string | undefined; + name: string; } => { - const { fallbackConfig, message, severity, stack, values, statusCode } = this; + const { fallbackConfig, message, severity, stack, statusCode, type, name } = this; + + const optionals = removeUndefinedProps({ + issues: this.issues.length ? this.issues : undefined, + type, + }); // Prevent disclosure of private sensitive info if (globalThis.process?.env?.NODE_ENV === 'development') { return { + name, fallbackMessage: fallbackConfig.fallbackMessage, message, severity, stack, - values, statusCode, + ...optionals, }; } return { + name, + // prevent disclosing unhandled messages on production message: fallbackConfig.fallbackMessage, severity, - values, statusCode, + + ...optionals, }; }; } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/index.ts index 85d29a61..8fc7ff01 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/index.ts @@ -1,5 +1,2 @@ export { default as isApplicationError } from './isApplicationError'; -export * from './isApplicationError'; - export { default as isApplicationErrorLike } from './isApplicationErrorLike'; -export * from './isApplicationErrorLike'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/isApplicationError/isApplicationError.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/isApplicationError/isApplicationError.test.ts index 2f61a8ad..90a85c08 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/isApplicationError/isApplicationError.test.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/isApplicationError/isApplicationError.test.ts @@ -19,7 +19,7 @@ describe('isApplicationError', () => { it('should return true for objects with fallbackConfig', () => { const plainObject: ApplicationErrorState = { - values: [], + issues: [], message: 'Test error', statusCode: StatusCodeEnum.ServerErrorInternal, severity: 'error', diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/isApplicationError/isApplicationError.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/isApplicationError/isApplicationError.ts index 5ab78ebd..1d2af522 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/isApplicationError/isApplicationError.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/isApplicationError/isApplicationError.ts @@ -7,7 +7,7 @@ import type ApplicationError from '../../ApplicationError'; export const isApplicationError = (source: unknown): source is ApplicationError => isRecord(source) && [ - source.values, + source.issues, source.severity, source.statusCode, source.fallbackConfig, diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/helpers/mapSourceToState/mapSourceToState.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/helpers/mapSourceToState/mapSourceToState.ts index 3ae0f09f..47b2d81e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/helpers/mapSourceToState/mapSourceToState.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/helpers/mapSourceToState/mapSourceToState.ts @@ -6,30 +6,34 @@ import isApplicationErrorLike from '../../assertions/isApplicationErrorLike'; export type ApplicationErrorState = import('../../types').ApplicationErrorState; export const mapSourceToState = (src: unknown): Partial => { - return removeUndefinedProps>( - (() => { - if (isString(src)) { - return { - message: src, - }; - } - - if (isApplicationError(src) || isApplicationErrorLike(src)) { - const copy: Partial = { - message: src.message, - fallbackConfig: src.fallbackConfig, - severity: src.severity, - stack: src.stack, - values: src.values, - statusCode: src.statusCode, - }; - - return copy; - } - - return {}; - })() - ); + const props = (() => { + if (isString(src)) { + return { + message: src, + }; + } + + if (isApplicationError(src) || isApplicationErrorLike(src)) { + const copy: Partial = { + message: src.message, + }; + + // avoid adding non present properties + if (Object.hasOwn(src, 'fallbackConfig')) copy.fallbackConfig = src.fallbackConfig; + if (Object.hasOwn(src, 'severity')) copy.severity = src.severity; + if (Object.hasOwn(src, 'stack')) copy.stack = src.stack; + if (Object.hasOwn(src, 'issues')) copy.issues = src.issues; + if (Object.hasOwn(src, 'statusCode')) copy.statusCode = src.statusCode; + if (Object.hasOwn(src, 'type')) copy.type = src.type; + if (Object.hasOwn(src, 'name')) copy.name = src.name; + + return copy; + } + + return {}; + })(); + + return removeUndefinedProps>(props); }; export default mapSourceToState; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/index.ts index a5422b7c..da4bb819 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/index.ts @@ -2,3 +2,4 @@ export * from './types'; export * from './helpers'; export * from './assertions'; export { default } from './ApplicationError'; +export { default as ApplicationError } from './ApplicationError'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ApplicationErrorFallbackConfig.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ApplicationErrorFallbackConfig.ts index 09999798..460003ae 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ApplicationErrorFallbackConfig.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ApplicationErrorFallbackConfig.ts @@ -1,5 +1,6 @@ -import StatusCodeEnum from 'status-code-enum'; +import { StatusCode } from 'status-code-enum'; import type { ErrorSeverity } from './ErrorSeverity'; +import { Any } from '@common/types'; export type ApplicationErrorFallbackConfig = { /** @@ -11,17 +12,17 @@ export type ApplicationErrorFallbackConfig = { * Collection of validation error values * This is used to group validation errors together */ - values?: string[]; + issues?: Any[]; severity?: ErrorSeverity; /** * The HTTP status code associated with the error. */ - statusCode: StatusCodeEnum; + statusCode: StatusCode; /** - * Indicates if the error is recoverable. + * Type of the error, used for categorization and handling logic. */ - recoverable?: boolean | null; + type?: string; }; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ApplicationErrorState.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ApplicationErrorState.ts index b4886c43..3364bed6 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ApplicationErrorState.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ApplicationErrorState.ts @@ -13,4 +13,8 @@ export type ApplicationErrorState = { * This includes the fallbackMessage and default error properties. */ fallbackConfig: ApplicationErrorFallbackConfig; -} & Pick; + + type?: string; + + name?: string; +} & Pick; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ZodIssue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ZodIssue.ts new file mode 100644 index 00000000..977500e5 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ZodIssue.ts @@ -0,0 +1,9 @@ +type ZodIssue = { + code: string; + path: (string | number)[]; + message: string; + expected?: string; + received?: string; +}; + +export type { ZodIssue }; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/index.ts index a4621fe2..473a8d61 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/index.ts @@ -1,3 +1,4 @@ export * from './ErrorSeverity'; export * from './ApplicationErrorFallbackConfig'; export * from './ApplicationErrorState'; +export * from './ZodIssue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/index.ts index 35b9c39b..52f834f6 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/index.ts @@ -4,5 +4,6 @@ export { default as debounce } from './debounce'; export { default as defer, type Deferred } from './defer'; export { default as enqueue } from './enqueue'; export { default as idempotentCallbackWithRetry } from './idempotentCallbackWithRetry'; +export { default as throttle } from './throttle'; export { default as tryCatch } from './tryCatch'; export { default as wait } from './wait'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/index.ts new file mode 100644 index 00000000..01f60eaf --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/index.ts @@ -0,0 +1 @@ +export { default } from './throttle'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/throttle.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/throttle.test.ts new file mode 100644 index 00000000..7b3dcd62 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/throttle.test.ts @@ -0,0 +1,54 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import throttle from './'; + +describe('throttle', () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it('invokes leading call immediately, throttles rapid calls, fires trailing with latest args, then resets', () => { + const callback = vi.fn(); + const throttled = throttle(callback, 500, { leading: true, trailing: true }); + + // Leading call fires immediately with correct args + throttled('a', 'b', 'c'); + expect(callback).toHaveBeenCalledTimes(1); + expect(callback).toHaveBeenCalledWith('a', 'b', 'c'); + + // Rapid calls within wait are suppressed; only latest args are kept for trailing + throttled('second'); + throttled('third'); + expect(callback).toHaveBeenCalledTimes(1); + + // Trailing call fires after wait with the latest args + vi.advanceTimersByTime(500); + expect(callback).toHaveBeenCalledTimes(2); + expect(callback).toHaveBeenLastCalledWith('third'); + + // After the full wait cycle the throttle resets — next call fires immediately again + vi.advanceTimersByTime(500); + throttled('reset'); + expect(callback).toHaveBeenCalledTimes(3); + expect(callback).toHaveBeenLastCalledWith('reset'); + + // leading: false — first call must not fire until wait elapses + const trailingOnly = throttle(callback, 500, { leading: false, trailing: true }); + trailingOnly('delayed'); + expect(callback).toHaveBeenCalledTimes(3); + vi.advanceTimersByTime(500); + expect(callback).toHaveBeenCalledTimes(4); + expect(callback).toHaveBeenLastCalledWith('delayed'); + + // trailing: false — suppressed calls are never fired + const leadingOnly = throttle(callback, 500, { leading: true, trailing: false }); + leadingOnly('lead'); + leadingOnly('ignored'); + expect(callback).toHaveBeenCalledTimes(5); + vi.advanceTimersByTime(500); + expect(callback).toHaveBeenCalledTimes(5); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/throttle.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/throttle.ts new file mode 100644 index 00000000..0ae40243 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/throttle.ts @@ -0,0 +1,66 @@ +import type { Any } from '@common/types'; + +type ThrottleOptions = { + leading?: boolean; + trailing?: boolean; +}; + +function throttle void>( + callback: T, + wait: number, + options: ThrottleOptions = {} +): (...args: Parameters) => void { + const { leading = true, trailing = true } = options; + + let trailingCallTimer: ReturnType | null = null; + let latestTrailingArgs: Parameters | null = null; + let lastCallbackExecutionTime = 0; + + const executeCallback = (args: Parameters) => { + lastCallbackExecutionTime = Date.now(); + latestTrailingArgs = null; + + callback(...args); + }; + + const cancelTrailingCall = () => { + if (!trailingCallTimer) return; + + clearTimeout(trailingCallTimer); + trailingCallTimer = null; + }; + + const scheduleTrailingCall = (delay: number) => { + if (trailingCallTimer) return; + + trailingCallTimer = setTimeout(() => { + trailingCallTimer = null; + + if (latestTrailingArgs) { + executeCallback(latestTrailingArgs); + } + }, delay); + }; + + return (...args: Parameters) => { + const now = Date.now(); + const timeSinceLastExecution = now - lastCallbackExecutionTime; + const canExecuteImmediately = timeSinceLastExecution >= wait; + + if (canExecuteImmediately && leading) { + cancelTrailingCall(); + executeCallback(args); + return; + } + + if (!trailing) return; + + latestTrailingArgs = args; + + const remainingWaitTime = canExecuteImmediately ? wait : wait - timeSinceLastExecution; + + scheduleTrailingCall(remainingWaitTime); + }; +} + +export default throttle; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/tryCatch/tryCatch.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/tryCatch/tryCatch.ts index dd43e7f3..6c5f91ce 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/tryCatch/tryCatch.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/tryCatch/tryCatch.ts @@ -5,10 +5,15 @@ type TryCatchResult< T extends (...args: any) => any, Fallback extends ReturnType | undefined, > = T extends () => Promise - ? Promise<{ result: Fallback extends undefined ? R | null : NonNullable; error: any }> + ? Promise<{ + result: Fallback extends undefined ? R | null : NonNullable; + error: any; + didFail: boolean; + }> : { result: Fallback extends undefined ? ReturnType | null : NonNullable>; error: any; + didFail: boolean; }; type AnyFunction = (...args: any[]) => any; @@ -32,13 +37,16 @@ function tryCatch> if (isPromise(result)) { return result - .then((res) => ({ result: res, error: null })) - .catch((error) => ({ result: fallback ?? null, error })) as TryCatchResult; + .then((res) => ({ result: res, error: null, didFail: false })) + .catch((error) => ({ result: fallback ?? null, error, didFail: true })) as TryCatchResult< + T, + Fallback + >; } - return { result, error: null } as TryCatchResult; + return { result, error: null, didFail: false } as TryCatchResult; } catch (error) { - return { result: fallback ?? null, error } as TryCatchResult; + return { result: fallback ?? null, error, didFail: true } as TryCatchResult; } } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/decodeJwt.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/decodeJwt.test.ts new file mode 100644 index 00000000..3060d76f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/decodeJwt.test.ts @@ -0,0 +1,31 @@ +import { describe, it, expect } from 'vitest'; +import decodeJwt from './decodeJwt'; + +const validJwt = [ + btoa(JSON.stringify({ alg: 'none' })), + btoa(JSON.stringify({ sessionId: 'some-session-id', roomName: 'my-room' })), + 'mock-sig', +].join('.'); + +describe('decodeJwt', () => { + it('should decode a valid JWT payload', () => { + const result = decodeJwt<{ sessionId: string; roomName: string }>(validJwt); + + expect(result).toEqual({ + sessionId: 'some-session-id', + roomName: 'my-room', + }); + }); + + it('should throw for a string without three dot-separated parts', () => { + expect(() => decodeJwt('invalidToken')).toThrow('Invalid token format'); + }); + + it('should throw for an empty string', () => { + expect(() => decodeJwt('')).toThrow('Invalid token format'); + }); + + it('should throw for a token with invalid base64 payload', () => { + expect(() => decodeJwt('a.!!invalid!!.c')).toThrow(); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/decodeJwt.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/decodeJwt.ts new file mode 100644 index 00000000..0241d03b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/decodeJwt.ts @@ -0,0 +1,29 @@ +/** + * Decodes a JWT without verifying its signature, and returns the payload as an object. + */ +const decodeJwt = (token: string): T => { + const parts = token.split('.'); + + if (parts.length !== 3) { + throw new Error('Invalid token format'); + } + + const base64Url = parts[1]; + + // Fix padding + const pad = '='.repeat((4 - (base64Url.length % 4)) % 4); + + // Convert Base64URL → Base64 + const base64 = (base64Url + pad).replace(/-/g, '+').replace(/_/g, '/'); + + // Decode safely + const binary = atob(base64); + const bytes = Uint8Array.from(binary, (c) => c.charCodeAt(0)); + const jsonString = new TextDecoder().decode(bytes); + + const payload = JSON.parse(jsonString) as T; + + return payload; +}; + +export default decodeJwt; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/index.ts new file mode 100644 index 00000000..16f17fa6 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/index.ts @@ -0,0 +1 @@ +export { default } from './decodeJwt'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionId/decodeSessionId.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionId/decodeSessionId.ts new file mode 100644 index 00000000..205b9381 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionId/decodeSessionId.ts @@ -0,0 +1,33 @@ +import type { DecodedSessionId } from '../../types/DecodedSessionId'; + +const decodeSessionId = ({ sessionId }: { sessionId: string }): DecodedSessionId => { + const [, encoded] = sessionId.split('_'); + + if (!encoded) { + throw new Error('Invalid sessionId format'); + } + + const info = encoded.replace(/-/g, '+'); + + const binary = atob(info); + const bytes = Uint8Array.from(binary, (c) => c.charCodeAt(0)); + + const decodedSession = new TextDecoder().decode(bytes); + const sessionFields = decodedSession.split('~'); + + if (sessionFields.length < 4) { + throw new Error('Invalid sessionId format'); + } + + return { + p2p: sessionFields.includes('P'), + autoArchive: sessionFields.includes('A'), + version: sessionFields[0], + partnerId: sessionFields[1], + applicationId: sessionFields[1], // verify this + location: sessionFields[2], + date: sessionFields[3], + }; +}; + +export default decodeSessionId; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/helpers/decodeSessionId/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionId/index.ts similarity index 100% rename from tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/helpers/decodeSessionId/index.ts rename to tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionId/index.ts diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionKey/decodeSessionKey.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionKey/decodeSessionKey.ts new file mode 100644 index 00000000..23189e6a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionKey/decodeSessionKey.ts @@ -0,0 +1,12 @@ +import { SessionKeyPayload, VideoSessionDetails } from '@common/types'; +import decodeJwt from '../decodeJwt'; +import decodeSessionId from '../decodeSessionId'; + +const decodeSessionKey = ({ sessionKey }: { sessionKey: string }): VideoSessionDetails => { + const tokenPayload = decodeJwt(sessionKey); + const session = decodeSessionId({ sessionId: tokenPayload.sessionId }); + + return { ...session, ...tokenPayload, sessionKey }; +}; + +export default decodeSessionKey; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionKey/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionKey/index.ts new file mode 100644 index 00000000..4f779362 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionKey/index.ts @@ -0,0 +1 @@ +export { default } from './decodeSessionKey'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/index.ts index 30a11ef7..9ec1db68 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/index.ts @@ -1,3 +1,8 @@ export { default as removeUndefinedProps } from './removeUndefinedProps'; export { default as toRemValue } from './toRemValue'; export { default as kebabToCamel } from './kebabToCamel'; +export { default as interceptObject } from './interceptObject'; +export { default as decodeSessionKey } from './decodeSessionKey'; +export { default as decodeSessionId } from './decodeSessionId'; +export { default as decodeJwt } from './decodeJwt'; +export { default as isZodError } from './isZodError'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/index.ts new file mode 100644 index 00000000..66bb385c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/index.ts @@ -0,0 +1 @@ +export { default } from './interceptObject'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/interceptObject.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/interceptObject.test.ts new file mode 100644 index 00000000..98507eb9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/interceptObject.test.ts @@ -0,0 +1,120 @@ +import { describe, expect, it } from 'vitest'; +import interceptObject from './'; + +type CounterService = { + value: number; + label: string; + summary: string; + increment: (step: number) => number; + readValue: () => number; +}; + +describe('interceptObject', () => { + it('should replace the target with a proxy and preserve bound original methods', () => { + const container = makeContainer(1); + + const envelope = interceptObject(container, 'service'); + const increment = container.service.increment; + + expect(envelope.proxy).toBe(container.service); + expect(container.service.summary).toBe('counter:1'); + expect(increment).toBe(container.service.increment); + expect(increment(2)).toBe(3); + + const readValue = envelope.getOriginal('readValue'); + + expect(readValue).toBe(envelope.getOriginal('readValue')); + expect(readValue()).toBe(3); + }); + + it('should apply and remove overrides for destructured methods', () => { + const container = makeContainer(4); + const envelope = interceptObject(container, 'service'); + const increment = container.service.increment; + + envelope.override('increment', ({ target, handler }) => { + expect(target.value).toBe(4); + + return (step) => handler(step * 2); + }); + + expect(increment(3)).toBe(10); + + envelope.removeOverride('increment'); + + expect(increment(1)).toBe(11); + + const unsubscribe = envelope.override('increment', ({ handler }) => { + return (step) => handler(step) + 100; + }); + + expect(increment(1)).toBe(112); + + unsubscribe(); + + expect(increment(1)).toBe(13); + }); + + it('should refresh original bindings when rebound to a fresh container', () => { + const initialContainer = makeContainer(2); + const envelope = interceptObject(initialContainer, 'service'); + const proxiedIncrement = initialContainer.service.increment; + + expect(envelope.getOriginal('readValue')()).toBe(2); + + const freshContainer = makeContainer(20); + + envelope.rebind(freshContainer); + + expect(envelope.getOriginal('readValue')()).toBe(20); + + envelope.override('increment', ({ target, handler }) => { + expect(target).toBe(freshContainer.service); + + return (step) => handler(step) + 100; + }); + + expect(envelope.getOriginal('increment')(1)).toBe(21); + expect(freshContainer.service.value).toBe(21); + expect(proxiedIncrement(1)).toBe(122); + expect(freshContainer.service.value).toBe(22); + }); + + it('should return a null proxy when the target object is missing', () => { + const container = { + service: null as unknown as CounterService, + }; + + const envelope = interceptObject(container, 'service'); + + expect(envelope.proxy).toBeNull(); + expect(envelope.getOriginal('readValue')).toBeUndefined(); + + envelope.rebind({ service: makeService(8) }); + + expect(envelope.getOriginal('readValue')()).toBe(8); + }); +}); + +function makeContainer(value: number): { service: CounterService } { + return { + service: makeService(value), + }; +} + +function makeService(value: number): CounterService { + return { + value, + label: 'counter', + get summary() { + return `${this.label}:${this.value}`; + }, + increment(step) { + this.value += step; + return this.value; + }, + readValue() { + return this.value; + }, + }; +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/interceptObject.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/interceptObject.ts new file mode 100644 index 00000000..4f0e4d82 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/interceptObject.ts @@ -0,0 +1,126 @@ +import { isFunction } from '@common/assertions'; +import type { AnyFunction, ObjectKeys } from '@common/types'; + +/** + * Methods accessed through the proxy are wrapped so their execution can be + * dynamically redirected to registered overrides, even when destructured. + * + * Overrides are defined via a builder that receives the original target and a + * pre-bound version of the method, and must return a replacement function. + * + * Original methods retain their native behavior and binding. + */ +const interceptObject = < + Envelop extends object, + Key extends ObjectKeys, + Target extends object = Envelop[Key] extends object ? Envelop[Key] : never, +>( + container: Envelop, + target: Key +) => { + let targetObj = container[target] as Target; + + const overrideRegistry = new Map(); + const originalRegistry = new Map(); + let functionCache = new WeakMap(); + + const proxy = targetObj + ? new Proxy(targetObj, { + get(proxyTarget, prop): unknown { + // Use the real target as `this` for property access to avoid + // "Illegal invocation" from native getters that perform brand checks + // (e.g. MediaDevices.ondevicechange in Firefox). + const value = Reflect.get(proxyTarget, prop, proxyTarget); + const methodName = String(prop); + + if (!isFunction(value)) return value; + + const typedValue = value as AnyFunction; + + if (functionCache.has(typedValue)) return functionCache.get(typedValue); + + if (!originalRegistry.has(methodName)) { + originalRegistry.set(methodName, typedValue.bind(proxyTarget)); + } + + const wrapped: AnyFunction = function (...args: unknown[]): unknown { + const registeredOverride = overrideRegistry.get(methodName); + if (registeredOverride) return registeredOverride(...args); + + return typedValue.apply(proxyTarget, args); + }; + + functionCache.set(typedValue, wrapped); + + return wrapped; + }, + }) + : null; + + if (targetObj) { + // Replace the original object with the proxy in the container + Object.defineProperty(container, target, { + value: proxy, + configurable: true, + writable: true, + }); + } + + return { + proxy, + override< + K extends keyof Target, + Handler extends AnyFunction = Target[K] extends AnyFunction ? Target[K] : never, + >( + method: K, + builder: (args: { + target: Target; + handler: Handler; + }) => (...args: Parameters) => ReturnType + ): Unsubscribe { + const original = this.getOriginal(method) as unknown as Handler; + const handler = builder({ target: targetObj, handler: original }); + + overrideRegistry.set(method as string, handler as AnyFunction); + + return () => { + overrideRegistry.delete(method as string); + }; + }, + removeOverride(method: K) { + overrideRegistry.delete(method as string); + }, + getOriginal< + K extends keyof Target, + Handler extends AnyFunction = Target[K] extends AnyFunction ? Target[K] : never, + >(method: K): Handler { + const cached = originalRegistry.get(method as string); + if (cached) return cached as Handler; + + const value = targetObj?.[method]; + if (!isFunction(value)) return value as Handler; + + const bound = value.bind(targetObj) as Handler; + originalRegistry.set(method as string, bound); + + return bound; + }, + /** + * Re-reads the target from the given container, clearing stale caches + * while preserving registered overrides. + * + * Useful when the container reference is replaced after initialization + * (e.g. `vi.stubGlobal` in tests replacing `navigator`). + */ + rebind(freshContainer?: Envelop) { + if (freshContainer) targetObj = freshContainer[target] as Target; + + originalRegistry.clear(); + functionCache = new WeakMap(); + }, + }; +}; + +type Unsubscribe = () => void; + +export default interceptObject; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/index.ts new file mode 100644 index 00000000..f0da82f6 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/index.ts @@ -0,0 +1 @@ +export { default } from './isZodError'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/isZodError.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/isZodError.test.ts new file mode 100644 index 00000000..a8f9e00e --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/isZodError.test.ts @@ -0,0 +1,16 @@ +import { describe, it, expect } from 'vitest'; +import { z } from 'zod'; +import isZodError from './isZodError'; + +const schema = z.object({ + name: z.string(), +}); + +describe('isZodError', () => { + it('returns true for a ZodError', () => { + const result = schema.safeParse({ name: 123 }); + expect(result.success).toBe(false); + expect(isZodError(!result.success && result.error)).toBe(true); + expect(isZodError(new Error('Not a Zod error'))).toBe(false); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/isZodError.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/isZodError.ts new file mode 100644 index 00000000..01632804 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/isZodError.ts @@ -0,0 +1,11 @@ +import { isNotNil } from '@common/assertions'; +import { isApplicationErrorLike } from '@common/errors'; +import { ZodError } from 'zod'; + +function isZodError(error: unknown): error is ZodError { + if (error instanceof ZodError) return true; + + return isApplicationErrorLike(error) && error.name === 'ZodError' && isNotNil(error.issues); +} + +export default isZodError; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/Logger.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/Logger.spec.ts index d8589f34..c0f45206 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/Logger.spec.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/Logger.spec.ts @@ -253,6 +253,82 @@ describe('LoggerBase', () => { }); }); + describe('setContext / clearContext', () => { + it('merges context into log() calls automatically', async () => { + const provider = { ...minimalProvider, log: vi.fn() }; + loggerBase.setup(() => provider); + + loggerBase.setContext({ userId: 'u1', sessionId: 's1' }); + loggerBase.log('TestEvent'); + + await waitFor(() => { + expect(provider.log).toHaveBeenCalledWith( + 'TestEvent', + expect.objectContaining({ userId: 'u1', sessionId: 's1' }) + ); + }); + }); + + it('merges context into reportError() calls automatically', async () => { + const provider = { ...minimalProvider, reportError: vi.fn() }; + loggerBase.setup(() => provider); + + loggerBase.setContext({ userId: 'u1', connectionId: 'c1' }); + loggerBase.reportError(new Error('oops')); + + await waitFor(() => { + expect(provider.reportError).toHaveBeenCalledWith( + expect.objectContaining({ message: 'oops' }), + expect.objectContaining({ userId: 'u1', connectionId: 'c1' }) + ); + }); + }); + + it('extra passed to log() takes precedence over context', async () => { + const provider = { ...minimalProvider, log: vi.fn() }; + loggerBase.setup(() => provider); + + loggerBase.setContext({ sessionId: 'from-context' }); + loggerBase.log('TestEvent', { sessionId: 'from-extra' }); + + await waitFor(() => { + expect(provider.log).toHaveBeenCalledWith( + 'TestEvent', + expect.objectContaining({ sessionId: 'from-extra' }) + ); + }); + }); + + it('clearContext() removes context from subsequent log() calls', async () => { + const provider = { ...minimalProvider, log: vi.fn() }; + loggerBase.setup(() => provider); + + loggerBase.setContext({ userId: 'u1' }); + loggerBase.clearContext(); + loggerBase.log('TestEvent'); + + await waitFor(() => { + expect(provider.log).toHaveBeenCalledWith('TestEvent', {}); + }); + }); + + it('setContext() merges with previously set context fields', async () => { + const provider = { ...minimalProvider, log: vi.fn() }; + loggerBase.setup(() => provider); + + loggerBase.setContext({ userId: 'u1' }); + loggerBase.setContext({ sessionId: 's1' }); + loggerBase.log('TestEvent'); + + await waitFor(() => { + expect(provider.log).toHaveBeenCalledWith( + 'TestEvent', + expect.objectContaining({ userId: 'u1', sessionId: 's1' }) + ); + }); + }); + }); + describe('setup with synchronous callback returning invalid result', () => { it.each([ ['null', () => null], diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/Logger.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/Logger.ts index d81d04f2..d245af20 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/Logger.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/Logger.ts @@ -43,10 +43,21 @@ export type LoggerProviderConfig = { [LoggerFeature.Log](event: string, extra?: Record): void; }; +/** + * Persistent context that is automatically merged into every log and reportError call. + */ +export type LogContext = { + userId?: string; + sessionId?: string; + connectionId?: string; + partnerId?: string; +}; + /** * Logger base class for error reporting and event logging. */ export class LoggerBase implements LoggerProviderConfig { + private readonly context: LogContext = {}; /** * Indicates whether the lack of a logger provider or one of its features has been acknowledged. */ @@ -112,6 +123,16 @@ export class LoggerBase implements LoggerProviderConfig { }); } + /** + * Resets the logger state, clearing the provider, any stored error, acknowledged features, and context. + */ + public reset() { + this.provider = null; + this.error = null; + this.acknowledged = Object.create(null); + this.clearContext(); + } + protected logLoggerEvent( feature: T, ...args: Parameters<(typeof this)[T]> @@ -192,6 +213,22 @@ export class LoggerBase implements LoggerProviderConfig { }; } + /** + * Sets persistent context fields that are automatically merged into every log and reportError call. + */ + public setContext(context: Partial): void { + Object.assign(this.context, context); + } + + /** + * Clears all persistent context (e.g. on session disconnect or user logout). + */ + public clearContext(): void { + (Object.keys(this.context) as Array).forEach((key) => { + delete this.context[key]; + }); + } + public group>(groupName: string, context?: T) { const groupId = crypto.randomUUID(); @@ -228,7 +265,7 @@ export class LoggerBase implements LoggerProviderConfig { } : error; - const extraRecord = extra ?? {}; + const extraRecord = { ...this.context, ...(extra ?? {}) }; void this.tryExecuteFeature(LoggerFeature.ReportError).then((feature) => feature?.(normalizedError, extraRecord) @@ -241,7 +278,8 @@ export class LoggerBase implements LoggerProviderConfig { * @param extra Additional data associated with the event. */ public log(event: string, extra: Record = {}) { - void this.tryExecuteFeature(LoggerFeature.Log).then((feature) => feature?.(event, extra)); + const merged = { ...this.context, ...extra }; + void this.tryExecuteFeature(LoggerFeature.Log).then((feature) => feature?.(event, merged)); } } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/index.ts index b84bdc04..5460039e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/index.ts @@ -1,3 +1,3 @@ export { LoggerBase } from './Logger'; -export type { LoggerProviderConfig } from './Logger'; +export type { LoggerProviderConfig, LogContext } from './Logger'; export { LoggerFeature, ColorsPerFeature, AnsiColors } from './Logger'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/ClientLogEvent/ClientLogEvent.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/ClientLogEvent/ClientLogEvent.schema.ts index 6885eeca..9c1574c7 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/ClientLogEvent/ClientLogEvent.schema.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/ClientLogEvent/ClientLogEvent.schema.ts @@ -19,6 +19,7 @@ export const ClientLogEventSchema = z.object({ sdkId: z.string().optional(), componentId: z.string().optional(), partnerId: z.string().optional(), + userId: z.string().optional(), logVersion: z.string().optional(), name: z.string().optional(), }); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/FacingMode.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/FacingMode.ts new file mode 100644 index 00000000..54c0f4f2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/FacingMode.ts @@ -0,0 +1,8 @@ +import { z } from 'zod'; +import { FacingMode } from '../types'; + +export const FacingModeSchema = z.enum([ + FacingMode.user, + FacingMode.environment, + FacingMode.unknown, +]); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/RoomName.schema.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/RoomName.schema.spec.ts new file mode 100644 index 00000000..1ca8d537 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/RoomName.schema.spec.ts @@ -0,0 +1,13 @@ +import { describe, it, expect } from 'vitest'; +import RoomNameSchema from './RoomName.schema'; + +describe('RoomNameSchema', () => { + it('should accept a valid room name', () => { + expect(RoomNameSchema.safeParse('my-room-123').success).toBe(true); + }); + + it('should reject an invalid room name', () => { + expect(RoomNameSchema.safeParse('').success).toBe(false); + expect(RoomNameSchema.safeParse('UPPERCASE').success).toBe(false); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/RoomName.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/RoomName.schema.ts new file mode 100644 index 00000000..12143bf2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/RoomName.schema.ts @@ -0,0 +1,8 @@ +import z from 'zod'; +import { isValidRoomName } from '../../assertions'; + +export const RoomNameSchema = z + .string() + .refine((val) => isValidRoomName(val), { message: 'Not a valid room name' }); + +export default RoomNameSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/index.ts new file mode 100644 index 00000000..ca680f36 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/index.ts @@ -0,0 +1 @@ +export * from './RoomName.schema'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/index.ts index 3b78e507..e727e2a1 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/index.ts @@ -1,3 +1,5 @@ +export * from './RoomName'; export * from './VonageAudioOutputDevice'; export * from './VonageDevice'; export * from './VonageDeviceKind'; +export * from './FacingMode'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/DecodedSessionId.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/DecodedSessionId.ts index f4a98edf..f6e8bd7d 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/DecodedSessionId.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/DecodedSessionId.ts @@ -8,9 +8,15 @@ export type DecodedSessionId = { /** The version of the session */ version: string; - /** The partner ID associated with the session */ + /** + * @deprecated Use applicationId instead. This value is the same as applicationId */ partnerId: string; + /* + * The application ID associated with the session. This is typically the same as the partner ID, but can be different in some cases. + */ + applicationId: string; + /** The location hint (IP address or region) used when the session was created for media routing */ location: string; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/types/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/DeepPartial.ts similarity index 80% rename from tutorials/vonage_video_react_app-feature-config/project/frontend/src/types/index.ts rename to tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/DeepPartial.ts index ac456c1e..01ddc778 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/types/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/DeepPartial.ts @@ -1,5 +1,3 @@ -export * from './room'; - export type DeepPartial = { [K in keyof T]?: T[K] extends object ? DeepPartial : T[K]; }; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/FacingMode.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/FacingMode.ts new file mode 100644 index 00000000..26e59658 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/FacingMode.ts @@ -0,0 +1,7 @@ +export enum FacingMode { + user = 'user', + environment = 'environment', + unknown = 'unknown', +} + +export default FacingMode; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/IsOptionalKey.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/IsOptionalKey.ts new file mode 100644 index 00000000..f91a4c8a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/IsOptionalKey.ts @@ -0,0 +1,10 @@ +export type IsOptionalKey = T extends unknown + ? K extends keyof T + ? // eslint-disable-next-line @typescript-eslint/no-empty-object-type + {} extends Pick + ? true + : false + : false + : never; + +export default IsOptionalKey; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/ObjectKeys.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/ObjectKeys.ts new file mode 100644 index 00000000..2249c08c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/ObjectKeys.ts @@ -0,0 +1,8 @@ +/** + * Like keyof, but only returns keys whose values are objects + */ +export type ObjectKeys = { + [K in keyof T]: T[K] extends object ? K : never; +}[keyof T]; + +export default ObjectKeys; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SameKeys.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SameKeys.ts new file mode 100644 index 00000000..28251ffe --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SameKeys.ts @@ -0,0 +1,5 @@ +export type SameKeys = { + [K in keyof T]?: unknown; +}; + +export default SameKeys; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionId.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionId.ts new file mode 100644 index 00000000..560086b6 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionId.ts @@ -0,0 +1,3 @@ +export type SessionId = `${string}_${string}` & { __brand: 'SessionId' }; + +export default SessionId; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionKey.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionKey.ts new file mode 100644 index 00000000..8cd7e214 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionKey.ts @@ -0,0 +1,5 @@ +export type SessionKey = `${string}.${string}.${string}` & { + __brand: 'SessionKey'; +}; + +export default SessionKey; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionKeyPayload.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionKeyPayload.ts new file mode 100644 index 00000000..456e23c1 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionKeyPayload.ts @@ -0,0 +1,6 @@ +export type SessionKeyPayload = { + sessionId: string; + roomName?: string | null | undefined; +}; + +export default SessionKeyPayload; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/VideoSessionDetails.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/VideoSessionDetails.ts new file mode 100644 index 00000000..95e681e8 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/VideoSessionDetails.ts @@ -0,0 +1,12 @@ +import DecodedSessionId from './DecodedSessionId'; +import { Prettify } from './Prettify'; + +export type VideoSessionDetails = Prettify< + DecodedSessionId & { + sessionKey: string; + sessionId: string; + roomName?: string | null | undefined; + } +>; + +export default VideoSessionDetails; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/VideoSessionDetailsWithToken.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/VideoSessionDetailsWithToken.ts new file mode 100644 index 00000000..f867d3e5 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/VideoSessionDetailsWithToken.ts @@ -0,0 +1,6 @@ +import { Prettify } from './Prettify'; +import VideoSessionDetails from './VideoSessionDetails'; + +export type VideoSessionDetailsWithToken = Prettify; + +export default VideoSessionDetailsWithToken; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/index.ts index a1f7d790..7b061db1 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/index.ts @@ -5,7 +5,17 @@ export { type ClientLogEvent, type SerializedError, } from '../schemas/ClientLogEvent'; -export * from './DecodedSessionId'; -export * from './Any'; -export * from './AnyFunction'; -export * from './KebabToCamel'; +export type * from './DecodedSessionId'; +export type * from './Any'; +export type * from './AnyFunction'; +export type * from './KebabToCamel'; +export type * from './ObjectKeys'; +export type * from './SessionId'; +export type * from './SameKeys'; +export type * from './IsOptionalKey'; +export type * from './SessionKeyPayload'; +export type * from './VideoSessionDetails'; +export type * from './VideoSessionDetailsWithToken'; +export type * from './SessionKey'; +export type * from './DeepPartial'; +export * from './FacingMode'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/index.ts index 2cd7cbc0..f5762b70 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/index.ts @@ -7,3 +7,5 @@ export { default as useMountEffect } from './useMountEffect'; export { default as useStableCallback } from './useStableCallback'; export { default as useStableRef } from './useStableRef'; export { default as useSuspenseMemo } from './useSuspenseMemo'; +export { default as useAnchorElement } from './useAnchorElement'; +export { default as useRenderCount } from './useRenderCount'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useAnchorElement/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useAnchorElement/index.ts new file mode 100644 index 00000000..4ed3cbd9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useAnchorElement/index.ts @@ -0,0 +1 @@ +export { default } from './useAnchorElement'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useAnchorElement/useAnchorElement.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useAnchorElement/useAnchorElement.ts new file mode 100644 index 00000000..73c6197d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useAnchorElement/useAnchorElement.ts @@ -0,0 +1,66 @@ +import { isFunction } from '../../assertions'; +import useMountEffect from '../useMountEffect'; + +type UseAnchorElementProps = { + /** + * A ref to the element that will be used as an anchor for the iframe. The iframe will be positioned and sized to match this element. + */ + anchorRef: React.RefObject; + + /** + * A function that return the element to anchor to. + */ + target: HTMLElement | null | (() => HTMLElement | null); + + /** + * Optional callback that will be called when the anchor element is captured by the anchor. + */ + onAttach?: () => void; + + /** + * Optional callback that will be called when the anchor element is released by the anchor. On unmount. + */ + onDetach?: () => void; +}; + +/** + * Anchors an element to the position and size of another element. + */ +const useAnchorElement = ({ anchorRef, target, onAttach, onDetach }: UseAnchorElementProps) => { + useMountEffect(() => { + const selector = isFunction(target) ? target : () => target; + + const elementToAnchor = selector(); + const anchorTo = anchorRef.current; + + if (!elementToAnchor || !anchorTo) return; + + onAttach?.(); + + let frameId: number; + + const update = () => { + const rect = anchorTo.getBoundingClientRect(); + + Object.assign(elementToAnchor.style, { + position: 'fixed', + top: `${rect.top}px`, + left: `${rect.left}px`, + width: `${rect.width}px`, + height: `${rect.height}px`, + zIndex: '10', + }); + + frameId = requestAnimationFrame(update); + }; + + update(); + + return () => { + onDetach?.(); + cancelAnimationFrame(frameId); + }; + }); +}; + +export default useAnchorElement; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/index.ts new file mode 100644 index 00000000..f6cb361b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/index.ts @@ -0,0 +1 @@ +export { default } from './useRenderCount'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/useRenderCount.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/useRenderCount.test.ts new file mode 100644 index 00000000..eb2c78e1 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/useRenderCount.test.ts @@ -0,0 +1,15 @@ +import { describe, it, expect } from 'vitest'; +import { renderHook } from '@testing-library/react'; +import useRenderCount from './'; + +describe('useRenderCount', () => { + it('should increment on each re-render', () => { + const { result, rerender } = renderHook(() => useRenderCount()); + + rerender(); + expect(result.current).toBe(2); + + rerender(); + expect(result.current).toBe(3); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/useRenderCount.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/useRenderCount.ts new file mode 100644 index 00000000..b6fbb541 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/useRenderCount.ts @@ -0,0 +1,7 @@ +import useAccumulator from '../useAccumulator'; + +function useRenderCount() { + return useAccumulator((count) => (count ?? 0) + 1, [{}]).current; +} + +export default useRenderCount; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useDisposableStableRef.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useDisposableStableRef.ts index 91dfe7c7..a8f8114d 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useDisposableStableRef.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useDisposableStableRef.ts @@ -1,6 +1,25 @@ -import { useMemo, useEffectEvent, useEffect } from 'react'; +import { useState, useEffectEvent, useEffect } from 'react'; import type { RefCreator, CleanupFunction } from '../useStableRef.types'; -import { stable_ref_unique_symbol } from '../useStableRef.types'; + +export const STABLE_REF_UNSAFE_RENDER_WARNING = [ + 'useStableRef:', + '', + 'Avoid creating values that require cleanup during render.', + 'React may run the render function multiple times and discard the result.', + 'Discarded renders do NOT run cleanup.', + 'This can lead to duplicated resources, memory leaks, or inconsistent state.', + '', + 'Safe:', + '- Do not create values that require cleanup during render.', + '', + 'Advanced (unsafe, use at your own risk):', + '- If you are 100% sure the value is pure (can be created multiple times and discarded without problems) and you need it during render, you can create the ref with an empty dependency array:', + ' const ref = useStableRef(() => src, [])', + '- and dispose it manually in an effect:', + ' useEffect(() => () => ref.current.dispose(), [])', + '- WARNING:', + ' React does not guarantee cleanup will run for discarded renders, so you may end up with duplicated resources or memory leaks.', +].join('\n'); /** * Disposable stable ref, not available during render phase. @@ -14,8 +33,8 @@ function useDisposableStableRef({ cleanup: CleanupFunction; dependencies: React.DependencyList; }): React.RefObject { - const ref = useMemo(() => { - let current = stable_ref_unique_symbol as T | typeof stable_ref_unique_symbol; + const [ref] = useState(() => { + let current = undefined as T; const wrapper = { current, @@ -26,7 +45,7 @@ function useDisposableStableRef({ current: { get: () => { if (!wrapper.isInitialized) { - throw new Error('Stable ref is not available during render phase.'); + throw new Error(STABLE_REF_UNSAFE_RENDER_WARNING); } return current; @@ -38,22 +57,23 @@ function useDisposableStableRef({ }); return wrapper; - }, []); - - const stableBuilder = useEffectEvent(builder); - const stableCleanup = useEffectEvent(cleanup); + }); - useEffect(() => { - const current = stableBuilder(); + const stableBuilder = useEffectEvent(() => { + const current = builder(); ref.current = current; ref.isInitialized = true; return () => { - stableCleanup?.(current); + cleanup?.(current); }; + }); + + useEffect(() => { + return stableBuilder(); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [ref, ...dependencies]); + }, dependencies); return ref as React.RefObject; } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useNonDisposableStableRef.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useNonDisposableStableRef.ts index 2b380f83..6a0c8a9f 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useNonDisposableStableRef.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useNonDisposableStableRef.ts @@ -1,4 +1,4 @@ -import { useMemo } from 'react'; +import { useState } from 'react'; import type { RefCreator } from '../useStableRef.types'; import { stable_ref_unique_symbol } from '../useStableRef.types'; import shallowCompare from 'react-global-state-hooks/shallowCompare'; @@ -12,13 +12,10 @@ function useNonDisposableStableRef( builder: RefCreator, dependencies: React.DependencyList ): React.RefObject { - const ref = useMemo( - () => ({ - current: undefined as T | undefined, - dependencies: undefined as React.DependencyList | undefined, - }), - [] - ); + const [ref] = useState(() => ({ + current: undefined as T | undefined, + dependencies: undefined as React.DependencyList | undefined, + })); const isFirstRun = ref.current === stable_ref_unique_symbol; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useSimpleRef.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useSimpleRef.ts index 057a7d86..34786055 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useSimpleRef.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useSimpleRef.ts @@ -1,10 +1,13 @@ -import { useRef } from 'react'; +import { useState } from 'react'; /** * Simple stable ref hook that always updates the ref's current value. */ function useSimpleRef(value: T): React.RefObject { - const ref = useRef(value); + const [ref] = useState(() => ({ + current: value, + })); + ref.current = value; return ref; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/useStableRef.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/useStableRef.test.ts index 94eb2327..99a53291 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/useStableRef.test.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/useStableRef.test.ts @@ -1,6 +1,7 @@ import { describe, it, expect, vi } from 'vitest'; import { renderHook } from '@testing-library/react'; import useStableRef from './'; +import { STABLE_REF_UNSAFE_RENDER_WARNING } from './hooks/useDisposableStableRef'; describe('useStableRef', () => { describe('Simple ref (value only)', () => { @@ -108,7 +109,7 @@ describe('useStableRef', () => { // Trying to access during render return ref.current; }); - }).toThrow('Stable ref is not available during render phase.'); + }).toThrow(STABLE_REF_UNSAFE_RENDER_WARNING); }); it('should call cleanup when dependencies change', () => { diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/schemas/MediaDeviceInfo/MediaDeviceInfo.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/schemas/MediaDeviceInfo/MediaDeviceInfo.schema.ts index f19e65a9..b8b6e6fc 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/schemas/MediaDeviceInfo/MediaDeviceInfo.schema.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/schemas/MediaDeviceInfo/MediaDeviceInfo.schema.ts @@ -1,7 +1,14 @@ import z from 'zod'; import DeviceKindSchema from '../DeviceKind'; +import { FacingMode } from '@common/types'; +import { FacingModeSchema } from '@common/schemas'; -export type MediaDeviceInfoJSON = Omit; +export type MediaDeviceInfoJSON = Omit & { + /** + * FaceMode inferred from the device label. + */ + inferredFacingMode?: FacingMode | null; +}; /** * Native browser MediaDeviceInfo schema @@ -11,6 +18,7 @@ export const MediaDeviceInfoJSONSchema: z.ZodType = z.loose kind: DeviceKindSchema, label: z.string(), groupId: z.string(), + inferredFacingMode: FacingModeSchema.nullable().optional(), }); export function assertMediaDeviceInfo(data: unknown): asserts data is MediaDeviceInfoJSON { diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/assertVonageSessionId.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/assertVonageSessionId.test.ts deleted file mode 100644 index 12e8b2f1..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/assertVonageSessionId.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { VALID_SESSION_ID, INVALID_SESSION_IDS } from '@common-test/fixtures'; -import assertVonageSessionId from '.'; - -describe('assertVonageSessionId', () => { - it('should not throw for a valid session ID', () => { - expect(() => assertVonageSessionId(VALID_SESSION_ID)).not.toThrow(); - }); - - it('should throw for an empty string', () => { - expect(() => assertVonageSessionId(INVALID_SESSION_IDS.empty)).toThrow( - 'Invalid sessionId format' - ); - }); - - it('should throw for a session ID without underscore separator', () => { - expect(() => assertVonageSessionId(INVALID_SESSION_IDS.noUnderscore)).toThrow( - 'Invalid sessionId format' - ); - }); - - it('should throw for a session ID with multiple underscores', () => { - expect(() => assertVonageSessionId(INVALID_SESSION_IDS.multipleUnderscores)).toThrow( - 'Invalid sessionId format' - ); - }); - - it('should throw for a session ID with too few decoded fields', () => { - expect(() => assertVonageSessionId(INVALID_SESSION_IDS.tooFewFields)).toThrow( - 'Invalid sessionId format' - ); - }); - - it('should throw for null', () => { - expect(() => assertVonageSessionId(null)).toThrow(); - }); - - it('should throw for undefined', () => { - expect(() => assertVonageSessionId(undefined)).toThrow(); - }); -}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/assertVonageSessionId.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/assertVonageSessionId.ts deleted file mode 100644 index dd0f4134..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/assertVonageSessionId.ts +++ /dev/null @@ -1,7 +0,0 @@ -import decodeSessionId from '../../helpers/decodeSessionId'; - -function assertVonageSessionId(value: unknown): asserts value is string { - decodeSessionId(value as string); -} - -export default assertVonageSessionId; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/index.ts deleted file mode 100644 index cd13b437..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './assertVonageSessionId'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/index.ts index 951a4950..2bce812f 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/index.ts @@ -1,2 +1 @@ export * from '../../src/assertions'; -export { default as assertVonageSessionId } from './assertVonageSessionId'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/helpers/decodeSessionId/decodeSessionId.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/helpers/decodeSessionId/decodeSessionId.ts deleted file mode 100644 index 2b59af69..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/helpers/decodeSessionId/decodeSessionId.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { DecodedSessionId } from '../../../src/types/DecodedSessionId'; -import { StringDecoder } from 'node:string_decoder'; - -/** - * Decodes an OpenTok sessionId and returns an object with its values - * @param {String} sessionId - * @returns {Object} - * @throws {Error} If sessionId format is invalid - */ -const decodeSessionId = (sessionId: string): DecodedSessionId => { - const splittedSession = (sessionId || '').split('_'); - if (splittedSession.length !== 2) { - throw new Error('Invalid sessionId format'); - } - - const info = splittedSession[1]; - const buf = Buffer.from(info, 'base64'); - const decoder = new StringDecoder('utf8'); - const decodedSession = decoder.write(buf); - const sessionFields = decodedSession.split('~'); - - if (sessionFields.length < 4) { - throw new Error('Invalid sessionId format'); - } - - return { - p2p: sessionFields.includes('P'), - autoArchive: sessionFields.includes('A'), - version: sessionFields[0], - partnerId: sessionFields[1], - location: sessionFields[2], - date: sessionFields[3], - }; -}; - -export default decodeSessionId; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/helpers/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/helpers/index.ts index df6f5eba..2fae8e1d 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/helpers/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/helpers/index.ts @@ -1,2 +1 @@ export * from '../../src/helpers'; -export { default as decodeSessionId } from './decodeSessionId'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveLayout.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveLayout.schema.ts new file mode 100644 index 00000000..ecbe576d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveLayout.schema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; +import type { ArchiveLayout } from '@vonage/video'; +import LayoutTypeSchema from './LayoutType.schema'; + +export const ArchiveLayoutSchema: z.ZodType = z.object({ + type: LayoutTypeSchema, + stylesheet: z.string().optional(), + screenshareType: z.string().optional(), +}); + +export default ArchiveLayoutSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/ArchiveMode.schema.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/ArchiveMode.schema.spec.ts new file mode 100644 index 00000000..a49ecb52 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/ArchiveMode.schema.spec.ts @@ -0,0 +1,13 @@ +import { describe, it, expect } from 'vitest'; +import ArchiveModeSchema from './ArchiveMode.schema'; + +describe('ArchiveModeSchema', () => { + it('should accept valid archive modes', () => { + expect(ArchiveModeSchema.safeParse('manual').success).toBe(true); + expect(ArchiveModeSchema.safeParse('always').success).toBe(true); + }); + + it('should reject an invalid archive mode', () => { + expect(ArchiveModeSchema.safeParse('invalid').success).toBe(false); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/ArchiveMode.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/ArchiveMode.schema.ts new file mode 100644 index 00000000..ec84baf2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/ArchiveMode.schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod'; +import { ArchiveMode } from '@vonage/video'; + +export const ArchiveModeSchema: z.ZodType = z.enum(ArchiveMode); + +export default ArchiveModeSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/index.ts new file mode 100644 index 00000000..d1e09572 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/index.ts @@ -0,0 +1 @@ +export * from './ArchiveMode.schema'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptions.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptions.schema.ts new file mode 100644 index 00000000..5f86cd7d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptions.schema.ts @@ -0,0 +1,19 @@ +import { z } from 'zod'; +import type { ArchiveOptions } from '@vonage/video'; +import ArchiveOptionsWithMaxBitrateSchema from './ArchiveOptionsWithMaxBitrate.schema'; +import ArchiveOptionsWithQuantizationParameterSchema from './ArchiveOptionsWithQuantizationParameter.schema'; +import ArchiveWithTranscriptionSchema from './ArchiveWithTranscription.schema'; +import ArchiveWithoutTranscriptionSchema from './ArchiveWithoutTranscription.schema'; + +export const ArchiveOptionsSchema: z.ZodType = z.union([ + ArchiveOptionsWithMaxBitrateSchema, + ArchiveOptionsWithMaxBitrateSchema.and(ArchiveWithTranscriptionSchema), + ArchiveOptionsWithMaxBitrateSchema.and(ArchiveWithoutTranscriptionSchema), + ArchiveOptionsWithQuantizationParameterSchema, + ArchiveOptionsWithQuantizationParameterSchema.and(ArchiveWithTranscriptionSchema), + ArchiveOptionsWithQuantizationParameterSchema.and(ArchiveWithoutTranscriptionSchema), + ArchiveWithTranscriptionSchema, + ArchiveWithoutTranscriptionSchema, +]); + +export default ArchiveOptionsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptionsWithMaxBitrate.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptionsWithMaxBitrate.schema.ts new file mode 100644 index 00000000..834d2595 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptionsWithMaxBitrate.schema.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; +import BaseArchiveOptionsSchema from './BaseArchiveOptions.schema'; + +export const ArchiveOptionsWithMaxBitrateSchema = BaseArchiveOptionsSchema.extend({ + maxBitrate: z.number().optional(), +}); + +export type ArchiveOptionsWithMaxBitrate = z.infer; + +export default ArchiveOptionsWithMaxBitrateSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptionsWithQuantizationParameter.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptionsWithQuantizationParameter.schema.ts new file mode 100644 index 00000000..d6d7e051 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptionsWithQuantizationParameter.schema.ts @@ -0,0 +1,12 @@ +import { z } from 'zod'; +import BaseArchiveOptionsSchema from './BaseArchiveOptions.schema'; + +export const ArchiveOptionsWithQuantizationParameterSchema = BaseArchiveOptionsSchema.extend({ + quantizationParameter: z.number().optional(), +}); + +export type ArchiveOptionsWithQuantizationParameter = z.infer< + typeof ArchiveOptionsWithQuantizationParameterSchema +>; + +export default ArchiveOptionsWithQuantizationParameterSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOutputMode.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOutputMode.schema.ts new file mode 100644 index 00000000..06a6c159 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOutputMode.schema.ts @@ -0,0 +1,7 @@ +import { z } from 'zod'; +import { ArchiveOutputMode } from '@vonage/video'; + +export const ArchiveOutputModeSchema: z.ZodType = + z.nativeEnum(ArchiveOutputMode); + +export default ArchiveOutputModeSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveWithTranscription.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveWithTranscription.schema.ts new file mode 100644 index 00000000..c5a2a8de --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveWithTranscription.schema.ts @@ -0,0 +1,14 @@ +import { z } from 'zod'; +import BaseArchiveOptionsSchema from './BaseArchiveOptions.schema'; + +export const ArchiveWithTranscriptionSchema = BaseArchiveOptionsSchema.extend({ + hasTranscription: z.literal(true), + transcriptionProperties: z.object({ + primaryLanguageCode: z.string().optional(), + hasSummary: z.boolean().optional(), + }), +}); + +export type ArchiveWithTranscription = z.infer; + +export default ArchiveWithTranscriptionSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveWithoutTranscription.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveWithoutTranscription.schema.ts new file mode 100644 index 00000000..41c05c3c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveWithoutTranscription.schema.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; +import BaseArchiveOptionsSchema from './BaseArchiveOptions.schema'; + +export const ArchiveWithoutTranscriptionSchema = BaseArchiveOptionsSchema.extend({ + hasTranscription: z.literal(false).optional(), +}).omit({ transcriptionProperties: true }); + +export type ArchiveWithoutTranscription = z.infer; + +export default ArchiveWithoutTranscriptionSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/BaseArchiveOptions.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/BaseArchiveOptions.schema.ts new file mode 100644 index 00000000..ae2ad4b4 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/BaseArchiveOptions.schema.ts @@ -0,0 +1,22 @@ +import { z } from 'zod'; +import ArchiveLayoutSchema from './ArchiveLayout.schema'; +import ArchiveOutputModeSchema from './ArchiveOutputMode.schema'; +import ResolutionSchema from './Resolution.schema'; +import StreamModeSchema from './StreamMode.schema'; +import TranscriptionPropertiesSchema from './TranscriptionProperties.schema'; + +export const BaseArchiveOptionsSchema = z.object({ + hasAudio: z.boolean().optional(), + hasVideo: z.boolean().optional(), + layout: ArchiveLayoutSchema.optional(), + name: z.string().optional(), + outputMode: ArchiveOutputModeSchema.optional(), + resolution: ResolutionSchema.optional(), + streamMode: StreamModeSchema.optional(), + hasTranscription: z.boolean().optional(), + transcriptionProperties: TranscriptionPropertiesSchema.optional(), +}); + +export type BaseArchiveOptions = z.infer; + +export default BaseArchiveOptionsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/LayoutType.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/LayoutType.schema.ts new file mode 100644 index 00000000..b283bef5 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/LayoutType.schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod'; +import { LayoutType } from '@vonage/video'; + +export const LayoutTypeSchema: z.ZodType = z.nativeEnum(LayoutType); + +export default LayoutTypeSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/MediaMode.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/MediaMode.schema.ts new file mode 100644 index 00000000..1afe0429 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/MediaMode.schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod'; +import { MediaMode } from '@vonage/video'; + +export const MediaModeSchema: z.ZodType = z.nativeEnum(MediaMode); + +export default MediaModeSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/Resolution.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/Resolution.schema.ts new file mode 100644 index 00000000..88dd065a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/Resolution.schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod'; +import { Resolution } from '@vonage/video'; + +export const ResolutionSchema: z.ZodType = z.nativeEnum(Resolution); + +export default ResolutionSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/SessionId.schema.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/SessionId.schema.spec.ts new file mode 100644 index 00000000..56125470 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/SessionId.schema.spec.ts @@ -0,0 +1,16 @@ +import { describe, it, expect } from 'vitest'; +import SessionIdSchema from './SessionId.schema'; + +describe('SessionIdSchema', () => { + it('should accept a valid session ID', () => { + expect( + SessionIdSchema.safeParse( + '1_MX4xMjM0NTY3OH4-VGh1IEZlYiAyNyAwODozMjozNCBQU1QgMjAyMH4wLjI0NDYxMjE' + ).success + ).toBe(true); + }); + + it('should reject an invalid session ID', () => { + expect(SessionIdSchema.safeParse('not-a-session-id').success).toBe(false); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/SessionId.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/SessionId.schema.ts new file mode 100644 index 00000000..9fcb186c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/SessionId.schema.ts @@ -0,0 +1,9 @@ +import z from 'zod'; +import { isValidSessionId } from '../../../src/assertions'; + +export const SessionIdSchema = z + .string() + .refine((val) => isValidSessionId(val), { message: 'Not a valid SessionId' }) + .transform((val) => val as string); + +export default SessionIdSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/index.ts new file mode 100644 index 00000000..ca4df1d1 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/index.ts @@ -0,0 +1 @@ +export * from './SessionId.schema'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/SessionKey.schema.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/SessionKey.schema.spec.ts new file mode 100644 index 00000000..fd8a12ed --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/SessionKey.schema.spec.ts @@ -0,0 +1,15 @@ +import { describe, it, expect } from 'vitest'; +import SessionKeySchema from './SessionKey.schema'; + +const validSessionKey = + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZXNzaW9uSWQiOiIxX01YNWtNVEkxWWpGbU1DMWtZMkl5TFRRM05EY3RZamxrWVMxa09ESTVOMkk0WkdFME9UZC1makUzTnpVM09UWXhOVGd3TWpkLWFqaElOU3RYZEV4VU5sYzBZbE5vZGs5UVNYVllVRmRDZm41LSIsInJvb21OYW1lIjoiYXdlc29tZS1yb29tLW5hbWUiLCJpYXQiOjE3NzU5NjMzMjh9.QcNVXp6gatPTV82IJa8VgDG6rOLBkFjU3r7j_BcxM-c'; + +describe('SessionKeySchema', () => { + it('should accept a valid session key', () => { + expect(SessionKeySchema.safeParse(validSessionKey).success).toBe(true); + }); + + it('should reject an invalid session key', () => { + expect(SessionKeySchema.safeParse('not-a-session-key').success).toBe(false); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/SessionKey.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/SessionKey.schema.ts new file mode 100644 index 00000000..eb9adad0 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/SessionKey.schema.ts @@ -0,0 +1,9 @@ +import z from 'zod'; +import { isValidSessionKey } from '../../../src/assertions'; + +export const SessionKeySchema = z + .string() + .refine((val) => isValidSessionKey(val), { message: 'Not a valid SessionKey' }) + .transform((val) => val); + +export default SessionKeySchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/index.ts new file mode 100644 index 00000000..0d0a7fdb --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/index.ts @@ -0,0 +1 @@ +export * from './SessionKey.schema'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/StreamMode.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/StreamMode.schema.ts new file mode 100644 index 00000000..af09cadf --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/StreamMode.schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod'; +import { StreamMode } from '@vonage/video'; + +export const StreamModeSchema: z.ZodType = z.nativeEnum(StreamMode); + +export default StreamModeSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/TranscriptionProperties.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/TranscriptionProperties.schema.ts new file mode 100644 index 00000000..0a4dc9fb --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/TranscriptionProperties.schema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; + +export const TranscriptionPropertiesSchema = z.object({ + primaryLanguageCode: z.string().optional(), + hasSummary: z.boolean().optional(), + hasTranscription: z.boolean().optional(), +}); + +export type TranscriptionProperties = z.infer; + +export default TranscriptionPropertiesSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/index.ts index 9897c5d4..ff44f78e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/index.ts @@ -1 +1,17 @@ export * from '../../src/schemas'; +export * from './SessionId'; +export * from './SessionKey'; +export * from './LayoutType.schema'; +export * from './ArchiveOutputMode.schema'; +export * from './MediaMode.schema'; +export * from './ArchiveMode'; +export * from './Resolution.schema'; +export * from './StreamMode.schema'; +export * from './ArchiveLayout.schema'; +export * from './TranscriptionProperties.schema'; +export * from './BaseArchiveOptions.schema'; +export * from './ArchiveOptionsWithMaxBitrate.schema'; +export * from './ArchiveOptionsWithQuantizationParameter.schema'; +export * from './ArchiveWithTranscription.schema'; +export * from './ArchiveWithoutTranscription.schema'; +export * from './ArchiveOptions.schema'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/types/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/types/index.ts index df511476..af19d1e8 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/types/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/types/index.ts @@ -1 +1,8 @@ export * from '../../src/types'; + +export type { TranscriptionProperties } from '../schemas/TranscriptionProperties.schema'; +export type { BaseArchiveOptions } from '../schemas/BaseArchiveOptions.schema'; +export type { ArchiveOptionsWithMaxBitrate } from '../schemas/ArchiveOptionsWithMaxBitrate.schema'; +export type { ArchiveOptionsWithQuantizationParameter } from '../schemas/ArchiveOptionsWithQuantizationParameter.schema'; +export type { ArchiveWithTranscription } from '../schemas/ArchiveWithTranscription.schema'; +export type { ArchiveWithoutTranscription } from '../schemas/ArchiveWithoutTranscription.schema'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/test/helpers/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/test/helpers/index.ts index 3ce2a0cf..b529436a 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/test/helpers/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/test/helpers/index.ts @@ -1,2 +1,3 @@ export { default as makeGenericMock } from './makeGenericMock'; export { default as setupPartialMock } from './setupPartialMock'; +export { default as mockModule } from './mockModule'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/test/helpers/setupPartialMock.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/test/helpers/setupPartialMock.ts index c8fe04e3..ef49dd8c 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/test/helpers/setupPartialMock.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/test/helpers/setupPartialMock.ts @@ -37,7 +37,16 @@ function setupPartialMock( entries.forEach((key) => { const value = source[key as keyof T]; const currentValue = target[key as keyof T]; - const desc = Object.getOwnPropertyDescriptor(target, key); + + const desc = (() => { + const desc = Object.getOwnPropertyDescriptor(target, key); + if (desc) return desc; + + const proto = Object.getPrototypeOf(target); + if (!proto) return undefined; + + return Object.getOwnPropertyDescriptor(proto, key); + })(); // trying to mock or override something that does not exist on the target if (!desc) { diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/environment/helpers/setupMuiMaterialStylesMock.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/environment/helpers/setupMuiMaterialStylesMock.ts new file mode 100644 index 00000000..f3a8befc --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/environment/helpers/setupMuiMaterialStylesMock.ts @@ -0,0 +1,30 @@ +import { isRecord } from '@common/assertions'; +import { vi } from 'vitest'; + +vi.mock('@mui/material/styles', async (importOriginal) => { + const actual = await importOriginal(); + + function createTheme(...args: Parameters) { + const [themeOptions, ...rest] = args; + + const sanitizedThemeOptions = (() => { + const { cssVariables } = themeOptions || {}; + + if (isRecord(cssVariables) && cssVariables.colorSchemeSelector === ':host(.%s)') { + return { + ...themeOptions, + cssVariables: true, + }; + } + + return themeOptions; + })(); + + return actual.createTheme(sanitizedThemeOptions, ...rest); + } + + return { + ...actual, + createTheme, + }; +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/fixtures/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/fixtures/index.ts index fbd69804..7c896a39 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/fixtures/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/fixtures/index.ts @@ -1,5 +1,9 @@ export * from '../../test/fixtures'; -export { default as makeMediaDeviceInfos } from './makeMediaDeviceInfos'; +export { + default as makeMediaDeviceInfos, + frontCameraId, + rearCameraId, +} from './makeMediaDeviceInfos'; export { default as mockPlatformModule } from './mockPlatformModule'; export { default as makeWindowNavigatorMock } from './makeWindowNavigatorMock'; export { default as makeMediaStreamMock } from './makeMediaStreamMock'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/fixtures/makeMediaDeviceInfos.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/fixtures/makeMediaDeviceInfos.ts index ed461c9d..b8258c44 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/fixtures/makeMediaDeviceInfos.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/fixtures/makeMediaDeviceInfos.ts @@ -1,8 +1,11 @@ +export const frontCameraId = 'video-input-1'; +export const rearCameraId = 'video-input-2'; + /** * Some media device info fixtures for testing purposes. * Do not add logic here. */ -const makeMediaDeviceInfos = () => +const makeMediaDeviceInfos = (): MediaDeviceInfo[] => [ { deviceId: 'audio-input-1', @@ -41,26 +44,26 @@ const makeMediaDeviceInfos = () => }), }, { - deviceId: 'video-input-1', + deviceId: frontCameraId, kind: 'videoinput', - label: 'Default Camera', + label: 'Front Camera', groupId: 'group-2', toJSON: () => ({ - deviceId: 'video-input-1', + deviceId: frontCameraId, kind: 'videoinput' as MediaDeviceKind, - label: 'Default Camera', + label: 'Front Camera', groupId: 'group-2', }), }, { - deviceId: 'video-input-2', + deviceId: rearCameraId, kind: 'videoinput', - label: 'USB Webcam', + label: 'Back Camera', groupId: 'group-6', toJSON: () => ({ - deviceId: 'video-input-2', + deviceId: rearCameraId, kind: 'videoinput' as MediaDeviceKind, - label: 'USB Webcam', + label: 'Back Camera', groupId: 'group-6', }), }, diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/index.ts new file mode 100644 index 00000000..77bb8d87 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/index.ts @@ -0,0 +1,3 @@ +export { default as mockVideoModule } from './mockVideoModule'; +export { default as mockAuthModule } from './mockAuthModule'; +export { default as waitForEvent } from './waitForEvent'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/mockAuthModule.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/mockAuthModule.ts new file mode 100644 index 00000000..ccf62e77 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/mockAuthModule.ts @@ -0,0 +1,67 @@ +import { type Mockable, SPY_MARK } from '@common/types/Mockable'; +import type * as module from '@vonage/auth'; +import { vi } from 'vitest'; +import { isFunction } from '@common/assertions'; +import { mockModule, setupPartialMock } from '@common-test/helpers'; + +type Module = typeof module; + +type AuthInstance = InstanceType; + +export type AuthMock = Partial< + Omit, 'Auth'> & { + Auth?: + | Mockable + | ((args: { + instance: AuthInstance; + spyOn: (mocks: Mockable) => void; + }) => void); + } +>; + +/** + * @example + * ```ts + * vi.mock('@vonage/auth', async () => { + * const actual = await vi.importActual('@vonage/auth'); + * + * return mockAuthModule(actual, { + * Auth: { + * getQueryParams: { foo: 'bar' } + * }, + * }); + * }); + * ``` + */ +const mockAuthModule = >( + actual: Module, + mock: T | ((spy: typeof SPY_MARK) => T) +): Module => { + const mock$ = (isFunction(mock) ? mock(SPY_MARK) : mock) as AuthMock; + const { Auth, ...rest } = mock$; + + const Auth$ = (() => { + if (!mock$.Auth) return actual.Auth; + + const OriginalAuth = actual.Auth; + + return vi.fn((...args: ConstructorParameters) => { + const instance = new OriginalAuth(...args); + const spyOn = (mocks: Mockable) => { + setupPartialMock('Auth instance', instance, mocks); + }; + + if (!isFunction(mock$.Auth)) { + return spyOn(Auth as Mockable); + } + + mock$.Auth({ instance, spyOn }); + + return instance; + }); + })(); + + return mockModule({ ...actual, Auth: Auth$ } as Module, rest); +}; + +export default mockAuthModule; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/mockVideoModule.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/mockVideoModule.ts new file mode 100644 index 00000000..2a4ee984 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/mockVideoModule.ts @@ -0,0 +1,70 @@ +import { type Mockable, SPY_MARK } from '@common/types/Mockable'; +import type * as module from '@vonage/video'; +import { vi } from 'vitest'; +import { isFunction } from '@common/assertions'; +import { mockModule, setupPartialMock } from '@common-test/helpers'; +import type { Any } from '@common/types'; + +type Module = typeof module; + +type VideoInstance = InstanceType; + +export type VideoMock = Partial< + Omit, 'Video'> & { + Video?: + | Mockable + | ((args: { + instance: VideoInstance; + spyOn: (mocks: Mockable) => void; + }) => void); + } +>; + +/** + * @example + * ```ts + * vi.mock('@vonage/video', async () => { + * const actual = await vi.importActual('@vonage/video'); + * + * return mockVideoModule(actual, { + * Video: { + * createSession: { sessionId: 'mock-session-id' }, + * generateClientToken: 'mock-token', + * }, + * }); + * }); + * ``` + */ +const mockVideoModule = ( + actual: Any, + mock: T | ((spy: typeof SPY_MARK) => T) +): Module => { + const actual$ = actual as Module; + const mock$ = (isFunction(mock) ? mock(SPY_MARK) : mock) as VideoMock; + const { Video, ...rest } = mock$; + + const Video$ = (() => { + if (!mock$.Video) return actual$.Video; + + const OriginalVideo = actual$.Video; + + return vi.fn((...args: ConstructorParameters) => { + const instance = new OriginalVideo(...args); + const spyOn = (mocks: Mockable) => { + setupPartialMock('Video instance', instance, mocks); + }; + + if (!isFunction(mock$.Video)) { + return spyOn(Video as Mockable); + } + + mock$.Video({ instance, spyOn }); + + return instance; + }); + })(); + + return mockModule({ ...actual$, Video: Video$ } as Module, rest); +}; + +export default mockVideoModule; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/waitForEvent.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/waitForEvent.ts new file mode 100644 index 00000000..b329c199 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/waitForEvent.ts @@ -0,0 +1,30 @@ +import { EventEmitter } from 'node:events'; +import defer from '@common/execution/defer'; + +/** + * Waits for a specific event to be emitted from an event emitter. + * Optionally, provide a spy function to be called when the event occurs. + * @param {EventEmitter} eventEmitter - The event emitter to listen to. + * @param {string} event - The name of the event to wait for. + * @param {(...args: any[]) => void | undefined} eventSpy - An optional callback that will be invoked with the event arguments when the event is emitted. + * @returns {Promise} - A promise that resolves if the event is dispatched. + */ +const waitForEvent = async ( + eventEmitter: EventEmitter, + event: string, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + eventSpy?: (...args: any[]) => void +): Promise => { + const { promise, resolve } = defer(); + const handler = (...args: unknown[]) => { + if (eventSpy) { + eventSpy(...args); + } + eventEmitter.off(event, handler); + resolve(); + }; + eventEmitter.on(event, handler); + await promise; +}; + +export default waitForEvent; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/index.ts new file mode 100644 index 00000000..c5f595cf --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/index.ts @@ -0,0 +1 @@ +export * from './helpers'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/tsconfig.json b/tutorials/vonage_video_react_app-feature-config/project/libs/common/tsconfig.json index 843ddea1..dcaaa885 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/tsconfig.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.base.json", "files": [], - "include": ["eslint.config.mjs"], + "include": ["eslint.config.mjs", "./test/**/*", "./testBrowser/**/*", "./testNode/**/*"], "references": [{ "path": "./tsconfig.lib.json" }, { "path": "./tsconfig.spec.json" }], "compilerOptions": { "rootDir": "..", @@ -17,7 +17,9 @@ "@common-test": ["./test"], "@common-test/*": ["./test/*"], "@web-test": ["./testBrowser"], - "@web-test/*": ["./testBrowser/*"] + "@web-test/*": ["./testBrowser/*"], + "@node-test": ["./testNode"], + "@node-test/*": ["./testNode/*"] }, "composite": true, "lib": ["DOM", "DOM.Iterable", "ESNext"] diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/tsconfig.lib.json b/tutorials/vonage_video_react_app-feature-config/project/libs/common/tsconfig.lib.json index 497e9207..45e2250f 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/tsconfig.lib.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/tsconfig.lib.json @@ -11,13 +11,15 @@ "include": [ "testBrowser/**/*.tsx", "testBrowser/**/*.ts", + "testNode/**/*.ts", "test/**/*.tsx", "test/**/*.ts", "srcNode/**/*.ts", "srcBrowser/**/*.tsx", "srcBrowser/**/*.ts", "src/**/*.tsx", - "src/**/*.ts" + "src/**/*.ts", + "src/types/FacingMode.ts" ], "exclude": ["**/*.spec.*", "**/*.test.*"] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/vite.config.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/vite.config.ts index f4603a77..44ee009d 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/vite.config.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/vite.config.ts @@ -16,6 +16,7 @@ export default defineConfig(() => ({ '@common': path.resolve(__dirname, './src'), '@common-test': path.resolve(__dirname, './test'), '@web-test': path.resolve(__dirname, './testBrowser'), + '@node-test': path.resolve(__dirname, './testNode'), '@web': path.resolve(__dirname, './srcBrowser'), '@node': path.resolve(__dirname, './srcNode'), }, @@ -58,7 +59,7 @@ export default defineConfig(() => ({ provider: 'v8' as const, reporter: ['text', 'lcov'], include: ['src/**/*.{ts,tsx}', 'srcBrowser/**/*.{ts,tsx}', 'srcNode/**/*.{ts,tsx}'], - exclude: ['test/**', 'testBrowser/**', '**/index.ts'], + exclude: ['test/**', 'testBrowser/**', 'testNode/**', '**/index.ts'], }, }, })); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/ApplicationClientError.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/ApplicationClientError.test.ts new file mode 100644 index 00000000..73008bbd --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/ApplicationClientError.test.ts @@ -0,0 +1,29 @@ +import { describe, it, expect } from 'vitest'; +import ApplicationClientError from './ApplicationClientError'; +import { StatusCode } from 'status-code-enum'; + +describe('ApplicationClientError', () => { + it('should create an instance with the correct properties', () => { + const error = new ApplicationClientError({ + src: { + type: 'server_error', + message: 'Invalid credentials', + fallbackMessage: 'Please check your input', + statusCode: StatusCode.ClientErrorBadRequest, + }, + fallbackConfig: { + fallbackMessage: 'Fallback', + }, + }); + + expect(error.type).toBe('server_error'); + expect(error.message).toBe('Invalid credentials'); + expect(error.fallbackMessage).toBe('Invalid credentials'); + + const exported = error.exportSafely(); + + expect(exported.message).toBe('Invalid credentials'); + expect(exported.type).toBe('server_error'); + expect(exported.statusCode).toBe(StatusCode.ClientErrorBadRequest); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/ApplicationClientError.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/ApplicationClientError.ts new file mode 100644 index 00000000..2a4072dc --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/ApplicationClientError.ts @@ -0,0 +1,45 @@ +import ApplicationError from '@common/errors/ApplicationError'; +import type ClientErrorFallbackConfig from './types/ClientErrorFallbackConfig'; +import { isErrorLike } from '@common/assertions'; + +class ApplicationClientError extends ApplicationError { + public override type: string = 'error'; + + constructor({ + src, + fallbackConfig, + }: { + src: unknown; + fallbackConfig: ClientErrorFallbackConfig; + }) { + const clientDefaults = { + statusCode: -1, + message: 'Unexpected error occurred.', + }; + + super({ + src, + fallbackConfig: { + ...clientDefaults, + ...fallbackConfig, + }, + }); + + this.type = (() => { + if (!isErrorLike(src)) return this.fallbackConfig.type ?? this.type; + return (src as { type?: string }).type ?? this.fallbackConfig.type ?? this.type; + })(); + + if (this.type === 'server_error' && isErrorLike(src)) { + // prevents hiding the original message behind the fallback message + this.fallbackMessage = src.message; + } + + const shouldAddDetails = !this.issues.length && this.fallbackMessage !== this.message; + if (!shouldAddDetails) return; + + this.issues.push(this.message); + } +} + +export default ApplicationClientError; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/index.ts new file mode 100644 index 00000000..14d3330b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/index.ts @@ -0,0 +1,2 @@ +export { default } from './ApplicationClientError'; +export type { default as ClientErrorFallbackConfig } from './types/ClientErrorFallbackConfig'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/types/ClientErrorFallbackConfig.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/types/ClientErrorFallbackConfig.ts new file mode 100644 index 00000000..20d3733c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/types/ClientErrorFallbackConfig.ts @@ -0,0 +1,8 @@ +import { StatusCode } from 'status-code-enum'; +import type { ApplicationErrorFallbackConfig } from '@common/errors/types'; + +type ClientErrorFallbackConfig = Omit & { + statusCode?: StatusCode; +}; + +export default ClientErrorFallbackConfig; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ErrorCode.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ErrorCode.ts new file mode 100644 index 00000000..3fef48f2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ErrorCode.ts @@ -0,0 +1,7 @@ +const ErrorCode = { + DeviceAccess: 'device.access.error', + DevicesTrackUnavailable: 'devices.track.unavailable', + FacingModeNotSupported: 'facingMode.not.supported', +} as const; + +export default ErrorCode; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/index.ts new file mode 100644 index 00000000..e8c0da7d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/index.ts @@ -0,0 +1,9 @@ +export { + default as ApplicationClientError, + type ClientErrorFallbackConfig, +} from './ApplicationClientError'; +export { + default as makeApplicationErrorMapper, + type ApplicationErrorMapperConfig, +} from './mappers/makeApplicationErrorMapper'; +export { default as ErrorCode } from './ErrorCode'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/index.ts new file mode 100644 index 00000000..226ef068 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/index.ts @@ -0,0 +1 @@ +export { default as makeApplicationErrorMapper } from './makeApplicationErrorMapper'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/makeApplicationErrorMapper/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/makeApplicationErrorMapper/index.ts new file mode 100644 index 00000000..c21c4c31 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/makeApplicationErrorMapper/index.ts @@ -0,0 +1 @@ +export { default, type ApplicationErrorMapperConfig } from './makeApplicationErrorMapper'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/makeApplicationErrorMapper/makeApplicationErrorMapper.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/makeApplicationErrorMapper/makeApplicationErrorMapper.ts new file mode 100644 index 00000000..4360f248 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/makeApplicationErrorMapper/makeApplicationErrorMapper.ts @@ -0,0 +1,42 @@ +import ApplicationClientError from '../../ApplicationClientError/ApplicationClientError'; +import { isNil, isString } from '@common/assertions'; +import { t } from 'i18next'; + +export type ApplicationErrorMapperConfig = { + fallbackMessage: string; + type: string; +}; + +function makeApplicationErrorMapper(): ApplicationErrorMapper; + +function makeApplicationErrorMapper(fallbackMessage: string): ApplicationErrorMapper; + +function makeApplicationErrorMapper(config: ApplicationErrorMapperConfig): ApplicationErrorMapper; + +function makeApplicationErrorMapper( + arg?: string | ApplicationErrorMapperConfig +): ApplicationErrorMapper { + const config = + isString(arg) || isNil(arg) + ? { + fallbackMessage: arg ?? t('errors.unknown'), + type: 'error', + } + : arg; + + return (source: unknown): ApplicationClientError => { + const { fallbackMessage, type } = config; + + return new ApplicationClientError({ + src: source, + fallbackConfig: { + fallbackMessage, + type, + }, + }); + }; +} + +type ApplicationErrorMapper = (source: unknown) => ApplicationClientError; + +export default makeApplicationErrorMapper; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/index.ts new file mode 100644 index 00000000..bad26856 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/index.ts @@ -0,0 +1,5 @@ +export { default as useVideoStats } from './useVideoStats'; +export { default as usePublisherStats } from './usePublisherStats'; +export { default as useSubscriberStats } from './useSubscriberStats'; +export { default as useArchives } from './useArchives'; +export type { UseArchivesProps } from './useArchives'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/index.ts new file mode 100644 index 00000000..9d205504 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/index.ts @@ -0,0 +1,2 @@ +export { default } from './useArchives'; +export type { UseArchivesProps } from './useArchives'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/useArchives.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/useArchives.test.ts new file mode 100644 index 00000000..17b335e7 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/useArchives.test.ts @@ -0,0 +1,109 @@ +import { renderHook as renderHookBase, waitFor } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; +import { makeTestProvider, providers, ProviderOptions } from '@core-test/providers'; +import useArchives from './useArchives'; +import { makeVideoClientMock } from '@core-test/fixtures'; +import { SingleArchiveResponse } from '@vonage/video'; + +const singleArchiveResponse = { + id: 'archive-1', + name: 'test', +} as SingleArchiveResponse; + +describe('useArchives', () => { + it('returns archives when the request succeeds', async () => { + expect.assertions(4); + + const videoClient = makeVideoClientMock({ + searchArchives: Promise.resolve({ + count: 1, + items: [singleArchiveResponse], + }), + }); + + const { result } = renderHook( + () => + useArchives({ + sessionKey: 'room-1', + queryOptions: { retry: false }, + }), + { + runtimeContext: { + videoClient, + }, + } + ); + + expect(result.current.isLoading).toBe(true); + + await waitFor(() => { + if (!result.current.data) { + throw new Error('No data'); + } + }); + + expect(result.current.data).toEqual({ + count: 1, + items: [{ id: 'archive-1', name: 'test' }], + }); + + expect(result.current.error).toBeNull(); + + expect(videoClient.searchArchives).toHaveBeenCalledWith({ + sessionKey: 'room-1', + count: undefined, + offset: undefined, + }); + }); + + it('returns error when the request fails', async () => { + expect.assertions(3); + + const error = new Error('Failed to fetch archives'); + + const videoClient = makeVideoClientMock({ + searchArchives: Promise.reject(error), + }); + + const { result } = renderHook( + () => + useArchives({ + sessionKey: 'room-1', + queryOptions: { retry: false }, + }), + { + runtimeContext: { + videoClient, + }, + } + ); + + expect(result.current.isLoading).toBe(true); + + await waitFor(() => { + if (!result.current.error) { + throw new Error('No error'); + } + }); + + expect(result.current.error).toEqual(error); + expect(result.current.data).toBeUndefined(); + }); +}); + +type RenderOptions = { + runtimeContext?: ProviderOptions['RuntimeContext']; +}; + +function renderHook(render: () => Result, { runtimeContext }: RenderOptions = {}) { + const { wrapper, ...context } = makeTestProvider([providers.runtime], { + runtimeContext, + }); + + return { + ...context, + ...renderHookBase(render, { + wrapper, + }), + }; +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/useArchives.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/useArchives.ts new file mode 100644 index 00000000..4a05d31a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/useArchives.ts @@ -0,0 +1,50 @@ +import { runtime$ } from '@core/stores'; +import type { VideoClient } from '@core/services'; +import type { QueryOptions } from '@core/types'; + +type Result = Awaited>; + +type Input = Parameters[0]; + +export type UseArchivesProps = Input & { + queryOptions?: QueryOptions; +}; + +/** + * Hook to search for archives. + * + * @example + * const { data, error, isLoading } = useArchives({ + * sessionKey: 'room-1', + * count: 10, + * offset: 0 + * }); + * + * console.log(data); // { items: [...], count: 100 } + * console.log(error); // null or Error + * console.log(isLoading); // boolean + */ +const useArchives = ({ + queryOptions, + sessionKey, + count, + offset, +}: UseArchivesProps) => { + const videoClient = runtime$.useVideoClient(); + + return runtime$.useQuery({ + ...queryOptions, + + queryKey: ['archives', sessionKey, count, offset], + + queryFn: async () => { + return await videoClient.searchArchives({ + sessionKey, + count, + offset, + }); + }, + }); +}; + +export default useArchives; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/index.ts new file mode 100644 index 00000000..9df64e4d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/index.ts @@ -0,0 +1 @@ +export { default } from './usePublisherStats'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/usePublisherStats.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/usePublisherStats.spec.ts new file mode 100644 index 00000000..7c1a21d6 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/usePublisherStats.spec.ts @@ -0,0 +1,463 @@ +import { describe, expect, it, vi } from 'vitest'; +import { renderHook as renderHookBase, waitFor, act } from '@testing-library/react'; +import type { Publisher, PublisherStatsArr, VideoLayerStats } from '@vonage/client-sdk-video'; +import usePublisherStats, { PublisherInspectorStatistics } from './usePublisherStats'; +import { wait } from '@common/execution'; +import { ProviderOptions, makeTestProvider, providers } from '@core-test'; +import SuspenseBoundary from '@web/components/SuspenseBoundary'; +import { composeProviders } from '@web/helpers'; +import { StrictMode } from 'react'; +import { UseQueryResult } from '@tanstack/react-query'; +import { DeepPartial } from '@common/types'; + +describe('usePublisherStats', () => { + describe('resolution', () => { + it('maps valid publisher dimensions and video frame rate', async () => { + expect.assertions(2); + + const publisher = makePublisher( + [ + makeStatsContainer({ + video: { + frameRate: 30, + }, + }), + ], + { + videoWidth: 1280, + videoHeight: 720, + } + ); + + const { result } = renderHook(() => + usePublisherStats({ + publisher, + publisherStatisticsEnabled: true, + fixedFrameRate: 30, + queryOptions: { + refetchInterval: false, + }, + }) + ); + + const stats = await waitForStatsToLoad(result); + + // optionalValue wraps the value; the fallback '-' should NOT be used + expect(stats.resolution.value).toEqual({ + width: 1280, + height: 720, + }); + + expect(stats.frameRate.value).toBe(30); + }); + }); + + describe('frameRate', () => { + it('does NOT treat 0 fps as missing because it is a valid value', async () => { + expect.assertions(1); + + const publisher = makePublisher([ + makeStatsContainer({ + video: { + frameRate: 0, + }, + }), + ]); + + const { result } = renderHook(() => + usePublisherStats({ + publisher, + publisherStatisticsEnabled: true, + fixedFrameRate: 0, + queryOptions: { + refetchInterval: false, + }, + }) + ); + + const stats = await waitForStatsToLoad(result); + + // 0 fps is a real value; the formatted output should not be the fallback '-' + expect(stats.frameRate.value).toBe(0); + }); + }); + + describe('bitrateBps', () => { + it('calculates bitrate correctly when a previous sample is available', async () => { + expect.assertions(3); + + const publisher = makePublisher([ + makeStatsContainer({ + video: { + bytesSent: 0, + }, + timestamp: 0, + }), + ]); + + const { result } = renderHook(() => + usePublisherStats({ + publisher, + publisherStatisticsEnabled: true, + queryOptions: { + refetchInterval: false, + staleTime: 0, + }, + }) + ); + + let data = await waitForStatsToLoad(result); + + // first render there is no previous sample, so the bitrate should be the fallback '-' + expect(data.bitrateBps.toString()).toBe('-'); + + vi.spyOn(publisher, 'getStats').mockImplementationOnce((callback) => { + callback(undefined, [ + makeStatsContainer({ + video: { + bytesSent: 1000, + }, + timestamp: 1000, + }), + ]); + }); + + await act(async () => { + await result.current.refetch(); + }); + + data = await waitForStatsToLoad(result); + + expect(data.bitrateBps.toString()).toBe('8.0 kbps'); + + expect(data.bitrateBps.value).toBe(8000); + }); + }); + + describe('packetLossRatio', () => { + it('calculates packet loss ratio from aggregated video packet totals', async () => { + expect.assertions(3); + + // 4 lost out of 204 total means ~1.96 % + const container1 = makeStatsContainer({ + video: { + packetsSent: 100, + packetsLost: 2, + }, + }); + + const container2 = makeStatsContainer({ + video: { + packetsSent: 100, + packetsLost: 2, + }, + }); + + const publisher = makePublisher([container1, container2]); + + const { result } = renderHook(() => + usePublisherStats({ + publisher, + publisherStatisticsEnabled: true, + queryOptions: { + refetchInterval: false, + }, + }) + ); + + const stats = await waitForStatsToLoad(result); + + expect(stats.video.packetsSent.value).toBe(200); + expect(stats.video.packetsLost.value).toBe(4); + expect(stats.packetLossRatio.value).toBeCloseTo(4 / 204); + }); + }); + + describe('connectionEstimatedBandwidthBps', () => { + it('picks the maximum valid bandwidth across multiple containers when publisherStatisticsEnabled is true', async () => { + expect.assertions(1); + + const container1 = makeStatsContainer({ + mediaLink: { + transport: { + connectionEstimatedBandwidth: -1, + }, + }, + }); + + const container2 = makeStatsContainer({ + mediaLink: { + transport: { + connectionEstimatedBandwidth: 500_000, + }, + }, + }); + + const container3 = makeStatsContainer({ + mediaLink: { + transport: { + connectionEstimatedBandwidth: 2_000_000, + }, + }, + }); + + const publisher = makePublisher([container1, container2, container3]); + + const { result } = renderHook(() => + usePublisherStats({ + publisher, + publisherStatisticsEnabled: true, + queryOptions: { + refetchInterval: false, + }, + }) + ); + + const stats = await waitForStatsToLoad(result); + + expect(stats.connectionEstimatedBandwidthBps.value).toBe(2_000_000); + }); + + it('returns fallback when publisherStatisticsEnabled is false', async () => { + expect.assertions(1); + + const publisher = makePublisher([ + makeStatsContainer({ + mediaLink: { + transport: { + connectionEstimatedBandwidth: 2_000_000, + }, + }, + }), + ]); + + const { result } = renderHook(() => + usePublisherStats({ + publisher, + publisherStatisticsEnabled: false, + queryOptions: { + refetchInterval: false, + }, + }) + ); + + const stats = await waitForStatsToLoad(result); + + expect(stats.connectionEstimatedBandwidthBps.toString()).toBe('-'); + }); + }); + + describe('videoLayers', () => { + it('returns videoLayers from the first stats container', async () => { + expect.assertions(1); + + const layers = [ + { + spatialLayerId: 0, + }, + { + spatialLayerId: 1, + }, + ] as unknown as VideoLayerStats[]; + + const publisher = makePublisher([ + makeStatsContainer({ + video: { + layers, + }, + }), + ]); + + const { result } = renderHook(() => + usePublisherStats({ + publisher, + publisherStatisticsEnabled: true, + queryOptions: { + refetchInterval: false, + }, + }) + ); + + const stats = await waitForStatsToLoad(result); + + expect(stats.videoLayers).toEqual(layers); + }); + + it('returns null when video layers are absent', async () => { + expect.assertions(1); + + const containerWithoutLayers = { + stats: { + timestamp: 0, + audio: { + packetsSent: 100, + packetsLost: 0, + bytesSent: 1000, + }, + video: { + packetsSent: 100, + packetsLost: 0, + bytesSent: 5000, + frameRate: 30, + }, + mediaLink: { + transport: { + connectionEstimatedBandwidth: 1_000_000, + }, + }, + }, + } as unknown as PublisherStatsArr[number]; + + const publisher = makePublisher([containerWithoutLayers]); + + const { result } = renderHook(() => + usePublisherStats({ + publisher, + publisherStatisticsEnabled: true, + queryOptions: { + refetchInterval: false, + }, + }) + ); + + const stats = await waitForStatsToLoad(result); + + expect(stats.videoLayers).toBeNull(); + }); + }); + + describe('missing / partial track data', () => { + it('treats missing audio track fields as zero', async () => { + expect.assertions(3); + + const containerWithNoAudio = { + stats: { + timestamp: 0, + audio: {}, + video: { + packetsSent: 100, + packetsLost: 0, + bytesSent: 5000, + frameRate: 30, + layers: [], + }, + mediaLink: { + transport: { + connectionEstimatedBandwidth: 1_000_000, + }, + }, + }, + } as unknown as PublisherStatsArr[number]; + + const publisher = makePublisher([containerWithNoAudio]); + + const { result } = renderHook(() => + usePublisherStats({ + publisher, + publisherStatisticsEnabled: true, + queryOptions: { + refetchInterval: false, + }, + }) + ); + + const stats = await waitForStatsToLoad(result); + + expect(stats.audio.packetsSent.value).toBe(0); + expect(stats.audio.packetsLost.value).toBe(0); + expect(stats.audio.bytesSent.value).toBe(0); + }); + }); +}); + +type RenderOptions = { + runtimeContext?: ProviderOptions['RuntimeContext']; +}; + +function renderHook( + render: (initialProps: Props) => Result, + { runtimeContext }: RenderOptions = {} +) { + const { wrapper: MainWrapper, ...context } = makeTestProvider([providers.runtime], { + runtimeContext, + }); + + const wrapper = composeProviders(StrictMode, SuspenseBoundary, MainWrapper); + const result = renderHookBase(render, { wrapper }); + + return { + ...context, + ...result, + }; +} + +async function waitForStatsToLoad(args: { + current: UseQueryResult; +}) { + await waitFor(() => { + if (args.current.isLoading || args.current.isFetching) { + throw new Error('Still loading'); + } + + if (args.current.data === undefined) { + throw new Error('Stats not loaded'); + } + }); + + return args.current.data!; +} + +/** + * Builds a minimal Publisher mock whose getStats callback resolves with the + * provided stats array or an error when `error` is truthy. + */ +function makePublisher( + statsArr: PublisherStatsArr | null = null, + options: { error?: Error; videoWidth?: number; videoHeight?: number } = {} +): Publisher { + return { + id: 'publisher-id-1', + videoWidth: vi.fn().mockReturnValue(options.videoWidth ?? 1280), + videoHeight: vi.fn().mockReturnValue(options.videoHeight ?? 720), + getStats: vi.fn( + async (callback: (error: Error | null, stats: PublisherStatsArr | null) => void) => { + await wait(1); + + callback(options.error ?? null, statsArr); + } + ), + } as unknown as Publisher; +} + +/** + * Builds a minimal PublisherStatsArr entry. + */ +function makeStatsContainer( + stats: DeepPartial = {} +): PublisherStatsArr[0] { + return { + stats: { + timestamp: stats.timestamp ?? 0, + audio: { + packetsSent: 100, + packetsLost: 2, + bytesSent: 5000, + ...stats.audio, + }, + video: { + packetsSent: 200, + packetsLost: 4, + bytesSent: 20000, + frameRate: 30, + layers: [], + ...stats.video, + }, + mediaLink: { + transport: { + connectionEstimatedBandwidth: 1_000_000, + ...stats.mediaLink?.transport, + }, + }, + }, + } as unknown as PublisherStatsArr[number]; +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/usePublisherStats.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/usePublisherStats.ts new file mode 100644 index 00000000..1ae9e0ef --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/usePublisherStats.ts @@ -0,0 +1,202 @@ +import { runtime$ } from '@core/stores'; +import type { QueryOptions } from '@core/types'; +import { + BitrateValue, + bytesValue, + BytesValue, + FrameRateValue, + IntegerValue, + integerValue, + optionalValue, + OptionalValue, + PacketLossValue, + ResolutionValue, +} from '@core/metrics'; +import type { Publisher, PublisherStatsArr, VideoLayerStats } from '@vonage/client-sdk-video'; +import useStableRef from '@web/hooks/useStableRef/useStableRef'; +import { isNil } from '@common/assertions'; + +const POLL_INTERVAL_MS = 2000; + +export type OutgoingTrackTotals = { + packetsSent: IntegerValue; + packetsLost: IntegerValue; + bytesSent: BytesValue; +}; + +export type PublisherInspectorStatistics = { + resolution: OptionalValue; + frameRate: OptionalValue; + bitrateBps: OptionalValue; + packetLossRatio: OptionalValue; + audio: OutgoingTrackTotals; + video: OutgoingTrackTotals; + connectionEstimatedBandwidthBps: OptionalValue; + videoLayers: VideoLayerStats[] | null; +}; + +export type UsePublisherStatsProps = { + queryOptions?: QueryOptions; + publisher: Publisher | null | undefined; + publisherStatisticsEnabled: boolean; + fixedFrameRate?: number | null; +}; + +const usePublisherStats = ({ + queryOptions, + publisher, + publisherStatisticsEnabled, + fixedFrameRate, +}: UsePublisherStatsProps) => { + const previousPublisherVideoSampleRef = useStableRef( + () => null, + [] + ); + + return runtime$.useQuery({ + queryKey: ['publisherStats', publisher?.id, publisherStatisticsEnabled], + refetchInterval: POLL_INTERVAL_MS, + queryFn: async () => { + if (!publisher) return null; + + const publisherStatsContainers = await getPublisherStats(publisher); + if (!publisherStatsContainers?.length) return null; + + const audioTotals = aggregateOutgoingTrackTotals( + publisherStatsContainers, + (container) => container.stats.audio + ); + + const videoTotals = aggregateOutgoingTrackTotals( + publisherStatsContainers, + (container) => container.stats.video + ); + + const firstPublisherStatsContainer = publisherStatsContainers[0]; + const stats = firstPublisherStatsContainer?.stats; + + const frameRate = fixedFrameRate ?? null; + + const width = publisher.videoWidth(); + const height = publisher.videoHeight(); + const resolution = isNil(width) || isNil(height) ? null : { width, height }; + + const connectionEstimatedBandwidthValues = publisherStatsContainers + .map((container) => container.stats.mediaLink?.transport?.connectionEstimatedBandwidth) + .filter((value): value is number => typeof value === 'number' && value >= 0); + + const connectionEstimatedBandwidthBps = connectionEstimatedBandwidthValues?.length + ? Math.max(...connectionEstimatedBandwidthValues) + : null; + + const packetLossRatio = calculatePacketLossRatio({ + packetsLost: videoTotals.packetsLost, + packetsSuccessful: videoTotals.packetsSent, + }); + + // Bitrate is intentionally null on the first poll because we need two samples + // to compute a delta. It will resolve on the second tick. + const bitrateBps = calculateBitrateFromDelta({ + currentBytesSent: videoTotals.bytesSent.value, + currentTimestamp: stats.timestamp, + previousSample: previousPublisherVideoSampleRef.current, + }); + + previousPublisherVideoSampleRef.current = { + bytesSent: videoTotals.bytesSent, + timestamp: stats.timestamp, + }; + + return { + resolution: optionalValue(ResolutionValue, resolution, { fallback: '-' }), + frameRate: optionalValue(FrameRateValue, frameRate, { fallback: '-' }), + bitrateBps: optionalValue(BitrateValue, bitrateBps, { fallback: '-' }), + packetLossRatio: optionalValue(PacketLossValue, packetLossRatio, { fallback: '-' }), + audio: audioTotals, + video: videoTotals, + connectionEstimatedBandwidthBps: optionalValue( + BitrateValue, + publisherStatisticsEnabled ? connectionEstimatedBandwidthBps : null, + { fallback: '-' } + ), + videoLayers: stats?.video?.layers ?? null, + }; + }, + ...queryOptions, + }); +}; + +type PreviousPublisherVideoSample = { + bytesSent: BytesValue; + timestamp: number; +}; + +function getPublisherStats(publisher: Publisher): Promise { + return new Promise((resolve) => { + publisher.getStats((error, stats) => { + if (error) return resolve(null); + resolve(stats ?? null); + }); + }); +} + +function aggregateOutgoingTrackTotals( + publisherStatsContainers: PublisherStatsArr, + getTrack: (container: PublisherStatsArr[number]) => { + packetsSent: number; + packetsLost: number; + bytesSent: number; + } +): OutgoingTrackTotals { + return publisherStatsContainers.reduce( + (accumulator, container) => { + const track = getTrack(container); + + return { + packetsSent: integerValue(accumulator.packetsSent.value + (track?.packetsSent ?? 0)), + packetsLost: integerValue(accumulator.packetsLost.value + (track?.packetsLost ?? 0)), + bytesSent: bytesValue(accumulator.bytesSent.value + (track?.bytesSent ?? 0)), + }; + }, + { + packetsSent: integerValue(0), + packetsLost: integerValue(0), + bytesSent: bytesValue(0), + } + ); +} + +function calculateBitrateFromDelta({ + currentBytesSent, + currentTimestamp, + previousSample, +}: { + currentBytesSent: number; + currentTimestamp: number; + previousSample: PreviousPublisherVideoSample | null; +}): number | null { + if (!previousSample) return null; + + const elapsedMilliseconds = currentTimestamp - previousSample.timestamp; + const deltaBytes = currentBytesSent - previousSample.bytesSent.value; + + const canCalculateBitrate = elapsedMilliseconds > 0 && deltaBytes >= 0; + if (!canCalculateBitrate) return null; + + return Math.round((deltaBytes * 8 * 1000) / elapsedMilliseconds); +} + +function calculatePacketLossRatio({ + packetsLost, + packetsSuccessful, +}: { + packetsLost: IntegerValue; + packetsSuccessful: IntegerValue; +}): number | null { + const totalPackets = packetsLost.value + packetsSuccessful.value; + if (totalPackets <= 0) return null; + + return packetsLost.value / totalPackets; +} + +export default usePublisherStats; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/index.ts new file mode 100644 index 00000000..c42550d4 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/index.ts @@ -0,0 +1 @@ +export { default } from './useSubscriberStats'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/useSubscriberStats.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/useSubscriberStats.spec.ts new file mode 100644 index 00000000..b8befc53 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/useSubscriberStats.spec.ts @@ -0,0 +1,145 @@ +import { describe, expect, it, vi } from 'vitest'; +import { renderHook as renderHookBase, waitFor } from '@testing-library/react'; +import type { Subscriber, SubscriberStats } from '@vonage/client-sdk-video'; +import useSubscriberStats, { SubscriberInspectorStatistics } from './useSubscriberStats'; +import { ProviderOptions, makeTestProvider, providers } from '@core-test'; +import SuspenseBoundary from '@web/components/SuspenseBoundary'; +import { composeProviders } from '@web/helpers'; +import { StrictMode } from 'react'; +import { type UseQueryResult } from '@tanstack/react-query'; +import { wait } from '@common/execution'; + +describe('useSubscriberStats', () => { + it('returns null when subscriber is null or getStats returns error', async () => { + expect.assertions(2); + + let subscriber = makeSubscriber(null, undefined); + + let { result } = renderHook(() => useSubscriberStats({ subscriber })); + + let data = await waitForStatsToLoad(result); + + expect(data).toBeNull(); + + subscriber = makeSubscriber(null, new Error('stats error')); + + ({ result } = renderHook(() => useSubscriberStats({ subscriber }))); + + data = await waitForStatsToLoad(result); + + expect(data).toBeNull(); + }); + + it('returns subscriber statistics', async () => { + expect.assertions(8); + + const subscriber = makeSubscriber({ + audio: { + packetsReceived: 100, + packetsLost: 2, + bytesReceived: 1000, + }, + video: { + packetsReceived: 200, + packetsLost: 4, + bytesReceived: 2000, + codec: 'H264', + frameRate: 30, + decodedFrameRate: 30, + bitrate: 500000, + }, + mediaLink: { + transport: { + connectionEstimatedBandwidth: 1000000, + }, + }, + } as SubscriberStats); + + const { result } = renderHook(() => useSubscriberStats({ subscriber })); + + const data = await waitForStatsToLoad(result); + + expect(data).toMatchObject({ + id: 'subscriber-1', + title: 'Test Subscriber', + }); + + expect(data.audio.bytesReceived.toString()).toBe('1,000'); + expect(data.video.codec).toBe('H264'); + expect(data.video.frameRate.toString()).toBe('30 fps'); + expect(data.video.decodedFrameRate.toString()).toBe('30 fps'); + expect(data.video.bitrateBps.toString()).toBe('500.0 kbps'); + expect(data.packetLossRatio.toString()).toBe('1.96%'); + expect(data.connectionEstimatedBandwidthBps.toString()).toBe('1.00 Mbps'); + }); + + it('returns fallback bandwidth when value is negative', async () => { + expect.assertions(1); + + const subscriber = makeSubscriber({ + audio: {}, + video: {}, + mediaLink: { + transport: { + connectionEstimatedBandwidth: -1, + }, + }, + } as SubscriberStats); + + const { result } = renderHook(() => useSubscriberStats({ subscriber })); + + const data = await waitForStatsToLoad(result); + + expect(data.packetLossRatio.toString()).toBe('-'); + }); +}); + +function makeSubscriber(stats: SubscriberStats | null, error?: Error): Subscriber { + return { + id: 'subscriber-1', + stream: { + name: 'Test Subscriber', + }, + getStats: vi.fn(async (callback) => { + await wait(1); + + callback(error ?? null, stats); + }), + } as unknown as Subscriber; +} + +async function waitForStatsToLoad(args: { + current: UseQueryResult; +}) { + await waitFor(() => { + if (args.current.isLoading || args.current.isFetching) { + throw new Error('Still loading'); + } + + if (args.current.data === undefined) { + throw new Error('Stats not loaded'); + } + }); + + return args.current.data!; +} +type RenderOptions = { + runtimeContext?: ProviderOptions['RuntimeContext']; +}; + +function renderHook( + render: (initialProps: Props) => Result, + { runtimeContext }: RenderOptions = {} +) { + const { wrapper: MainWrapper, ...context } = makeTestProvider([providers.runtime], { + runtimeContext, + }); + + const wrapper = composeProviders(StrictMode, SuspenseBoundary, MainWrapper); + const result = renderHookBase(render, { wrapper }); + + return { + ...context, + ...result, + }; +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/useSubscriberStats.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/useSubscriberStats.ts new file mode 100644 index 00000000..9769c1be --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/useSubscriberStats.ts @@ -0,0 +1,161 @@ +import { runtime$ } from '@core/stores'; +import type { QueryOptions } from '@core/types'; +import { + BitrateValue, + ResolutionValue, + FrameRateValue, + IntegerValue, + integerValue, + OptionalValue, + optionalValue, + PacketLossValue, +} from '@core/metrics'; +import type { Subscriber, SubscriberStats } from '@vonage/client-sdk-video'; + +const POLL_INTERVAL_MS = 2000; + +export type IncomingTrackTotals = { + packetsReceived: IntegerValue; + packetsLost: IntegerValue; + bytesReceived: IntegerValue; +}; + +export type SubscriberInspectorStatistics = { + id?: string; + title?: string; + audio: IncomingTrackTotals; + video: IncomingTrackTotals & { + resolution: OptionalValue; + codec: string | null; + frameRate: OptionalValue; + decodedFrameRate: OptionalValue; + bitrateBps: OptionalValue; + freezeCount: OptionalValue; + totalFreezesDuration: OptionalValue; + }; + packetLossRatio: OptionalValue; + connectionEstimatedBandwidthBps: OptionalValue; + remotePublisherConnectionEstimatedBandwidthBps: OptionalValue; +}; + +export type useSubscriberStatsProps = { + queryOptions?: QueryOptions; + subscriber: Subscriber | null | undefined; +}; + +const useSubscriberStats = ({ + queryOptions, + subscriber, +}: useSubscriberStatsProps) => { + return runtime$.useQuery({ + queryKey: ['archives', subscriber], + refetchInterval: POLL_INTERVAL_MS, + queryFn: async () => { + if (!subscriber) { + return null; + } + + const stats = await getSubscriberStats(subscriber); + + if (!stats) { + return null; + } + + const audio: IncomingTrackTotals = { + packetsReceived: integerValue(stats.audio?.packetsReceived ?? 0), + packetsLost: integerValue(stats.audio?.packetsLost ?? 0), + bytesReceived: integerValue(stats.audio?.bytesReceived ?? 0), + }; + + const video: IncomingTrackTotals = { + packetsReceived: integerValue(stats.video?.packetsReceived ?? 0), + packetsLost: integerValue(stats.video?.packetsLost ?? 0), + bytesReceived: integerValue(stats.video?.bytesReceived ?? 0), + }; + + const packetLossRatio = calculatePacketLossRatio({ + packetsLost: video.packetsLost, + packetsSuccessful: video.packetsReceived, + }); + + const connectionEstimatedBandwidth = stats.mediaLink?.transport?.connectionEstimatedBandwidth; + + const remotePublisherConnectionEstimatedBandwidth = + stats.mediaLink?.remotePublisherTransport?.connectionEstimatedBandwidth; + + return { + id: subscriber.id, + title: subscriber.stream?.name ?? subscriber.id, + audio, + video: { + ...video, + resolution: optionalValue(ResolutionValue, stats.video), + codec: stats.video?.codec ?? null, + frameRate: optionalValue(FrameRateValue, stats.video?.frameRate, { fallback: '-' }), + decodedFrameRate: optionalValue(FrameRateValue, stats.video?.decodedFrameRate, { + fallback: '-', + }), + bitrateBps: optionalValue(BitrateValue, stats.video?.bitrate, { fallback: '-' }), + freezeCount: optionalValue(IntegerValue, stats.video?.freezeCount ?? null, { + fallback: '-', + }), + totalFreezesDuration: optionalValue( + IntegerValue, + stats.video?.totalFreezesDuration ?? null, + { + fallback: '-', + } + ), + }, + packetLossRatio: optionalValue(PacketLossValue, packetLossRatio, { fallback: '-' }), + connectionEstimatedBandwidthBps: optionalValue( + BitrateValue, + connectionEstimatedBandwidth === undefined || connectionEstimatedBandwidth < 0 + ? null + : connectionEstimatedBandwidth, + { + fallback: '-', + } + ), + remotePublisherConnectionEstimatedBandwidthBps: optionalValue( + BitrateValue, + remotePublisherConnectionEstimatedBandwidth === undefined || + remotePublisherConnectionEstimatedBandwidth < 0 + ? null + : remotePublisherConnectionEstimatedBandwidth, + { + fallback: '-', + } + ), + }; + }, + ...queryOptions, + }); +}; + +function getSubscriberStats(subscriber: Subscriber): Promise { + return new Promise((resolve) => { + subscriber.getStats((error, stats) => { + if (error) return resolve(null); + resolve(stats ?? null); + }); + }); +} + +function calculatePacketLossRatio({ + packetsLost, + packetsSuccessful, +}: { + packetsLost: IntegerValue; + packetsSuccessful: IntegerValue; +}): number | null { + const totalPackets = packetsLost.value + packetsSuccessful.value; + + if (totalPackets <= 0) { + return null; + } + + return packetsLost.value / totalPackets; +} + +export default useSubscriberStats; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatFrameRate.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatFrameRate.spec.ts new file mode 100644 index 00000000..54377e85 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatFrameRate.spec.ts @@ -0,0 +1,18 @@ +import { describe, expect, it } from 'vitest'; +import formatFrameRate from './formatFrameRate'; + +describe('formatFrameRate', () => { + it('returns null when frame rate is not available', () => { + expect(formatFrameRate(null)).toBeNull(); + }); + + it('formats integer frame rates', () => { + expect(formatFrameRate(60)).toBe('60fps'); + expect(formatFrameRate(0)).toBe('0fps'); + }); + + it('rounds fractional frame rates to the nearest integer', () => { + expect(formatFrameRate(29.4)).toBe('29fps'); + expect(formatFrameRate(29.5)).toBe('30fps'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatFrameRate.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatFrameRate.ts new file mode 100644 index 00000000..0d5390ec --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatFrameRate.ts @@ -0,0 +1,11 @@ +/** + * Formats a frame rate value into a display string. + * @param {number | null} frameRate - The frame rate in frames per second. + * @returns {string | null} The formatted frame rate (e.g. "30fps"), or null if frameRate is not available. + */ +const formatFrameRate = (frameRate: number | null): string | null => { + if (frameRate === null) return null; + return `${Math.round(frameRate)}fps`; +}; + +export default formatFrameRate; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatResolution.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatResolution.spec.ts new file mode 100644 index 00000000..3012bf10 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatResolution.spec.ts @@ -0,0 +1,19 @@ +import { describe, expect, it } from 'vitest'; +import formatResolution from './formatResolution'; + +describe('formatResolution', () => { + it('returns null when height is not available', () => { + expect(formatResolution(null)).toBeNull(); + }); + + it('formats common resolutions', () => { + expect(formatResolution(1080)).toBe('1080p'); + expect(formatResolution(720)).toBe('720p'); + expect(formatResolution(480)).toBe('480p'); + }); + + it('handles atypical heights', () => { + expect(formatResolution(0)).toBe('0p'); + expect(formatResolution(1234)).toBe('1234p'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatResolution.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatResolution.ts new file mode 100644 index 00000000..07a9e46e --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatResolution.ts @@ -0,0 +1,11 @@ +/** + * Formats a video height into a standard resolution label. + * @param {number | null} height - The video height in pixels. + * @returns {string | null} The formatted resolution label (e.g. "720p"), or null if height is not available. + */ +const formatResolution = (height: number | null): string | null => { + if (height === null) return null; + return `${height}p`; +}; + +export default formatResolution; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/index.ts new file mode 100644 index 00000000..73023e73 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/index.ts @@ -0,0 +1,2 @@ +export { default as formatResolution } from './formatResolution'; +export { default as formatFrameRate } from './formatFrameRate'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/readPublisherStats.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/readPublisherStats.ts new file mode 100644 index 00000000..1ea7e42b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/readPublisherStats.ts @@ -0,0 +1,42 @@ +import type { Publisher } from '@vonage/client-sdk-video'; +import type { VideoStats } from '../types'; + +/** + * Reads the current video stats from a Vonage publisher instance. + * + * Resolution is read directly from the SDK's `videoWidth()` / `videoHeight()` methods, + * which reflect the actual captured dimensions of the camera stream. + * + * Frame rate cannot be obtained via the session stats API (`session.getPublisherStats()`) + * because the preview publisher is not connected to a session. Instead, we reach the + * underlying `MediaStreamTrack` via `publisher.getVideoSource().track` and call the + * standard Web API `track.getSettings().frameRate`. + * + * @param {Publisher} publisher - An initialized Vonage publisher instance. + * @returns {VideoStats} The current width, height, and frame rate (each `null` if unavailable). + */ +function readPublisherStats(publisher: Publisher): VideoStats { + // videoWidth() / videoHeight() return `undefined` before the camera stream is ready; + // we normalize to `null` to keep VideoStats consistently typed. + const width = publisher.videoWidth() ?? null; + const height = publisher.videoHeight() ?? null; + + let frameRate: number | null = null; + try { + // getVideoSource() returns a Vonage VideoSource whose `.track` is the raw + // MediaStreamTrack. We read frameRate from the track's settings because + // the preview publisher is not published to a session, making the + // session.getPublisherStats() API unavailable here. + const source = publisher.getVideoSource(); + const track = source?.track; + if (track) { + frameRate = track.getSettings().frameRate ?? null; + } + } catch { + // getVideoSource may throw if publisher is not fully initialized + } + + return { width, height, frameRate }; +} + +export default readPublisherStats; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/index.ts new file mode 100644 index 00000000..bdf61ebb --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/index.ts @@ -0,0 +1,3 @@ +export { default } from './useVideoStats'; +export { formatResolution, formatFrameRate } from './helpers'; +export type { VideoStats } from './types'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/types.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/types.ts new file mode 100644 index 00000000..128f2196 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/types.ts @@ -0,0 +1,5 @@ +export type VideoStats = { + width: number | null; + height: number | null; + frameRate: number | null; +}; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/useVideoStats.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/useVideoStats.spec.ts new file mode 100644 index 00000000..e0fab0b8 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/useVideoStats.spec.ts @@ -0,0 +1,179 @@ +import { renderHook, act } from '@testing-library/react'; +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import type { Publisher } from '@vonage/client-sdk-video'; +import useVideoStats, { formatResolution, formatFrameRate } from './index'; + +describe('useVideoStats', () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + const createMockPublisher = ( + width: number | undefined, + height: number | undefined, + frameRate: number | undefined + ) => + ({ + videoWidth: vi.fn().mockReturnValue(width), + videoHeight: vi.fn().mockReturnValue(height), + getVideoSource: vi.fn().mockReturnValue({ + track: { + getSettings: vi.fn().mockReturnValue({ frameRate }), + }, + }), + }) as unknown as Publisher; + + it('should return null values when publisher is null', () => { + const { result } = renderHook(() => useVideoStats(null)); + + expect(result.current).toEqual({ + width: null, + height: null, + frameRate: null, + }); + }); + + it('should return video stats from publisher', () => { + const publisher = createMockPublisher(1280, 720, 30); + const { result } = renderHook(() => useVideoStats(publisher)); + + expect(result.current).toEqual({ + width: 1280, + height: 720, + frameRate: 30, + }); + }); + + it('should update stats on interval', () => { + const publisher = createMockPublisher(1280, 720, 30); + const { result } = renderHook(() => useVideoStats(publisher)); + + expect(result.current.height).toBe(720); + + (publisher.videoWidth as ReturnType).mockReturnValue(1920); + (publisher.videoHeight as ReturnType).mockReturnValue(1080); + + act(() => { + vi.advanceTimersByTime(1000); + }); + + expect(result.current).toEqual({ + width: 1920, + height: 1080, + frameRate: 30, + }); + }); + + it('should handle publisher with no video source track', () => { + const publisher = { + videoWidth: vi.fn().mockReturnValue(640), + videoHeight: vi.fn().mockReturnValue(480), + getVideoSource: vi.fn().mockReturnValue({ track: null }), + } as unknown as Publisher; + + const { result } = renderHook(() => useVideoStats(publisher)); + + expect(result.current).toEqual({ + width: 640, + height: 480, + frameRate: null, + }); + }); + + it('should handle getVideoSource throwing an error', () => { + const publisher = { + videoWidth: vi.fn().mockReturnValue(640), + videoHeight: vi.fn().mockReturnValue(480), + getVideoSource: vi.fn().mockImplementation(() => { + throw new Error('Not initialized'); + }), + } as unknown as Publisher; + + const { result } = renderHook(() => useVideoStats(publisher)); + + expect(result.current).toEqual({ + width: 640, + height: 480, + frameRate: null, + }); + }); + + it('should reset stats when publisher becomes null', () => { + const publisher = createMockPublisher(1280, 720, 30); + const { result, rerender } = renderHook(({ pub }) => useVideoStats(pub), { + initialProps: { pub: publisher as Publisher | null }, + }); + + expect(result.current.height).toBe(720); + + rerender({ pub: null }); + + expect(result.current).toEqual({ + width: null, + height: null, + frameRate: null, + }); + }); + + it('should update stats when publisher instance changes', () => { + const firstPublisher = createMockPublisher(640, 480, 30); + const secondPublisher = createMockPublisher(1280, 720, 60); + + const { result, rerender } = renderHook(({ pub }) => useVideoStats(pub), { + initialProps: { pub: firstPublisher as Publisher | null }, + }); + + expect(result.current).toEqual({ + width: 640, + height: 480, + frameRate: 30, + }); + + rerender({ pub: secondPublisher as Publisher | null }); + + expect(result.current).toEqual({ + width: 1280, + height: 720, + frameRate: 60, + }); + }); + + it('should clean up interval on unmount', () => { + const clearIntervalSpy = vi.spyOn(global, 'clearInterval'); + const publisher = createMockPublisher(1280, 720, 30); + const { unmount } = renderHook(() => useVideoStats(publisher)); + + unmount(); + + expect(clearIntervalSpy).toHaveBeenCalled(); + clearIntervalSpy.mockRestore(); + }); +}); + +describe('formatResolution', () => { + it('should format height to resolution label', () => { + expect(formatResolution(1080)).toBe('1080p'); + expect(formatResolution(720)).toBe('720p'); + expect(formatResolution(480)).toBe('480p'); + }); + + it('should return null for null height', () => { + expect(formatResolution(null)).toBeNull(); + }); +}); + +describe('formatFrameRate', () => { + it('should format fps to display string', () => { + expect(formatFrameRate(30)).toBe('30fps'); + expect(formatFrameRate(29.97)).toBe('30fps'); + expect(formatFrameRate(60)).toBe('60fps'); + }); + + it('should return null for null fps', () => { + expect(formatFrameRate(null)).toBeNull(); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/useVideoStats.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/useVideoStats.ts new file mode 100644 index 00000000..d83a4939 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/useVideoStats.ts @@ -0,0 +1,46 @@ +import { useEffect, useRef, useState } from 'react'; +import type { Publisher } from '@vonage/client-sdk-video'; +import readPublisherStats from './helpers/readPublisherStats'; +import type { VideoStats } from './types'; + +const POLL_INTERVAL_MS = 1000; + +const NULL_STATS: VideoStats = { width: null, height: null, frameRate: null }; + +const useVideoStats = (publisher: Publisher | null): VideoStats => { + const [stats, setStats] = useState(NULL_STATS); + const lastPublisherRef = useRef(null); + + useEffect(() => { + if (!publisher) return; + + const pollStats = () => { + const next = readPublisherStats(publisher); + setStats((prev) => { + const unchanged = + prev.width === next.width && + prev.height === next.height && + prev.frameRate === next.frameRate; + return unchanged ? prev : next; + }); + }; + + pollStats(); + const intervalId = setInterval(pollStats, POLL_INTERVAL_MS); + return () => clearInterval(intervalId); + }, [publisher]); + + if (!publisher) { + lastPublisherRef.current = null; + return NULL_STATS; + } + + if (lastPublisherRef.current !== publisher) { + lastPublisherRef.current = publisher; + return readPublisherStats(publisher); + } + + return stats; +}; + +export default useVideoStats; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/index.ts new file mode 100644 index 00000000..9609962b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/index.ts @@ -0,0 +1,8 @@ +/** + * The patch should be applied before importing any file, + * Fixes compatibility issues of web-rtc-adapter browsers/environments. + */ +import './webrtc-adapter.patch'; + +export { default as xmlHttpRequestEnvelop } from './xmlHttpRequestEnvelop'; +export { default as mediaDevicesEnvelop } from './mediaDevicesEnvelop'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/mediaDevicesEnvelop.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/mediaDevicesEnvelop.ts new file mode 100644 index 00000000..396b9742 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/mediaDevicesEnvelop.ts @@ -0,0 +1,11 @@ +import { interceptObject } from '@common/helpers'; + +/** + * Early interceptor for media devices, allows to override after they have been destructured by the Vonage SDK. + * + * The proxy replaces `navigator.mediaDevices` so that any code (including the + * Vonage SDK) that reads methods from it will go through the intercept layer. + */ +const mediaDevicesEnvelop = interceptObject(navigator, 'mediaDevices'); + +export default mediaDevicesEnvelop; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/webrtc-adapter.patch/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/webrtc-adapter.patch/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/webrtc-adapter.patch/webrtc-adapter.patch.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/webrtc-adapter.patch/webrtc-adapter.patch.test.ts new file mode 100644 index 00000000..430a2ad2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/webrtc-adapter.patch/webrtc-adapter.patch.test.ts @@ -0,0 +1,38 @@ +import { describe, expect, it, beforeEach } from 'vitest'; + +describe('correctWebRTCAdapterErrors', () => { + beforeEach(() => { + localStorage.clear(); + + class MockRTCPeerConnection { + addEventListener() {} + removeEventListener() {} + } + + Object.defineProperty(globalThis, 'RTCPeerConnection', { + value: MockRTCPeerConnection, + writable: true, + configurable: true, + }); + }); + + it('makes addEventListener and removeEventListener writable and configurable', async () => { + await import('./webrtc-adapter.patch'); + + const addEventListenerDescriptor = Object.getOwnPropertyDescriptor( + RTCPeerConnection.prototype, + 'addEventListener' + ); + + const removeEventListenerDescriptor = Object.getOwnPropertyDescriptor( + RTCPeerConnection.prototype, + 'removeEventListener' + ); + + expect(addEventListenerDescriptor?.writable).toBe(true); + expect(addEventListenerDescriptor?.configurable).toBe(true); + + expect(removeEventListenerDescriptor?.writable).toBe(true); + expect(removeEventListenerDescriptor?.configurable).toBe(true); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/webrtc-adapter.patch/webrtc-adapter.patch.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/webrtc-adapter.patch/webrtc-adapter.patch.ts new file mode 100644 index 00000000..ede99b4f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/webrtc-adapter.patch/webrtc-adapter.patch.ts @@ -0,0 +1,21 @@ +(function correctWebRTCAdapterErrors() { + const shouldOverride = localStorage.getItem('error-test'); + if (shouldOverride) return; + + const NativeRTCPeerConnection = globalThis.RTCPeerConnection; + if (!NativeRTCPeerConnection) return; + + Object.defineProperty(NativeRTCPeerConnection.prototype, 'addEventListener', { + value: NativeRTCPeerConnection.prototype.addEventListener, + writable: true, + configurable: true, + }); + + Object.defineProperty(NativeRTCPeerConnection.prototype, 'removeEventListener', { + value: NativeRTCPeerConnection.prototype.removeEventListener, + writable: true, + configurable: true, + }); +})(); + +export {}; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/xmlHttpRequestEnvelop.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/xmlHttpRequestEnvelop.ts new file mode 100644 index 00000000..f7c6316b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/xmlHttpRequestEnvelop.ts @@ -0,0 +1,67 @@ +import { isFunction } from '@common/assertions'; +import type { AnyFunction } from '@common/types'; + +/** + * Utility to override XMLHttpRequest methods with custom handlers. + * + * In principle, we need to override sometimes the `open` of the XMLHttpRequest, + * but could be extended to other methods if needed and we already have the same pattern for patching other APIs + */ +const xmlHttpRequestEnvelop = (() => { + const originalRegistry = new Map(); + + const api = { + override< + K extends FunctionKeys, + Handler extends AnyFunction = XMLHttpRequest[K], + >( + method: K, + builder: (args: { + handler: Handler; + }) => (this: XMLHttpRequest, ...args: Parameters) => ReturnType + ): Unsubscribe { + const original = api.getOriginal(method); + + XMLHttpRequest.prototype[method] = builder({ handler: original }); + + return () => { + api.removeOverride(method); + }; + }, + + removeOverride>(method: K) { + const original = originalRegistry.get(method); + if (!original) return; + + XMLHttpRequest.prototype[method] = original; + originalRegistry.delete(method); + }, + + getOriginal< + K extends FunctionKeys, + Handler extends AnyFunction = XMLHttpRequest[K], + >(method: K): Handler { + const key = method as string; + + const cached = originalRegistry.get(key); + if (cached) return cached as Handler; + + const value = XMLHttpRequest.prototype[method]; + if (!isFunction(value)) return value as Handler; + + originalRegistry.set(key, value); + + return value as Handler; + }, + }; + + return api; +})(); + +type Unsubscribe = () => void; + +type FunctionKeys = { + [K in keyof T]: T[K] extends AnyFunction ? K : never; +}[keyof T]; + +export default xmlHttpRequestEnvelop; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/logger/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/logger/index.ts new file mode 100644 index 00000000..90495069 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/logger/index.ts @@ -0,0 +1,2 @@ +export { default } from './logger'; +export type { LoggerProviderConfig } from '@common/logger'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/logger/logger.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/logger/logger.ts new file mode 100644 index 00000000..dc14704a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/logger/logger.ts @@ -0,0 +1,3 @@ +import { LoggerBase } from '@common/logger'; + +export default new LoggerBase(); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/BitrateValue.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/BitrateValue.test.ts new file mode 100644 index 00000000..13306704 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/BitrateValue.test.ts @@ -0,0 +1,17 @@ +import { describe, it, expect } from 'vitest'; +import { bitrateValue } from './'; + +const locale = { locales: 'en-US' }; + +describe('BitrateValue', () => { + it('returns em-dash for zero or negative bitrate', () => { + expect(bitrateValue(0, locale).toString()).toBe('–'); + expect(bitrateValue(-1, locale).toString()).toBe('–'); + }); + + it('formats bitrate thresholds', () => { + expect(bitrateValue(999, locale).toString()).toBe('999 bps'); + expect(bitrateValue(1000, locale).toString()).toBe('1.0 kbps'); + expect(bitrateValue(1_000_000, locale).toString()).toBe('1.00 Mbps'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/BitrateValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/BitrateValue.ts new file mode 100644 index 00000000..60cc8c58 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/BitrateValue.ts @@ -0,0 +1,37 @@ +import MetricValue, { type MetricFormatArgs, type IMetricValue } from '../MetricValue'; + +const emptyValue = '–'; + +export class BitrateValue extends MetricValue implements IMetricValue { + constructor(value: number | string, args?: MetricFormatArgs) { + super({ name: 'BitrateValue', value, ...args }); + } + + protected override formatMetricValue(): string { + if (this.value <= 0) { + return emptyValue; + } + + if (this.value < 1000) { + return `${this.formatInteger(Math.round(this.value))} bps`; + } + + if (this.value < 1000 * 1000) { + return `${this.formatNumber(this.value / 1000, { + minimumFractionDigits: 1, + maximumFractionDigits: 1, + })} kbps`; + } + + return `${this.formatNumber(this.value / (1000 * 1000), { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + })} Mbps`; + } +} + +export function bitrateValue(value: number | string, args?: MetricFormatArgs): BitrateValue { + return new BitrateValue(value, args); +} + +export default BitrateValue; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/index.ts new file mode 100644 index 00000000..a4db9bb9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/index.ts @@ -0,0 +1 @@ +export { default, bitrateValue } from './BitrateValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/BytesValue.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/BytesValue.test.ts new file mode 100644 index 00000000..aacbe5f2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/BytesValue.test.ts @@ -0,0 +1,13 @@ +import { describe, it, expect } from 'vitest'; +import { bytesValue } from './'; + +const locale = { locales: 'en-US' }; + +describe('BytesValue', () => { + it('formats bytes and unit thresholds', () => { + expect(bytesValue(1023, locale).toString()).toBe('1,023 B'); + expect(bytesValue(1024, locale).toString()).toBe('1.0 KB'); + expect(bytesValue(1024 * 1024, locale).toString()).toBe('1.0 MB'); + expect(bytesValue(1024 * 1024 * 1024, locale).toString()).toBe('1.0 GB'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/BytesValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/BytesValue.ts new file mode 100644 index 00000000..b12714b9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/BytesValue.ts @@ -0,0 +1,38 @@ +import MetricValue, { type MetricFormatArgs, type IMetricValue } from '../MetricValue'; + +export class BytesValue extends MetricValue implements IMetricValue { + constructor(value: number | string, args?: MetricFormatArgs) { + super({ name: 'BytesValue', value, ...args }); + } + + protected override formatMetricValue(): string { + if (this.value < 1024) { + return `${this.formatInteger()} B`; + } + + if (this.value < 1024 * 1024) { + return `${this.formatNumber(this.value / 1024, { + minimumFractionDigits: 1, + maximumFractionDigits: 1, + })} KB`; + } + + if (this.value < 1024 * 1024 * 1024) { + return `${this.formatNumber(this.value / (1024 * 1024), { + minimumFractionDigits: 1, + maximumFractionDigits: 1, + })} MB`; + } + + return `${this.formatNumber(this.value / (1024 * 1024 * 1024), { + minimumFractionDigits: 1, + maximumFractionDigits: 1, + })} GB`; + } +} + +export function bytesValue(value: number | string, args?: MetricFormatArgs): BytesValue { + return new BytesValue(value, args); +} + +export default BytesValue; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/index.ts new file mode 100644 index 00000000..e2ab0e45 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/index.ts @@ -0,0 +1 @@ +export { default, bytesValue } from './BytesValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/DurationValue.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/DurationValue.test.ts new file mode 100644 index 00000000..50419183 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/DurationValue.test.ts @@ -0,0 +1,11 @@ +import { describe, it, expect } from 'vitest'; +import { durationValue } from './'; + +const locale = { locales: 'en-US' }; + +describe('DurationValue', () => { + it('formats millisecond and second thresholds', () => { + expect(durationValue(999, locale).toString()).toBe('999 ms'); + expect(durationValue(1000, locale).toString()).toBe('1.0 s'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/DurationValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/DurationValue.ts new file mode 100644 index 00000000..3eccae5b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/DurationValue.ts @@ -0,0 +1,24 @@ +import MetricValue, { type MetricFormatArgs, type IMetricValue } from '../MetricValue'; + +export class DurationValue extends MetricValue implements IMetricValue { + constructor(value: number | string, args?: MetricFormatArgs) { + super({ name: 'DurationValue', value, ...args }); + } + + protected override formatMetricValue(): string { + if (this.value < 1000) { + return `${this.formatInteger()} ms`; + } + + return `${this.formatNumber(this.value / 1000, { + minimumFractionDigits: 1, + maximumFractionDigits: 1, + })} s`; + } +} + +export function durationValue(value: number | string, args?: MetricFormatArgs): DurationValue { + return new DurationValue(value, args); +} + +export default DurationValue; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/index.ts new file mode 100644 index 00000000..d0d453bb --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/index.ts @@ -0,0 +1 @@ +export { default, durationValue } from './DurationValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/FrameRateValue.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/FrameRateValue.test.ts new file mode 100644 index 00000000..7150ccf7 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/FrameRateValue.test.ts @@ -0,0 +1,16 @@ +import { describe, it, expect } from 'vitest'; +import { frameRateValue } from './'; + +const locale = { locales: 'en-US' }; + +describe('FrameRateValue', () => { + it('returns em-dash for zero or negative frame rate', () => { + expect(frameRateValue(0, locale).toString()).toBe('–'); + expect(frameRateValue(-1, locale).toString()).toBe('–'); + }); + + it('rounds and appends fps', () => { + expect(frameRateValue(24.4, locale).toString()).toBe('24 fps'); + expect(frameRateValue(29.9, locale).toString()).toBe('30 fps'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/FrameRateValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/FrameRateValue.ts new file mode 100644 index 00000000..dd9c3e00 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/FrameRateValue.ts @@ -0,0 +1,23 @@ +import MetricValue, { type MetricFormatArgs, type IMetricValue } from '../MetricValue'; + +const emptyValue = '–'; + +export class FrameRateValue extends MetricValue implements IMetricValue { + constructor(value: number | string, args?: MetricFormatArgs) { + super({ name: 'FrameRateValue', value, ...args }); + } + + protected override formatMetricValue(): string { + if (this.value <= 0) { + return emptyValue; + } + + return `${this.formatInteger(Math.round(this.value))} fps`; + } +} + +export function frameRateValue(value: number | string, args?: MetricFormatArgs): FrameRateValue { + return new FrameRateValue(value, args); +} + +export default FrameRateValue; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/index.ts new file mode 100644 index 00000000..f22d81c5 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/index.ts @@ -0,0 +1 @@ +export { default, frameRateValue } from './FrameRateValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/IntegerValue.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/IntegerValue.test.ts new file mode 100644 index 00000000..22da66ef --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/IntegerValue.test.ts @@ -0,0 +1,12 @@ +import { describe, it, expect } from 'vitest'; +import { integerValue } from './'; + +describe('IntegerValue', () => { + it('formats a whole number', () => { + expect(integerValue(1280, { locales: 'en-US' }).toString()).toBe('1,280'); + }); + + it('truncates fractional digits', () => { + expect(integerValue(99.9, { locales: 'en-US' }).toString()).toBe('100'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/IntegerValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/IntegerValue.ts new file mode 100644 index 00000000..4a8dc5d2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/IntegerValue.ts @@ -0,0 +1,17 @@ +import MetricValue, { type MetricFormatArgs, type IMetricValue } from '../MetricValue/MetricValue'; + +export class IntegerValue extends MetricValue implements IMetricValue { + constructor(value: number | string, args?: MetricFormatArgs) { + super({ name: 'IntegerValue', value, ...args }); + } + + protected override formatMetricValue(): string { + return this.formatInteger(); + } +} + +export function integerValue(value: number | string, args?: MetricFormatArgs): IntegerValue { + return new IntegerValue(value, args); +} + +export default IntegerValue; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/index.ts new file mode 100644 index 00000000..41628b7d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/index.ts @@ -0,0 +1 @@ +export { default, integerValue } from './IntegerValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/MetricValue/MetricValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/MetricValue/MetricValue.ts new file mode 100644 index 00000000..8547e257 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/MetricValue/MetricValue.ts @@ -0,0 +1,102 @@ +import assertResult from '@common/execution/assertResult'; +import { assertNotNil, assertNumericString, isNumber } from '@common/assertions'; +import { ApplicationClientError } from '@core/errors'; + +export type MetricFormatArgs = { + locales?: Intl.LocalesArgument; + options?: Intl.NumberFormatOptions; +}; + +export interface IMetricValue { + /** + * The name of the metric value, used for identification and error reporting. + */ + readonly name: string; + + /** + * The value of the metric. + */ + readonly value: TValue; + + /** + * Returns a string representation of the metric value, formatted according to the specified locales and options. + */ + toString(): string; +} + +export abstract class MetricValue implements IMetricValue { + public readonly name: string; + + public readonly value: number; + + protected readonly locales?: Intl.LocalesArgument; + protected readonly options?: Intl.NumberFormatOptions; + + private _stringValue: string | null = null; + + constructor(args: { + name: string; + value: number | string; + locales?: Intl.LocalesArgument; + options?: Intl.NumberFormatOptions; + }) { + this.name = args.name; + this.value = this.readInitialValue(args.value); + + this.locales = args.locales; + this.options = { + minimumFractionDigits: 0, + maximumFractionDigits: 2, + ...args.options, + }; + } + + public get stringValue(): string { + return this.toString(); + } + + public toString(): string { + if (this._stringValue === null) { + this._stringValue = this.formatMetricValue(); + } + + return this._stringValue; + } + + protected abstract formatMetricValue(): string; + + protected readInitialValue(value: number | string): number { + return assertResult( + () => { + assertNotNil(value, `${this.name}: value cannot be null or undefined`); + + if (isNumber(value)) { + return value; + } + + assertNumericString(value, `${this.name}: ${value} is not a valid number string`); + + return Number(value.trim()); + }, + (error) => + new ApplicationClientError({ + src: error, + fallbackConfig: { + fallbackMessage: `${this.name}: Invalid value`, + }, + }) + ); + } + + protected formatNumber(value = this.value, options = this.options): string { + return new Intl.NumberFormat(this.locales, options).format(value); + } + + protected formatInteger(value = this.value): string { + return this.formatNumber(value, { + maximumFractionDigits: 0, + }); + } +} + +export default MetricValue; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/MetricValue/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/MetricValue/index.ts new file mode 100644 index 00000000..41d132af --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/MetricValue/index.ts @@ -0,0 +1 @@ +export { default, type MetricFormatArgs, type IMetricValue } from './MetricValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/OptionalValue.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/OptionalValue.test.ts new file mode 100644 index 00000000..6b4bad27 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/OptionalValue.test.ts @@ -0,0 +1,22 @@ +import { describe, it, expect } from 'vitest'; +import { optionalValue } from './'; +import { BytesValue } from '../BytesValue/BytesValue'; + +const args = { locales: 'en-US' }; + +describe('optionalValue', () => { + it('returns the metric instance when value is non-null', () => { + const result = optionalValue(BytesValue, 1024, args); + + expect(result.toString()).toBe('1.0 KB'); + expect(result.metric).toBeInstanceOf(BytesValue); + }); + + it('returns an empty string by default when value is null', () => { + expect(optionalValue(BytesValue, null, args).toString()).toBe(''); + }); + + it('returns the custom fallback when value is null', () => { + expect(optionalValue(BytesValue, null, { fallback: '–' }).toString()).toBe('–'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/OptionalValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/OptionalValue.ts new file mode 100644 index 00000000..5d3ffaea --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/OptionalValue.ts @@ -0,0 +1,91 @@ +import { isNil, isRecord } from '@common/assertions'; +import { + type IMetricValue, + type MetricFormatArgs as MetricFormatArgsBase, +} from '../MetricValue/MetricValue'; +import { Any } from '@common/types'; + +type MetricFormatArgs = MetricFormatArgsBase & { + fallback?: string; +}; + +type IMetricClass> = new ( + value: Metric['value'], + args?: MetricFormatArgs +) => Metric; + +class OptionalValue> implements IMetricValue { + public readonly name = 'OptionalValue'; + + public readonly fallback: string = ''; + + public readonly metric: Metric | null; + + public get value(): Metric['value'] | null { + if (isNil(this.metric)) return null; + return this.metric.value as Metric['value']; + } + + constructor(metric: IMetricClass, args?: MetricFormatArgs); + + constructor( + MetricClass: IMetricClass, + value: Metric['value'] | null | undefined, + args?: MetricFormatArgs + ); + + constructor( + arg1: IMetricClass | Metric['value'] | null | undefined, + arg2?: Metric['value'] | MetricFormatArgs | null, + arg3?: MetricFormatArgs + ) { + const isMetricValue = + isRecord(arg1) && Object.hasOwn(arg1, 'value') && Object.hasOwn(arg1, 'toString'); + + const args = (isMetricValue ? arg2 : arg3) as MetricFormatArgs | undefined; + + const metric = (() => { + if (isMetricValue) return arg1 as Metric; + + const MetricClass = arg1 as IMetricClass; + const value = arg2 as Metric['value'] | null | undefined; + + if (isNil(value)) return null; + + return new MetricClass(value, args); + })(); + + this.metric = metric; + this.fallback = args?.fallback ?? ''; + } + + toString(): string { + if (isNil(this.metric)) return this.fallback; + return this.metric.toString(); + } +} + +/** + * Creates an instance of `OptionalValue` for the specified metric class and value. + */ +export function optionalValue>( + metric: IMetricClass, + args?: MetricFormatArgs +): OptionalValue; + +/** + * Creates an instance of `OptionalValue` for the specified metric. + */ +export function optionalValue>( + MetricClass: IMetricClass, + value: Metric['value'] | null | undefined, + args?: MetricFormatArgs +): OptionalValue; + +export function optionalValue>( + ...args: ConstructorParameters> +) { + return new OptionalValue(...args); +} + +export default OptionalValue; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/index.ts new file mode 100644 index 00000000..7cfa6883 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/index.ts @@ -0,0 +1 @@ +export { default, optionalValue } from './OptionalValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/PacketLossValue.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/PacketLossValue.test.ts new file mode 100644 index 00000000..e2a48cd1 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/PacketLossValue.test.ts @@ -0,0 +1,11 @@ +import { describe, it, expect } from 'vitest'; +import { packetLossValue } from './'; + +const locale = { locales: 'en-US' }; + +describe('PacketLossValue', () => { + it('formats ratio as percentage with 2 decimal places', () => { + expect(packetLossValue(0.1234, locale).toString()).toBe('12.34%'); + expect(packetLossValue(0, locale).toString()).toBe('0.00%'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/PacketLossValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/PacketLossValue.ts new file mode 100644 index 00000000..571a69ae --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/PacketLossValue.ts @@ -0,0 +1,20 @@ +import MetricValue, { type MetricFormatArgs, type IMetricValue } from '../MetricValue/MetricValue'; + +export class PacketLossValue extends MetricValue implements IMetricValue { + constructor(value: number | string, args?: MetricFormatArgs) { + super({ name: 'PacketLossValue', value, ...args }); + } + + protected override formatMetricValue(): string { + return `${this.formatNumber(this.value * 100, { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + })}%`; + } +} + +export function packetLossValue(value: number | string, args?: MetricFormatArgs): PacketLossValue { + return new PacketLossValue(value, args); +} + +export default PacketLossValue; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/index.ts new file mode 100644 index 00000000..7e036d0b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/index.ts @@ -0,0 +1 @@ +export { default, packetLossValue } from './PacketLossValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/ResolutionValue.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/ResolutionValue.test.ts new file mode 100644 index 00000000..7afb106b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/ResolutionValue.test.ts @@ -0,0 +1,22 @@ +import { describe, it, expect } from 'vitest'; +import { resolutionValue } from './'; + +describe('ResolutionValue', () => { + it('returns em-dash for null or incomplete resolution', () => { + expect(resolutionValue(null).toString()).toBe('–'); + expect(resolutionValue({ width: null, height: 720 }).toString()).toBe('–'); + expect(resolutionValue({ width: 1280, height: null }).toString()).toBe('–'); + }); + + it('returns em-dash for zero dimensions', () => { + expect(resolutionValue({ width: 0, height: 720 }).toString()).toBe('–'); + }); + + it('formats valid resolution without thousands separators', () => { + expect(resolutionValue({ width: 1280, height: 720 }).toString()).toBe('1280x720'); + }); + + it('accepts string dimensions', () => { + expect(resolutionValue({ width: 1920, height: 1080 }).toString()).toBe('1920x1080'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/ResolutionValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/ResolutionValue.ts new file mode 100644 index 00000000..3b8d1f94 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/ResolutionValue.ts @@ -0,0 +1,64 @@ +import type { IMetricValue, MetricFormatArgs } from '../MetricValue/MetricValue'; + +export type Resolution = { + width: number | null; + height: number | null; +}; + +export class ResolutionValue implements IMetricValue { + public readonly name = 'ResolutionValue'; + + public readonly value: Resolution; + + constructor(resolution: Resolution | null, _args?: MetricFormatArgs) { + this.value = { + width: parseDimension(resolution?.width ?? null), + height: parseDimension(resolution?.height ?? null), + }; + } + + public get stringValue(): string { + return this.toString(); + } + + public toString(): string { + if (this.value.width === null || this.value.height === null) { + return '–'; + } + + if (this.value.width <= 0 || this.value.height <= 0) { + return '–'; + } + + return `${this.value.width}x${this.value.height}`; + } +} + +export function resolutionValue( + resolution: Resolution | null, + args?: MetricFormatArgs +): ResolutionValue { + return new ResolutionValue(resolution, args); +} + +export default ResolutionValue; + +function parseDimension(value: number | string | null | undefined): number | null { + if (value === null || value === undefined) { + return null; + } + + if (typeof value === 'number') { + return Number.isFinite(value) ? value : null; + } + + const trimmed = value.trim(); + + if (!trimmed) { + return null; + } + + const parsed = Number(trimmed); + + return Number.isFinite(parsed) ? parsed : null; +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/index.ts new file mode 100644 index 00000000..6ce31aee --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/index.ts @@ -0,0 +1 @@ +export { default, resolutionValue, type Resolution } from './ResolutionValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/index.ts new file mode 100644 index 00000000..b38162ae --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/index.ts @@ -0,0 +1,9 @@ +export { default as MetricValue, type IMetricValue, type MetricFormatArgs } from './MetricValue'; +export { default as IntegerValue, integerValue } from './IntegerValue'; +export { default as BytesValue, bytesValue } from './BytesValue'; +export { default as FrameRateValue, frameRateValue } from './FrameRateValue'; +export { default as BitrateValue, bitrateValue } from './BitrateValue'; +export { default as PacketLossValue, packetLossValue } from './PacketLossValue'; +export { default as DurationValue, durationValue } from './DurationValue'; +export { default as OptionalValue, optionalValue } from './OptionalValue'; +export { default as ResolutionValue, resolutionValue, type Resolution } from './ResolutionValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/index.ts new file mode 100644 index 00000000..5b8a08e4 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/index.ts @@ -0,0 +1 @@ +export { default as createVideoClient, type VideoClient } from './videoClient'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/createVideoClient.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/createVideoClient.test.ts new file mode 100644 index 00000000..1e653c6f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/createVideoClient.test.ts @@ -0,0 +1,69 @@ +import { vi, describe, it, expect, beforeEach } from 'vitest'; +import { createTRPCClient, httpBatchLink } from '@trpc/client'; +import createVideoClient from './createVideoClient'; + +vi.mock('@trpc/client', () => { + const httpBatchLink = vi.fn(() => 'mock-link'); + + const mutate = vi.fn(); + + const createTRPCClient = vi.fn(() => ({ + createSession: { mutate }, + joinSession: { mutate }, + createSessionAndJoin: { mutate }, + startArchive: { mutate }, + stopArchive: { mutate }, + searchArchives: { mutate }, + enableCaptions: { mutate }, + disableCaptions: { mutate }, + ensureCaptionsEnabled: { mutate }, + })); + + return { createTRPCClient, httpBatchLink }; +}); + +describe('createVideoClient', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it('should create a client with httpBatchLink when given link options', () => { + const linkOptions = { url: 'http://localhost:4000/trpc' }; + + createVideoClient(linkOptions); + + expect(httpBatchLink).toHaveBeenCalledWith(linkOptions); + expect(createTRPCClient).toHaveBeenCalledWith({ + links: ['mock-link'], + }); + }); + + it('should create a client with provided links array', () => { + const links = ['custom-link'] as never[]; + + createVideoClient(links); + + expect(httpBatchLink).not.toHaveBeenCalled(); + expect(createTRPCClient).toHaveBeenCalledWith({ + links, + }); + }); + + it('should flatten the proxy so procedures are called directly instead of via .mutate', async () => { + const client = createVideoClient({ url: 'http://localhost:4000/trpc' }); + + const payload = { roomName: 'test-room' }; + await client.createSession(payload); + + const mockTrpcClient = vi.mocked(createTRPCClient).mock.results[0].value; + expect(mockTrpcClient.createSession.mutate).toHaveBeenCalledWith(payload); + }); + + it('should throw when accessing a procedure that does not exist', () => { + const client = createVideoClient({ url: 'http://localhost:4000/trpc' }); + + expect(() => { + void (client as Record).nonExistent; + }).toThrow('Procedure nonExistent does not exist on the video client'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/createVideoClient.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/createVideoClient.ts new file mode 100644 index 00000000..98f7f75b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/createVideoClient.ts @@ -0,0 +1,96 @@ +// eslint-disable-next-line @nx/enforce-module-boundaries +import type { IVideoRouter } from '../../../../api/src/types/IVideoRouter'; +import { createTRPCClient, httpBatchLink } from '@trpc/client'; +import type { Prettify, AnyFunction } from '@common/types'; + +/** + * Creates a video client for interacting with the video API. + * + * @example + * ```ts + * const videoClient = createVideoClient({ + * url: 'http://localhost:4000/trpc', + * }); + * + * videoClient.createSession(); // creates a new session + * videoClient.createSession({ sessionId: 'existing-session-id' }); // uses an existing session + * ``` + */ +function createVideoClient(linkOptions: LinkOptions): VideoClient; + +/** + * Creates a video client for interacting with the video API. + * + * @example + * ```ts + * const videoClient = createVideoClient({ + * links: [ + * httpBatchLink({ + * url: 'http://localhost:4000/trpc', + * }), + * ], + * }); + * + * videoClient.createSession(); // creates a new session + * videoClient.createSession({ sessionId: 'existing-session-id' }); // uses an existing session + * ``` + */ +function createVideoClient(links: Links): VideoClient; + +function createVideoClient(args: Links | LinkOptions): VideoClient { + const options: Options = (() => { + if (Array.isArray(args)) { + return { links: args }; + } + + return { + links: [httpBatchLink(args)], + }; + })(); + + const trpcClient = createTRPCClient(options); + + // make the proxy flatter for a better developer experience, so instead of videoClient.createSession.mutate() it's just videoClient.createSession() + const proxy = new Proxy(trpcClient, { + get(target, property: string) { + const procedure = target[property as keyof typeof target]; + + if (!procedure) { + throw new Error(`Procedure ${property} does not exist on the video client`); + } + + return (procedure as MutateProcedure).mutate; + }, + }) as unknown as VideoClient; + + return proxy; +} + +type VideoClientBase = ReturnType>; + +type MutateProcedure = { + mutate: AnyFunction; +}; + +type Normalize = { + [K in keyof T]: T[K] extends MutateProcedure ? T[K]['mutate'] : T[K]; +}; + +type OnlyFunctions = { + [K in keyof T as T[K] extends AnyFunction ? K : never]: T[K]; +}; + +type SanitizedVideoClient = OnlyFunctions>; + +/** + * Video client to communicate with a vonage video handler. + */ +export type VideoClient = Prettify; + +type Options = Prettify>[0]>; + +type Links = Options['links']; + +type LinkOptions = Parameters>[0]; + +export default createVideoClient; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/index.ts new file mode 100644 index 00000000..88bc731d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/index.ts @@ -0,0 +1 @@ +export { default, type VideoClient } from './createVideoClient'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/getUserMedia/getUserMedia.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/getUserMedia/getUserMedia.spec.ts index fb34dc76..da06dbfd 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/getUserMedia/getUserMedia.spec.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/getUserMedia/getUserMedia.spec.ts @@ -2,6 +2,7 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import getUserMedia from '.'; import mediaDevices$ from '../../devices$'; import { makeMediaDeviceInfos, setupWindowNavigatorMock } from '@web-test/fixtures'; +import { mediaDevicesEnvelop } from '@core/interceptors'; const devices = makeMediaDeviceInfos(); @@ -21,6 +22,8 @@ describe('getUserMedia', () => { }, }); + mediaDevicesEnvelop.rebind(navigator); + mediaDevices$.reset(); }); @@ -47,4 +50,57 @@ describe('getUserMedia', () => { expect(result).toBe(mockStream); }); + + it('should sync media devices info after successfully getting user media', async () => { + const constraints = { audio: true }; + const boundGetUserMedia = getUserMedia.bind(mediaDevices$.actions); + const action = boundGetUserMedia(constraints); + const syncMediaDevicesInfoSpy = vi.spyOn(mediaDevices$.actions, 'syncMediaDevicesInfo'); + + await action(mediaDevices$); + + expect(syncMediaDevicesInfoSpy).toHaveBeenCalledTimes(1); + }); + + it('should normalize Firefox permission denial errors for the sdk', async () => { + const reason = new Error('The object can not be found here'); + reason.name = 'NotFoundError'; + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve(devices), + getUserMedia: Promise.reject(reason), + }, + }); + + mediaDevicesEnvelop.rebind(navigator); + + const boundGetUserMedia = getUserMedia.bind(mediaDevices$.actions); + const action = boundGetUserMedia({ audio: true, video: true }); + + await expect(action(mediaDevices$)).rejects.toEqual( + new DOMException('Permission denied by system', 'NotAllowedError') + ); + }); + + it('should rethrow non Firefox permission errors', async () => { + const reason = new Error('Camera is busy'); + reason.name = 'NotReadableError'; + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve(devices), + getUserMedia: Promise.reject(reason), + }, + }); + + mediaDevicesEnvelop.rebind(navigator); + + const boundGetUserMedia = getUserMedia.bind(mediaDevices$.actions); + const action = boundGetUserMedia({ audio: true }); + + await expect(action(mediaDevices$)).rejects.toBe(reason); + }); }); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/getUserMedia/getUserMedia.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/getUserMedia/getUserMedia.ts index edf635b3..823f04b8 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/getUserMedia/getUserMedia.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/getUserMedia/getUserMedia.ts @@ -1,16 +1,34 @@ import type { DevicesAPI } from '../../types'; +import { mediaDevicesEnvelop } from '@core/interceptors'; /** * Wrapper around navigator.mediaDevices.getUserMedia that also syncs the media devices info in the store after successfully getting user media. * This ensures that the store is always up to date with the latest media permissions and devices info, even if getUserMedia is called outside of the store's actions. */ -function getUserMedia(this: DevicesAPI['actions'], constraints: MediaStreamConstraints) { - return ({ getMetadata }: DevicesAPI): Promise => { - return getMetadata().__getUserMedia!(constraints).then((stream) => { - // After successfully getting user media, sync the media devices info - void this.syncMediaDevicesInfo(); - return stream; - }); +function getUserMedia(this: DevicesAPI['actions'], constraints?: MediaStreamConstraints) { + return (_api: DevicesAPI): Promise => { + // vanilla getUserMedia + const _getUserMedia = mediaDevicesEnvelop.getOriginal('getUserMedia'); + + return _getUserMedia(constraints) + .then((stream) => { + // After successfully getting user media, sync the media devices info + void this.syncMediaDevicesInfo(); + return stream; + }) + .catch((reason) => { + // The sdk is expecting the non access error to have an specific type of format + // firefox is not following the standard error format for permission denial, so we need to detect this case and throw a standardized error for the sdk to handle it properly. + const isFirefoxPermissionDenial = + reason.name === 'NotFoundError' && + reason.message.includes('The object can not be found here'); + + if (isFirefoxPermissionDenial) { + throw new DOMException('Permission denied by system', 'NotAllowedError'); + } + + throw reason; + }); }; } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/selectDevice/selectDevice.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/selectDevice/selectDevice.ts index 68b55ee8..7050b7d9 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/selectDevice/selectDevice.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/selectDevice/selectDevice.ts @@ -47,7 +47,7 @@ function selectDevice( assertMediaDeviceInfo(devicesInfo); - if (kind !== 'audiooutput') await assertMediaStreamAccess({ kind, deviceId }); + if (kind !== 'audiooutput') await assertMediaStreamAccess(devicesInfo); // reconcile audio output device with Vonage SDK if it changed if (kind === 'audiooutput' && isSinkIdSupported()) { diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/frontFacingKeywords.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/frontFacingKeywords.ts new file mode 100644 index 00000000..363b120b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/frontFacingKeywords.ts @@ -0,0 +1,3 @@ +const frontFacingKeywords = ['front', 'user', 'facetime', 'selfie', 'face'] as const; + +export default frontFacingKeywords; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/index.ts index 12303326..21ca97b6 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/index.ts @@ -1,2 +1,4 @@ export { default as metadata } from './metadata'; export { default as initialValue } from './initialValue'; +export { default as frontFacingKeywords } from './frontFacingKeywords'; +export { default as rearFacingKeywords } from './rearFacingKeywords'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/metadata.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/metadata.ts index a71d6542..b554dcdd 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/metadata.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/metadata.ts @@ -27,9 +27,9 @@ const metadata = () => { isStoreReady: CancelablePromise.resolve(), /** - * bound vanilla getUserMedia function + * Tracks whether the next media devices query is the bootstrap query executed while the store readiness promise is still being created. */ - __getUserMedia: undefined as typeof globalThis.navigator.mediaDevices.getUserMedia | undefined, + isFirstMediaDevicesInfoQuery: true, }; markDevicesApiMetadata(meta); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/rearFacingKeywords.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/rearFacingKeywords.ts new file mode 100644 index 00000000..a36597b0 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/rearFacingKeywords.ts @@ -0,0 +1,3 @@ +const rearFacingKeywords = ['rear', 'back', 'environment', 'world', 'main'] as const; + +export default rearFacingKeywords; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/devices$.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/devices$.test.ts index ae5f9dde..8d1f6e86 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/devices$.test.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/devices$.test.ts @@ -2,6 +2,7 @@ import { renderHook, waitFor } from '@testing-library/react'; import mediaDevices$ from './devices$'; import { vi, it, expect, describe, beforeEach } from 'vitest'; import { makeMediaDeviceInfos, setupWindowNavigatorMock } from '@web-test/fixtures'; +import { mediaDevicesEnvelop } from '@core/interceptors'; describe('mediaDevices$ namespace', () => { beforeEach(() => { @@ -15,6 +16,8 @@ describe('mediaDevices$ namespace', () => { } as unknown as MediaStream), }, }); + + mediaDevicesEnvelop.rebind(navigator); }); it('should update devices when devicechange event triggers', async () => { diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/assertMediaStreamAccess.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/assertMediaStreamAccess.ts index 6c1ce9fd..d0e94663 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/assertMediaStreamAccess.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/assertMediaStreamAccess.ts @@ -1,19 +1,32 @@ -type Args = { - kind: MediaDeviceKind; - deviceId: string; -}; +import { assertResult } from '@common/execution'; +import { makeApplicationErrorMapper, ErrorCode } from '@core/errors'; +import { MediaDeviceInfoJSON } from '@web/types'; -const assertMediaStreamAccess = async ({ kind, deviceId }: Args): Promise => { +const assertMediaStreamAccess = async ({ + kind, + deviceId, + label, +}: MediaDeviceInfoJSON): Promise => { const constraints: MediaStreamConstraints = { audio: kind === 'audioinput' ? { deviceId: { exact: deviceId } } : false, video: kind === 'videoinput' ? { deviceId: { exact: deviceId } } : false, }; - const stream = await navigator.mediaDevices.getUserMedia(constraints).catch((error: Error) => { - throw new Error(`Failed to access ${kind} device: ${deviceId}`, { cause: error }); - }); + const stream = await assertResult( + () => navigator.mediaDevices.getUserMedia(constraints), + makeApplicationErrorMapper({ + fallbackMessage: `Failed to access ${kind} device: ${label}`, + type: ErrorCode.DeviceAccess, + }) + ); - stream.getTracks().forEach((track) => track.stop()); + assertResult( + () => stream.getTracks().forEach((track) => track.stop()), + makeApplicationErrorMapper({ + fallbackMessage: `Failed to access ${kind} track for device: ${label}`, + type: ErrorCode.DevicesTrackUnavailable, + }) + ); }; export default assertMediaStreamAccess; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/getMediaDevicesInfo.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/getMediaDevicesInfo.spec.ts new file mode 100644 index 00000000..7bbde4c6 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/getMediaDevicesInfo.spec.ts @@ -0,0 +1,70 @@ +import { describe, it, expect, beforeEach, vi } from 'vitest'; +import { FacingMode } from '@common/types'; +import { isMobile } from '@web/platform'; +import { + makeMediaDeviceInfos, + frontCameraId, + rearCameraId, + setupWindowNavigatorMock, +} from '@web-test/fixtures'; +import mediaDevices$ from '../../devices$'; +import getMediaDevicesInfo$ from '.'; + +vi.mock('@web/platform', async (importOriginal) => { + const actual = await importOriginal(); + + return { + ...actual, + isMobile: vi.fn(() => false), + }; +}); + +const deviceWithoutId = { + deviceId: '', + label: 'device without id', +} as unknown as MediaDeviceInfo; + +const { getMediaDevicesInfo } = getMediaDevicesInfo$(mediaDevices$); + +describe('getMediaDevicesInfo', () => { + beforeEach(() => { + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve([...makeMediaDeviceInfos(), deviceWithoutId]), + }, + }); + + mediaDevices$.reset(); + }); + + it('filters devices without deviceId and infers facing mode on mobile videoinput labels', async () => { + expect.assertions(5); + + vi.mocked(isMobile).mockReturnValue(true); + + const result = await getMediaDevicesInfo(); + + expect(result.some((device) => !device.deviceId)).toBe(false); + + const frontCamera = result.find((device) => device.deviceId === frontCameraId); + const rearCamera = result.find((device) => device.deviceId === rearCameraId); + const externalCamera = result.find((device) => device.deviceId === 'video-input-3'); + + expect(frontCamera?.inferredFacingMode).toBe(FacingMode.user); + expect(rearCamera?.inferredFacingMode).toBe(FacingMode.environment); + expect(externalCamera?.inferredFacingMode).toBe(FacingMode.unknown); + expect(result.find((device) => device.deviceId === deviceWithoutId.deviceId)).toBeUndefined(); + }); + + it('returns null inferred facing mode when platform is not mobile', async () => { + expect.assertions(1); + + vi.mocked(isMobile).mockReturnValue(false); + + const result = await getMediaDevicesInfo(); + const videoInputDevices = result.filter((device) => device.kind === 'videoinput'); + + expect(videoInputDevices.every((device) => device.inferredFacingMode === null)).toBe(true); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/getMediaDevicesInfo.ts similarity index 51% rename from tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo.ts rename to tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/getMediaDevicesInfo.ts index 5d851a08..0038e2bc 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/getMediaDevicesInfo.ts @@ -1,14 +1,21 @@ import { idempotentCallbackWithRetry } from '@common/execution'; import type { MediaDeviceInfoJSON } from '@web/types'; -import { DevicesAPI } from '../types'; +import { DevicesAPI } from '../../types'; import { actions } from 'react-global-state-hooks'; +import { FacingMode } from '@common/types'; +import { frontFacingKeywords, rearFacingKeywords } from '../../constants'; +import { isMobile } from '@web/platform'; + /** * Retrieves the list of media devices from the browser. */ const getMediaDevicesInfo$ = actions()({ getMediaDevicesInfo() { return ({ getMetadata }): Promise => { - const { isStoreReady } = getMetadata(); + const metadata = getMetadata(); + const shouldSkipStoreReady = metadata.isFirstMediaDevicesInfoQuery; + + metadata.isFirstMediaDevicesInfoQuery = false; /** * Some browsers may intermittently fail to return the device list. @@ -17,21 +24,26 @@ const getMediaDevicesInfo$ = actions()({ return idempotentCallbackWithRetry( async () => { // Wait for permissions to be resolved before querying devices, as some browsers (e.g., Firefox) require permissions to be granted before providing device labels and IDs. - await isStoreReady; + if (!shouldSkipStoreReady) { + await metadata.isStoreReady; + } // Convert MediaDeviceInfo objects to plain JSON-serializable objects // native MediaDeviceInfo objects have methods and properties that may not be serializable, or work well when destructured, // so we create plain objects with the same properties. return navigator.mediaDevices.enumerateDevices().then((devices) => devices - .map((device) => ({ - deviceId: device.deviceId, - kind: device.kind, - label: device.label, - groupId: device.groupId, - })) // In case there are remaining devices without deviceId .filter((device) => device.deviceId) + .map( + (device): MediaDeviceInfoJSON => ({ + deviceId: device.deviceId, + kind: device.kind, + label: device.label, + groupId: device.groupId, + inferredFacingMode: inferFacingModeFromLabel({ device }), + }) + ) ); }, { @@ -42,4 +54,21 @@ const getMediaDevicesInfo$ = actions()({ }, }); +function inferFacingModeFromLabel({ device }: { device: MediaDeviceInfo }): FacingMode | null { + const shouldInferFacingMode = isMobile() && device.kind === 'videoinput' && device.label; + if (!shouldInferFacingMode) return null; + + const label = device.label.toLowerCase(); + + if (frontFacingKeywords.some((keyword) => label.includes(keyword))) { + return FacingMode.user; + } + + if (rearFacingKeywords.some((keyword) => label.includes(keyword))) { + return FacingMode.environment; + } + + return FacingMode.unknown; +} + export default getMediaDevicesInfo$; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/index.ts new file mode 100644 index 00000000..62894220 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/index.ts @@ -0,0 +1 @@ +export { default } from './getMediaDevicesInfo'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/setupDeviceStore/setupDeviceStore.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/setupDeviceStore/setupDeviceStore.test.ts index 060fe707..c6a0ed61 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/setupDeviceStore/setupDeviceStore.test.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/setupDeviceStore/setupDeviceStore.test.ts @@ -4,10 +4,10 @@ import { waitFor } from '@testing-library/dom'; import mediaDevices$ from '../../devices$'; import { setupPartialMock } from '@common-test/helpers'; import { SPY_MARK } from '@common/types'; -import { setupWindowNavigatorMock } from '@web-test/fixtures'; +import { setupWindowNavigatorMock, makeMediaDeviceInfos } from '@web-test/fixtures'; import * as vonageClientSdk from '@vonage/client-sdk-video'; import * as isFirefoxModule from '@web/platform/isFirefox'; -import { makeMediaDeviceInfos } from '@web-test/fixtures'; +import { mediaDevicesEnvelop } from '@core/interceptors'; const someDevices = makeMediaDeviceInfos(); @@ -22,6 +22,8 @@ describe('setupDeviceStore', () => { enumerateDevices: Promise.resolve(someDevices), }, }); + + mediaDevicesEnvelop.rebind(navigator); }); it('should initialize device sync and register event listener', async () => { @@ -190,6 +192,8 @@ describe('setupDeviceStore', () => { }, }); + mediaDevicesEnvelop.rebind(navigator); + const api$ = makeApiClone(); setupDeviceStore(api$); @@ -235,6 +239,8 @@ describe('setupDeviceStore', () => { }, }); + mediaDevicesEnvelop.rebind(navigator); + const api$ = makeApiClone(); setupDeviceStore(api$); @@ -250,6 +256,35 @@ describe('setupDeviceStore', () => { }); describe('Firefox permission handling', () => { + it('should resolve store readiness and sync devices when Firefox labels are already present', async () => { + vi.spyOn(isFirefoxModule, 'default').mockReturnValue(true); + + const api$ = makeApiClone(); + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: vi.fn().mockResolvedValue([ + { deviceId: 'device1', kind: 'audioinput', label: 'Microphone' }, + { deviceId: 'device2', kind: 'videoinput', label: 'Camera' }, + ]), + getUserMedia: vi.fn(), + }, + }); + + mediaDevicesEnvelop.rebind(navigator); + + setupDeviceStore(api$); + + await waitFor( + async () => { + await expect(api$.getMetadata().isStoreReady).resolves.toBeUndefined(); + expect(mediaDevices$.actions.syncMediaDevicesInfo).toHaveBeenCalledWith(); + }, + { timeout: 200 } + ); + }); + it('should request permissions when on Firefox and device labels are empty', async () => { vi.spyOn(isFirefoxModule, 'default').mockReturnValue(true); @@ -272,6 +307,8 @@ describe('setupDeviceStore', () => { }, }); + mediaDevicesEnvelop.rebind(navigator); + const api$ = makeApiClone(); setupDeviceStore(api$); @@ -304,6 +341,8 @@ describe('setupDeviceStore', () => { }, }); + mediaDevicesEnvelop.rebind(navigator); + const api$ = makeApiClone(); setupDeviceStore(api$); @@ -327,6 +366,8 @@ describe('setupDeviceStore', () => { }, }); + mediaDevicesEnvelop.rebind(navigator); + const api$ = makeApiClone(); setupDeviceStore(api$); @@ -350,8 +391,8 @@ describe('setupDeviceStore', () => { // in the test environment. The monkey patching behavior is verified via // integration tests in a real browser environment. - describe('metadata setup', () => { - it('should set __getUserMedia on metadata', () => { + describe('envelope original method access', () => { + it('should make getUserMedia available via the mediaDevices envelope', () => { const originalGetUserMedia = vi.fn(); setupWindowNavigatorMock({ @@ -361,12 +402,16 @@ describe('setupDeviceStore', () => { }, }); + mediaDevicesEnvelop.rebind(navigator); + const api$ = makeApiClone(); setupDeviceStore(api$); - const metadata = api$.getMetadata(); - expect(metadata.__getUserMedia).toBeDefined(); + const envelopGetUserMedia = mediaDevicesEnvelop.getOriginal('getUserMedia'); + + expect(envelopGetUserMedia).toBeDefined(); + expect(typeof envelopGetUserMedia).toBe('function'); }); }); @@ -382,6 +427,8 @@ describe('setupDeviceStore', () => { }, }); + mediaDevicesEnvelop.rebind(navigator); + const api$ = makeApiClone(); const cleanup = setupDeviceStore(api$); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/setupDeviceStore/setupDeviceStore.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/setupDeviceStore/setupDeviceStore.ts index a42f3bf2..8409728c 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/setupDeviceStore/setupDeviceStore.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/setupDeviceStore/setupDeviceStore.ts @@ -4,6 +4,7 @@ import { assertDevicesAPI } from '../../assertions'; import { attempt } from '@common/execution'; import isFirefox from '@web/platform/isFirefox'; import CancelablePromise from 'easy-cancelable-promise'; +import { mediaDevicesEnvelop } from '@core/interceptors'; /** * Avoid monkey patching getUserMedia in non browser environment, like test or server side rendering @@ -16,21 +17,21 @@ const isBrowserEnvironment = Boolean(globalThis.navigator.mediaDevices?.addEvent function setupDeviceStore(api: unknown) { assertDevicesAPI(api); + const getUserMedia = mediaDevicesEnvelop.getOriginal('getUserMedia'); + // no support for media devices - if (!globalThis.navigator.mediaDevices?.addEventListener) { + if (!globalThis.navigator.mediaDevices?.addEventListener || !getUserMedia) { return; } const meta = api.getMetadata(); - const __getUserMedia = globalThis.navigator.mediaDevices.getUserMedia; - const shouldMonkeyPatchGetUserMedia = isBrowserEnvironment && __getUserMedia; + const shouldMonkeyPatchGetUserMedia = isBrowserEnvironment && getUserMedia; const abortController = new AbortController(); - // make accessible to the actions the vanilla getUserMedia function - meta.__getUserMedia = __getUserMedia.bind(navigator.mediaDevices); + meta.isFirstMediaDevicesInfoQuery = true; - attempt(() => { + void attempt(() => { void setVonageAudioOutputDevice(api.getState().audiooutput!); }); @@ -44,7 +45,9 @@ function setupDeviceStore(api: unknown) { const syncDevicesAndResolve = () => { void api.actions .syncMediaDevicesInfo() - .then(() => resolve()) + .then(() => { + resolve(); + }) .catch(reject); }; @@ -62,7 +65,7 @@ function setupDeviceStore(api: unknown) { if (hasLabels) return; //we should request permissions to be able to see the devices labels. - return meta.__getUserMedia!({ audio: true, video: true }).then((stream) => { + return getUserMedia({ audio: true, video: true }).then((stream) => { stream.getTracks().forEach((track) => track.stop()); }); }) @@ -114,23 +117,15 @@ function setupDeviceStore(api: unknown) { /** * Restore the original getUserMedia function. */ - const __restoreMonkeyPatch = () => { - if (!isBrowserEnvironment) return; - globalThis.navigator.mediaDevices.getUserMedia = __getUserMedia; - }; + const restoreMonkeyPatch = (() => { + if (!shouldMonkeyPatchGetUserMedia) return () => {}; - /** - * Monkey patch navigator.mediaDevices.getUserMedia to keep the store in sync when it's called outside of the store's getUserMedia action. - */ - if (shouldMonkeyPatchGetUserMedia) { - globalThis.navigator.mediaDevices.getUserMedia = Object.assign(api.actions.getUserMedia, { - __restoreMonkeyPatch, - }); - } + return mediaDevicesEnvelop.override('getUserMedia', () => api.actions.getUserMedia); + })(); return () => { abortController.abort(); - __restoreMonkeyPatch(); + restoreMonkeyPatch(); }; } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/hooks/useMediaDevices.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/hooks/useMediaDevices.ts index efbc5f68..99d915c3 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/hooks/useMediaDevices.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/hooks/useMediaDevices.ts @@ -35,7 +35,7 @@ function useMediaDevices( */ function useMediaDevices( kind: MediaDeviceKind, - selector: (state: Record) => Selection, + selector: (state: Record) => Selection, options?: Options ): Selection; @@ -44,7 +44,7 @@ function useMediaDevices( */ function useMediaDevices( kind: MediaDeviceKind, - selector: (state: Record) => Selection, + selector: (state: Record) => Selection, dependencies?: Dependencies ): Selection; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/index.ts index 8466f9da..f54d15a5 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/index.ts @@ -1 +1,4 @@ export { default as mediaDevices$ } from './devices'; +export { default as notifications$ } from './notifications'; +export { default as runtime$ } from './runtime'; +export { default as publisher$ } from './publisher'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/clearAllNotifications.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/clearAllNotifications.ts new file mode 100644 index 00000000..0edf5c61 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/clearAllNotifications.ts @@ -0,0 +1,9 @@ +import type { NotificationsAPI } from '../types'; + +function clearAllNotifications() { + return ({ setState }: NotificationsAPI) => { + setState((state) => ({ ...state, notifications: new Map() })); + }; +} + +export default clearAllNotifications; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/dismissNotification.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/dismissNotification.ts new file mode 100644 index 00000000..77061fdc --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/dismissNotification.ts @@ -0,0 +1,14 @@ +import type { NotificationsAPI } from '../types'; +import type NotificationId from '../types/NotificationId'; + +function dismissNotification(this: NotificationsAPI['actions'], id: NotificationId) { + return ({ setState }: NotificationsAPI) => { + setState((state) => { + const notifications = new Map(state.notifications); + notifications.delete(id); + return { ...state, notifications }; + }); + }; +} + +export default dismissNotification; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/index.ts new file mode 100644 index 00000000..386266ad --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/index.ts @@ -0,0 +1,3 @@ +export { default as pushNotification } from './pushNotification'; +export { default as dismissNotification } from './dismissNotification'; +export { default as clearAllNotifications } from './clearAllNotifications'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/pushNotification.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/pushNotification.ts new file mode 100644 index 00000000..d9f17733 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/pushNotification.ts @@ -0,0 +1,28 @@ +import { notificationId, type NotificationEntry, type NotificationsAPI } from '../types'; + +function pushNotification( + this: NotificationsAPI['actions'], + payload: Omit +) { + return ({ setState }: NotificationsAPI) => { + const entry: NotificationEntry = { ...payload, id: notificationId() }; + + if (!this.hasSubscribers()) { + console.warn( + [ + 'A notification was pushed, but the notifications store has no active React consumer.', + 'This notification will not be visible to users.', + 'Render NotificationsContainer or provide a custom notification handler.', + ].join('\n') + ); + } + + setState((state) => { + const notifications = new Map(state.notifications); + notifications.set(entry.id, entry); + return { ...state, notifications }; + }); + }; +} + +export default pushNotification; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/constants/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/constants/index.ts new file mode 100644 index 00000000..1b23d477 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/constants/index.ts @@ -0,0 +1 @@ +export { default as initialValue } from './initialValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/constants/initialValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/constants/initialValue.ts new file mode 100644 index 00000000..4c851d29 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/constants/initialValue.ts @@ -0,0 +1,5 @@ +import type { NotificationEntry, NotificationId } from '../types'; + +const initialState = { notifications: new Map() }; + +export default initialState; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/index.ts new file mode 100644 index 00000000..b467b458 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/index.ts @@ -0,0 +1,2 @@ +export type * from './types'; +export { default } from './notifications$'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notifications$.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notifications$.test.ts new file mode 100644 index 00000000..07c2f0e5 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notifications$.test.ts @@ -0,0 +1,23 @@ +import { renderHook, act } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import notifications$ from './notifications$'; + +describe('notifications$', () => { + it('push, dismiss, and clearAll manage the notifications map correctly', () => { + const { result } = renderHook(() => notifications$.use()); + + act(() => { + notifications$.actions.push({ type: 'info', message: 'A', expirationMs: null }); + notifications$.actions.push({ type: 'warning', message: 'B', expirationMs: null }); + }); + + expect(result.current[0].notifications.size).toBe(2); + + const [first] = result.current[0].notifications.values(); + act(() => notifications$.actions.dismiss(first.id)); + expect(result.current[0].notifications.size).toBe(1); + + act(() => notifications$.actions.clearAll()); + expect(result.current[0].notifications.size).toBe(0); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notifications$.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notifications$.ts new file mode 100644 index 00000000..829edfde --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notifications$.ts @@ -0,0 +1,9 @@ +import type { Prettify } from '@common/types'; +import notificationsStore from './notificationsStore'; + +// Notifications public namespace +const notifications$ = { ...notificationsStore } as Prettify< + Omit +>; + +export default notifications$; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notificationsStore.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notificationsStore.ts new file mode 100644 index 00000000..f3d026d8 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notificationsStore.ts @@ -0,0 +1,28 @@ +import createGlobalState from 'react-global-state-hooks/createGlobalState'; +import { pushNotification, dismissNotification, clearAllNotifications } from './actions'; +import { InferAPI } from 'react-hooks-global-states'; +import { initialValue } from './constants'; + +export type NotificationsAPI = InferAPI; + +const notifications$ = createGlobalState(initialValue, { + name: 'notifications', + actions: { + push: pushNotification, + + dismiss: dismissNotification, + + clearAll: clearAllNotifications, + + /** + * Returns whether there are any subscribers to the notifications store. + */ + hasSubscribers: () => { + return () => { + return Boolean(notifications$.subscribers.size); + }; + }, + }, +}); + +export default notifications$; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationEntry.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationEntry.ts new file mode 100644 index 00000000..c0a90d55 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationEntry.ts @@ -0,0 +1,12 @@ +import type NotificationId from './NotificationId'; +import type NotificationType from './NotificationType'; + +export type NotificationEntry = { + id: NotificationId; + type: NotificationType; + message: string; + expirationMs: number | null; + children?: React.ReactNode; +}; + +export default NotificationEntry; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationId.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationId.ts new file mode 100644 index 00000000..074f126c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationId.ts @@ -0,0 +1,11 @@ +import uniqueId from 'react-global-state-hooks/uniqueId'; + +export type NotificationId = `notification:${string}`; + +export const notificationId = uniqueId.for('notification:') as { + (): NotificationId; + is(value: unknown): value is NotificationId; + assert(value: unknown): asserts value is NotificationId; +}; + +export default NotificationId; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationType.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationType.ts new file mode 100644 index 00000000..7c8fd12c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationType.ts @@ -0,0 +1,3 @@ +export type NotificationType = 'info' | 'warning' | 'success'; + +export default NotificationType; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationsAPI.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationsAPI.ts new file mode 100644 index 00000000..7ef08d9a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationsAPI.ts @@ -0,0 +1,3 @@ +export type NotificationsAPI = import('../notificationsStore').NotificationsAPI; + +export default NotificationsAPI; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationsState.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationsState.ts new file mode 100644 index 00000000..848a6f4d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationsState.ts @@ -0,0 +1,5 @@ +import type { initialValue } from '../constants'; + +export type NotificationsState = typeof initialValue; + +export default NotificationsState; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/index.ts new file mode 100644 index 00000000..f17ca247 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/index.ts @@ -0,0 +1,5 @@ +export type { NotificationType } from './NotificationType'; +export { type NotificationId, notificationId } from './NotificationId'; +export type { NotificationEntry } from './NotificationEntry'; +export type { NotificationsState } from './NotificationsState'; +export type { NotificationsAPI } from './NotificationsAPI'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/actions/getFacingMode.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/actions/getFacingMode.ts new file mode 100644 index 00000000..3afc5de3 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/actions/getFacingMode.ts @@ -0,0 +1,54 @@ +import type { Publisher } from '@vonage/client-sdk-video'; +import mediaDevices$ from '@core/stores/devices'; +import { isMobile } from '@web/platform'; +import { ErrorCode, makeApplicationErrorMapper } from '@core/errors'; +import { frontFacingKeywords, rearFacingKeywords } from '@core/stores/devices/constants'; +import { FacingMode } from '@common/types'; + +/** + * Gets the facing mode of the publisher's video track. + * + * [TODO]: After migrating publisher context, this should became an action of publisher$ + */ +const getFacingMode = ({ publisher }: { publisher: Publisher }): FacingMode => { + if (!isMobile()) { + throw makeApplicationErrorMapper({ + fallbackMessage: 'Camera facing mode is only supported on mobile devices.', + type: ErrorCode.FacingModeNotSupported, + })(null); + } + + const { track, deviceId } = publisher.getVideoSource?.() ?? {}; + + if (!track || !deviceId) { + return FacingMode.unknown; + } + + const { facingMode } = track.getSettings(); + + if (facingMode === FacingMode.user || facingMode === FacingMode.environment) { + return FacingMode[facingMode]; + } + + /** + * If facingMode is not available from the track settings, we try to infer it from the device label. + */ + const { videoinput } = mediaDevices$.mediaDevicesMap$.getState(); + const videoInputLabel = videoinput?.[deviceId]?.label?.toLowerCase(); + + if (!videoInputLabel) { + return FacingMode.unknown; + } + + if (rearFacingKeywords.some((keyword) => videoInputLabel.includes(keyword))) { + return FacingMode.environment; + } + + if (frontFacingKeywords.some((keyword) => videoInputLabel.includes(keyword))) { + return FacingMode.user; + } + + return FacingMode.unknown; +}; + +export default getFacingMode; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/actions/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/actions/index.ts new file mode 100644 index 00000000..c41e6626 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/actions/index.ts @@ -0,0 +1 @@ +export { default as getFacingMode } from './getFacingMode'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/index.ts new file mode 100644 index 00000000..3780f02c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/index.ts @@ -0,0 +1 @@ +export { default } from './publisher$'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/publisher$.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/publisher$.test.ts new file mode 100644 index 00000000..87eacffb --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/publisher$.test.ts @@ -0,0 +1,173 @@ +import type { Publisher } from '@vonage/client-sdk-video'; +import { FacingMode } from '@common/types'; +import mediaDevices$ from '@core/stores/devices'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import publisher$ from './publisher$'; +import { isMobile } from '@web/platform'; +import { ErrorCode } from '@core/errors'; + +vi.mock('@web/platform', async (importOriginal) => { + const actual = await importOriginal(); + + return { + ...actual, + isMobile: vi.fn(() => true), + }; +}); + +describe('publisher$.actions.getFacingMode', () => { + beforeEach(() => { + mediaDevices$.reset(); + }); + + it('throws when facing mode is requested on non-mobile devices', () => { + expect.assertions(1); + vi.mocked(isMobile).mockReturnValue(false); + + const publisher = { + getVideoSource: vi.fn(), + } as unknown as Publisher; + + try { + publisher$.actions.getFacingMode({ publisher }); + } catch (error) { + expect(error).toMatchObject({ + type: ErrorCode.FacingModeNotSupported, + fallbackMessage: 'Camera facing mode is only supported on mobile devices.', + }); + } + }); + + it('resolves facing mode through all runtime branches', () => { + runCase({ + label: 'returns unknown when track or deviceId is missing', + publisher: makePublisher({ videoSource: {} }), + expected: FacingMode.unknown, + }); + + runCase({ + label: 'returns direct user facingMode from track settings', + publisher: makePublisher({ + videoSource: { + deviceId: 'camera-user', + track: makeTrack({ facingMode: FacingMode.user }), + }, + }), + expected: FacingMode.user, + }); + + runCase({ + label: 'returns direct environment facingMode from track settings', + publisher: makePublisher({ + videoSource: { + deviceId: 'camera-environment', + track: makeTrack({ facingMode: FacingMode.environment }), + }, + }), + expected: FacingMode.environment, + }); + + runCase({ + label: 'returns unknown when track facingMode is missing and no label exists', + publisher: makePublisher({ + videoSource: { + deviceId: 'camera-missing-label', + track: makeTrack({}), + }, + }), + expected: FacingMode.unknown, + }); + + runCase({ + label: 'infers environment from rear-facing keywords', + publisher: makePublisher({ + videoSource: { + deviceId: 'camera-rear', + track: makeTrack({}), + }, + }), + devices: [ + { + deviceId: 'camera-rear', + kind: 'videoinput', + label: 'Back Camera', + groupId: 'group-rear', + } as MediaDeviceInfo, + ], + expected: FacingMode.environment, + }); + + runCase({ + label: 'infers user from front-facing keywords', + publisher: makePublisher({ + videoSource: { + deviceId: 'camera-front', + track: makeTrack({}), + }, + }), + devices: [ + { + deviceId: 'camera-front', + kind: 'videoinput', + label: 'FaceTime HD Camera', + groupId: 'group-front', + } as MediaDeviceInfo, + ], + expected: FacingMode.user, + }); + + runCase({ + label: 'returns unknown when label has no front/rear keywords', + publisher: makePublisher({ + videoSource: { + deviceId: 'camera-unknown', + track: makeTrack({}), + }, + }), + devices: [ + { + deviceId: 'camera-unknown', + kind: 'videoinput', + label: 'External USB Camera', + groupId: 'group-unknown', + } as MediaDeviceInfo, + ], + expected: FacingMode.unknown, + }); + }); +}); + +function makePublisher({ + videoSource, +}: { + videoSource?: { track?: MediaStreamTrack; deviceId?: string }; +}): Publisher { + return { + getVideoSource: vi.fn().mockReturnValue(videoSource), + } as unknown as Publisher; +} + +function runCase({ + label, + publisher, + expected, + devices, +}: { + label: string; + publisher: Publisher; + expected: FacingMode; + devices?: MediaDeviceInfo[]; +}) { + mediaDevices$.setState((state) => ({ + ...state, + mediaDeviceInfo: devices ?? [], + })); + + expect(publisher$.actions.getFacingMode({ publisher }), label).toBe(expected); +} + +function makeTrack({ facingMode }: { facingMode?: FacingMode | string }): MediaStreamTrack { + return { + getSettings: () => ({ facingMode }), + } as unknown as MediaStreamTrack; +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/publisher$.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/publisher$.ts new file mode 100644 index 00000000..9ca2d374 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/publisher$.ts @@ -0,0 +1,9 @@ +import { getFacingMode } from './actions'; + +const publisher$ = { + actions: { + getFacingMode, + }, +}; + +export default publisher$; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/RuntimeProvider.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/RuntimeProvider.ts new file mode 100644 index 00000000..94a478d7 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/RuntimeProvider.ts @@ -0,0 +1,89 @@ +import { createElement, useEffect, useMemo, type PropsWithChildren } from 'react'; +import runtimeStore from './runtimeStore'; +import { Prettify } from '@common/types'; +import { useStableRef } from '@web/hooks'; +import { QueryClient } from '@tanstack/react-query'; +import { type VideoClient, createVideoClient } from '@core/services'; +import { isFunction, isString } from '@common/assertions'; +import logger, { LoggerProviderConfig } from '@core/logger'; + +type LoggerProviderArg = + | LoggerProviderConfig + | (() => Promise | LoggerProviderConfig); + +type RuntimeState = { + language?: string; + queryClient?: QueryClient; + videoClient: VideoClient | string; + loggerProvider?: LoggerProviderArg; +}; + +type RuntimeProviderProps = Prettify>; + +/** + * Provides vonage video general configuration and an isolated QueryClient for all runtime hooks. + * The QueryClient is stored in the runtime store so hooks can access it without React context. + */ +const RuntimeProvider = ({ + children, + language = 'en', + videoClient: videoClientParam, + queryClient: queryClientParam, + loggerProvider, +}: RuntimeProviderProps) => { + const clientUrl = isString(videoClientParam) ? videoClientParam : undefined; + + const videoClient = useStableRef((): VideoClient => { + if (isString(videoClientParam)) { + return createVideoClient({ + url: clientUrl!, + }); + } + + return videoClientParam; + }, [clientUrl]).current; + + const queryClient = useStableRef(() => queryClientParam ?? new QueryClient(), []).current; + + const isExternalClient = !!queryClientParam; + + const value = useMemo(() => { + return { + videoClient, + language, + queryClient, + }; + }, [videoClient, language, queryClient]); + + useEffect( + function cleanupQueryClient() { + // avoid cleaning external QueryClients that may be shared with other parts of the app + if (isExternalClient) return; + + return () => { + queryClient.clear(); + }; + }, + [isExternalClient, queryClient] + ); + + useEffect( + function syncLogsProvider() { + if (!loggerProvider) return; + + logger.setup(() => { + if (isFunction(loggerProvider)) return loggerProvider(); + return loggerProvider; + }); + + return () => { + logger.reset(); + }; + }, + [loggerProvider] + ); + + return createElement(runtimeStore.Provider, { value }, children); +}; + +export default RuntimeProvider; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/index.ts new file mode 100644 index 00000000..a93f4749 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/index.ts @@ -0,0 +1,3 @@ +export { default as useLanguage } from './useLanguage'; +export { default as useVideoClient } from './useVideoClient'; +export { default as useQuery } from './useQuery'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useLanguage.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useLanguage.ts new file mode 100644 index 00000000..938100da --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useLanguage.ts @@ -0,0 +1,5 @@ +import runtimeStore from '../runtimeStore'; + +const useLanguage = runtimeStore.use.createSelectorHook(({ language }) => language); + +export default useLanguage; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useQuery.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useQuery.ts new file mode 100644 index 00000000..94b9e996 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useQuery.ts @@ -0,0 +1,35 @@ +import type { QueryKey } from '@tanstack/query-core'; +import type { QueryClient, UseQueryOptions, UseQueryResult } from '@tanstack/react-query'; +import { useQuery as useBaseQuery } from '@tanstack/react-query'; +import assertNotNil from '@common/assertions/assertNotNil'; +import runtimeStore from '../runtimeStore'; + +/** + * By default uses vonage sdk isolated QueryClient from runtime store. + */ +const useQuery = < + TQueryFnData = unknown, + TError = Error, + TData = TQueryFnData, + TQueryKey extends QueryKey = QueryKey, +>( + options: UseQueryOptions, + queryClientParam?: QueryClient +): UseQueryResult => { + const queryClient = runtimeStore.use.select(({ queryClient }) => queryClientParam ?? queryClient); + + assertNotNil( + queryClient, + 'runtime$.useQuery: QueryClient is missing. Wrap your app with from the Vonage SDK or pass queryClient manually.' + ); + + return useBaseQuery( + { + staleTime: 300, // prevents double fetch on a short period of time + ...options, + }, + queryClient + ); +}; + +export default useQuery; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useVideoClient.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useVideoClient.ts new file mode 100644 index 00000000..8ca1af4f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useVideoClient.ts @@ -0,0 +1,9 @@ +import runtimeStore from '../runtimeStore'; + +const useVideoClient = () => { + return runtimeStore.use.select(({ videoClient }) => { + return videoClient; + }); +}; + +export default useVideoClient; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/index.ts new file mode 100644 index 00000000..9de0cfa3 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/index.ts @@ -0,0 +1,2 @@ +export type * from './types'; +export { default } from './runtime$'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtime$.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtime$.test.ts new file mode 100644 index 00000000..1328a81d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtime$.test.ts @@ -0,0 +1,17 @@ +import { renderHook } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; +import type { PropsWithChildren } from 'react'; + +import runtime$ from './runtime$'; +import type { Any } from '@common/types'; + +describe('runtime$ smoke test', () => { + it('provides default state', () => { + const wrapper = ({ children }: PropsWithChildren) => { + return runtime$.Provider({ children, videoClient: {} as Any }); + }; + + const { result } = renderHook(() => runtime$.useLanguage(), { wrapper }); + expect(result.current).toBe('en'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtime$.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtime$.ts new file mode 100644 index 00000000..4032f5d7 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtime$.ts @@ -0,0 +1,37 @@ +import type { Prettify } from '@common/types'; + +import runtimeStore from './runtimeStore'; +import RuntimeProvider from './RuntimeProvider'; +import { useLanguage, useVideoClient, useQuery } from './hooks'; + +const extensions = { + /** + * Custom Provider that wraps the runtime store provider and an isolated QueryClientProvider. + * The QueryClient is created on mount and cleared on unmount. + */ + Provider: RuntimeProvider, + + /** + * Hook to get the current language from the runtime context. + */ + useLanguage, + + /** + * Hook to get the video client from the runtime context. + */ + useVideoClient, + + /** + * useQuery bound to the runtime$ isolated QueryClient. + * Consumers inside runtime$.Provider automatically use the correct QueryClient. + */ + useQuery, +}; + +// Spread instead of Object.assign to avoid mutating the runtimeStore object. +// Mutating would replace the store's original Provider, breaking its internal references. +const runtime$ = { ...runtimeStore, ...extensions } as Prettify< + Omit & typeof extensions +>; + +export default runtime$; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtimeStore.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtimeStore.ts new file mode 100644 index 00000000..a122791f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtimeStore.ts @@ -0,0 +1,17 @@ +import { createContext, type InferAPI } from 'react-global-state-hooks'; +import { RuntimeState } from './types'; + +export type RuntimeAPI = InferAPI; + +const runtimeStore = createContext(null! as RuntimeState, { + name: 'runtime', + actions: { + setLanguage(language: string) { + return ({ setState }) => { + setState((state) => ({ ...state, language })); + }; + }, + }, +}); + +export default runtimeStore; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/types/RuntimeState.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/types/RuntimeState.ts new file mode 100644 index 00000000..eadcef4c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/types/RuntimeState.ts @@ -0,0 +1,10 @@ +import type { QueryClient } from '@tanstack/react-query'; +import type { VideoClient } from '@core/services'; + +export type RuntimeState = { + videoClient: VideoClient; + language: string; + queryClient: QueryClient; +}; + +export default RuntimeState; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/types/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/types/index.ts new file mode 100644 index 00000000..3fbcf159 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/types/index.ts @@ -0,0 +1,2 @@ +export type * from './RuntimeState'; +export type RuntimeAPI = import('../runtimeStore').RuntimeAPI; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/types/QueryOptions.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/types/QueryOptions.ts new file mode 100644 index 00000000..b6743793 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/types/QueryOptions.ts @@ -0,0 +1,8 @@ +import { UseQueryOptions } from '@tanstack/react-query'; + +export type QueryOptions = Omit< + UseQueryOptions, + 'queryFn' | 'queryKey' +>; + +export default QueryOptions; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/types/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/types/index.ts new file mode 100644 index 00000000..4437bdae --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/types/index.ts @@ -0,0 +1 @@ +export type * from './QueryOptions'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/fixtures/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/fixtures/index.ts new file mode 100644 index 00000000..3f481fea --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/fixtures/index.ts @@ -0,0 +1 @@ +export { default as makeVideoClientMock } from './makeVideoClientMock'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/fixtures/makeVideoClientMock.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/fixtures/makeVideoClientMock.ts new file mode 100644 index 00000000..3d54a249 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/fixtures/makeVideoClientMock.ts @@ -0,0 +1,46 @@ +import type { Mocked } from 'vitest'; +import type { VideoClient } from '@core/services'; +import { AnyFunction } from '@common/types'; +import { isFunction, isNil } from '@common/assertions'; + +type VideoClientFnMock>> = + | Promise + | VideoClient[K]; + +type VideoClientMock = Partial<{ + [K in keyof VideoClient]: VideoClientFnMock; +}>; + +const makeVideoClientMock = (mock: VideoClientMock): Mocked => { + const target: Record = {}; + + Object.keys(mock).forEach((key) => { + const value = mock[key as keyof VideoClientMock]; + + if (!isFunction(value)) { + target[key] = vi.fn(() => value); + return; + } + + if (vi.isMockFunction(value)) { + target[key] = value as AnyFunction; + return; + } + + target[key] = vi.fn(value); + }); + + return new Proxy(target, { + get(target, prop: string) { + const value = target[prop as keyof VideoClientMock]; + + if (isNil(value)) { + throw new Error(`Method ${prop} has not been implemented in the mock`); + } + + return value; + }, + }) as Mocked; +}; + +export default makeVideoClientMock; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/index.ts new file mode 100644 index 00000000..254ec8d9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/index.ts @@ -0,0 +1 @@ +export * from './providers'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/index.ts new file mode 100644 index 00000000..c9a3e0e0 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/index.ts @@ -0,0 +1,6 @@ +export { + default as makeRuntimeProviderWrapper, + type RuntimeProviderWrapperOptions, +} from './makeRuntimeProviderWrapper'; + +export { default as makeTestProvider, providers, type ProviderOptions } from './makeTestProvider'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makeRuntimeProviderWrapper.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makeRuntimeProviderWrapper.ts new file mode 100644 index 00000000..69bbbe75 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makeRuntimeProviderWrapper.ts @@ -0,0 +1,23 @@ +import runtime$ from '@core/stores/runtime'; +import RuntimeProvider from '@core/stores/runtime/RuntimeProvider'; +import { makeGenericProviderWrapper } from '@web-test'; +import type { GenericWrapperOptions } from '@web-test/makeGenericProviderWrapper'; +import type { VideoClient } from '@core/services'; + +export type RuntimeProviderWrapperOptions = Omit< + GenericWrapperOptions, + 'videoClient' +> & { + videoClient?: VideoClient | null; +}; + +function makeRuntimeProviderWrapper(options: RuntimeProviderWrapperOptions = {}) { + const [wrapper, context] = makeGenericProviderWrapper(RuntimeProvider, runtime$.Context, { + videoClient: null!, + ...options, + } as Parameters[0]); + + return { wrapper, context }; +} + +export default makeRuntimeProviderWrapper; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makeTestProvider.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makeTestProvider.ts new file mode 100644 index 00000000..93f61f6a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makeTestProvider.ts @@ -0,0 +1,138 @@ +import composeProviders, { type ProviderComponent } from '@web/helpers/composeProviders'; +import { makeRuntimeProviderWrapper, type RuntimeProviderWrapperOptions } from './makersIndex'; + +/** + * Keep updated accordingly to the providers you have and their dependencies. + */ +export enum providers { + runtime = 'runtime', +} + +type ProviderOptionsByKey = { + [providers.runtime]: RuntimeProviderWrapperOptions; +}; + +type ProviderContextsByKey = { + [providers.runtime]: NonNullable['context']>; +}; + +/** + * Keep updated accordingly to the providers you have and their dependencies. + */ +const PROVIDER_DEPENDENCIES = { + [providers.runtime]: [], +} as const; + +/** + * Infer the possible parameters for the provided keys + */ +type ProviderOptionsFor = { + [K in Keys[number] as `${K}Context`]: ProviderOptionsByKey[K] | undefined; +}; + +/** + * Infer the context britches for the provided keys + */ +type ProviderContextsFor = { + [K in Keys[number] as `${K}Context`]: ProviderContextsByKey[K]; +}; + +function makeTestProvider< + Keys extends readonly providers[], + Options extends ProviderOptionsFor, +>( + keys: Keys, + options?: Options +): { + wrapper: ProviderComponent; +} & ProviderContextsFor { + /** + * Check all the dependencies are included in the keys + * Even if the maker knows it's dependencies, we need the keys to infer the correct type and to avoid duplicate providers + */ + (() => { + const necessaryKeys = new Set( + keys.reduce((acc, key) => { + return [...acc, ...PROVIDER_DEPENDENCIES[key], key]; + }, [] as providers[]) + ); + + const isMissingDependency = + necessaryKeys.size < keys.length || ![...necessaryKeys].every((key) => keys.includes(key)); + + if (isMissingDependency) { + throw new Error( + `Some dependencies are missing for the provided keys. Provided keys: ${keys.join( + ', ' + )}. Necessary keys: ${[...necessaryKeys].join(', ')}.` + ); + } + })(); + + /** + * Sort providers in topological dependency order so that parents are always + * rendered as ancestors of the components that depend on them. + * composeProviders(reduceRight) makes the first element the outermost wrapper. + */ + const sortedKeys = (() => { + const visited = new Set(); + const result: providers[] = []; + + const visit = (key: providers) => { + if (visited.has(key)) return; + + visited.add(key); + + for (const dependency of PROVIDER_DEPENDENCIES[key]) { + if ((keys as readonly providers[]).includes(dependency)) { + visit(dependency); + } + } + + result.push(key); + }; + + for (const key of keys) { + visit(key); + } + + return result; + })(); + + /** + * Create the providers wrappers and contexts for the provided keys + */ + const providerWrappers = sortedKeys.map((key) => { + switch (key) { + case providers.runtime: + return makeRuntimeProviderWrapper( + (options as ProviderOptionsFor<[providers.runtime]> | undefined)?.runtimeContext + ); + default: + throw new Error(`Unknown provider: ${key}`); + } + }); + + const wrapper = composeProviders(...providerWrappers.map(({ wrapper }) => wrapper)); + + return { + wrapper, + ...providerWrappers.reduce((acc, { context }, index) => { + const key = sortedKeys[index]; + + return { + ...acc, + [`${key}Context` as keyof ProviderContextsFor]: context, + }; + }, {} as ProviderContextsFor), + }; +} + +/** + * All parameters + */ +export type ProviderOptions = { + [K in providers as `${Capitalize}Context`]?: ProviderOptionsByKey[K]; +}; + +export default makeTestProvider; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makersIndex.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makersIndex.ts new file mode 100644 index 00000000..c4b896d8 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makersIndex.ts @@ -0,0 +1,4 @@ +export { + default as makeRuntimeProviderWrapper, + type RuntimeProviderWrapperOptions, +} from './makeRuntimeProviderWrapper'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.json b/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.json index 1e6c8473..4764b309 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.base.json", "files": [], - "include": ["eslint.config.mjs", "./test/setup.ts"], + "include": ["eslint.config.mjs", "./test/setup.ts", "./test/**/*.ts", "./test/**/*.tsx"], "references": [ { "path": "./tsconfig.lib.json" @@ -13,6 +13,7 @@ "compilerOptions": { "rootDir": "..", "baseUrl": "./", + "jsx": "react-jsx", "moduleResolution": "bundler", "composite": true, "paths": { @@ -20,12 +21,18 @@ "@common/*": ["../common/src/*"], "@core": ["./src"], "@core/*": ["./src/*"], + "@core-test": ["./test"], + "@core-test/*": ["./test/*"], "@web": ["../common/srcBrowser"], "@web/*": ["../common/srcBrowser/*"], "@common-test": ["../common/test"], "@common-test/*": ["../common/test/*"], "@web-test": ["../common/testBrowser"], - "@web-test/*": ["../common/testBrowser/*"] + "@web-test/*": ["../common/testBrowser/*"], + + // video-router + "@api-lib/*": ["../api/src/*"], + "@node/*": ["../common/srcNode/*"] }, "lib": ["DOM", "DOM.Iterable", "ESNext"] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.lib.json b/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.lib.json index 1a8346c0..197e66c3 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.lib.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.lib.json @@ -20,7 +20,19 @@ "../common/test/**/*.ts", "../common/test/**/*.tsx", "../common/testBrowser/**/*.ts", - "../common/testBrowser/**/*.tsx" + "../common/testBrowser/**/*.tsx", + + // video-router(this is just for linter and types) + "../api/src/**/*.ts", + "../common/srcNode/**/*.ts", + "../common/src/types/FacingMode.ts" ], - "exclude": ["**/*.spec.*", "**/*.test.*"] + "exclude": [ + "**/*.spec.*", + "**/*.test.*", + "../api/**/*.test.*", + "../api/**/*.spec.*", + "../common/**/*.test.*", + "../common/**/*.spec.*" + ] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.spec.json b/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.spec.json index abebbb30..aae34595 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.spec.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.spec.json @@ -7,6 +7,7 @@ "include": [ "vite.config.ts", "test/**/*.ts", + "test/**/*.tsx", "src/**/*.ts", "src/**/*.tsx", "../common/src/**/*.ts", @@ -16,7 +17,8 @@ "../common/test/**/*.ts", "../common/test/**/*.tsx", "../common/testBrowser/**/*.ts", - "../common/testBrowser/**/*.tsx" + "../common/testBrowser/**/*.tsx", + "../common/src/types/FacingMode.ts" ], "tsBuildInfoFile": "dist/tsconfig.spec.tsbuildinfo" } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/vite.config.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/vite.config.ts index 652bb152..6c0f113e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/vite.config.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/vite.config.ts @@ -14,6 +14,7 @@ export default defineConfig(() => ({ resolve: { alias: { '@core': path.resolve(__dirname, './src'), + '@core-test': path.resolve(__dirname, './test'), '@common': path.resolve(__dirname, '../common/src'), '@web': path.resolve(__dirname, '../common/srcBrowser'), '@common-test': path.resolve(__dirname, '../common/test'), @@ -57,6 +58,12 @@ export default defineConfig(() => ({ reportsDirectory: './coverage', provider: 'v8' as const, reporter: ['text', 'lcov'], + allowExternal: true, + include: [ + `${path.resolve(__dirname, 'src')}/**/*.{ts,tsx}`, + `${path.resolve(__dirname, '../common/src')}/**/*.{ts,tsx}`, + `${path.resolve(__dirname, '../common/srcBrowser')}/**/*.{ts,tsx}`, + ], exclude: ['test/**', '**/index.ts'], }, }, diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/.storybook/preview.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/.storybook/preview.tsx index 79eb8252..c6e7515d 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/.storybook/preview.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/.storybook/preview.tsx @@ -1,7 +1,10 @@ import type { Preview } from '@storybook/react'; +import { registerIcon } from '@vonage/vivid'; import { ThemeProvider } from '../src/theme'; import '../src/styles.css'; +registerIcon(); + const preview: Preview = { decorators: [ (Story) => ( diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/Field.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/Field.tsx new file mode 100644 index 00000000..384d6c3c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/Field.tsx @@ -0,0 +1,26 @@ +import type { ComponentProps, PropsWithChildren, ReactElement } from 'react'; +import FieldDescription from './FieldDescription'; +import FieldInput from './FieldInput'; +import FieldLabel from './FieldLabel'; +import FieldRow from './FieldRow'; + +const FieldRoot = ({ + children, + className, + ...props +}: PropsWithChildren>): ReactElement => { + return ( +
+ {children} +
+ ); +}; + +const Field = Object.assign(FieldRoot, { + Label: FieldLabel, + Input: FieldInput, + Description: FieldDescription, + Row: FieldRow, +}); + +export default Field; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldDescription.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldDescription.tsx new file mode 100644 index 00000000..d9d86582 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldDescription.tsx @@ -0,0 +1,20 @@ +import type { ComponentProps, PropsWithChildren, ReactElement } from 'react'; + +const FieldDescription = ({ + children, + className, + ...props +}: PropsWithChildren>): ReactElement => { + return ( +

+ {children} +

+ ); +}; + +export default FieldDescription; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldInput.test.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldInput.test.tsx new file mode 100644 index 00000000..c65fac3c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldInput.test.tsx @@ -0,0 +1,74 @@ +import { describe, it, expect, vi } from 'vitest'; +import { render, fireEvent } from '@testing-library/react'; +import FieldInput from './FieldInput'; + +describe('FieldInput', () => { + describe('switch variant', () => { + it('calls onChange with true when toggled from unchecked', () => { + const onChange = vi.fn(); + + const { getByRole } = render( + + ); + + fireEvent.click(getByRole('checkbox')); + + expect(onChange).toHaveBeenCalledWith(true); + }); + + it('calls onChange with false when toggled from checked', () => { + const onChange = vi.fn(); + + const { getByRole } = render( + + ); + + fireEvent.click(getByRole('checkbox')); + + expect(onChange).toHaveBeenCalledWith(false); + }); + + it('renders as disabled when disabled prop is set', () => { + const { getByRole } = render( + + ); + + expect((getByRole('checkbox') as HTMLInputElement).disabled).toBe(true); + }); + + it('renders the small switch size classes when requested', () => { + const { container } = render( + + ); + + expect(container.querySelector('span')).toHaveClass('h-5', 'w-9', 'after:h-4', 'after:w-4'); + }); + + it('toggles when the visible switch track is clicked', () => { + const onChange = vi.fn(); + const { container } = render( + + ); + + fireEvent.click(container.querySelector('span')!); + + expect(onChange).toHaveBeenCalledWith(true); + }); + }); + + describe('native input variant', () => { + it('renders a native input with passed props', () => { + const { getByRole } = render(); + + const input = getByRole('textbox') as HTMLInputElement; + + expect(input.placeholder).toBe('Enter value'); + }); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldInput.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldInput.tsx new file mode 100644 index 00000000..36aaf51f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldInput.tsx @@ -0,0 +1,49 @@ +import type { ComponentProps, ReactElement } from 'react'; + +type SwitchInputProps = { + variant: 'switch'; + id: string; + checked: boolean; + onChange: (checked: boolean) => void; + disabled?: boolean; + size?: 'default' | 'small'; +}; + +type NativeInputProps = ComponentProps<'input'> & { variant?: never }; + +export type FieldInputProps = SwitchInputProps | NativeInputProps; + +const FieldInput = (props: FieldInputProps): ReactElement => { + if (props.variant === 'switch') { + const { id, checked, onChange, disabled, size = 'default' } = props; + const switchSizeClassName = + size === 'small' + ? 'h-5 w-9 after:left-0.5 after:top-0.5 after:h-4 after:w-4 peer-checked:after:translate-x-4' + : 'h-6 w-11 after:left-0.5 after:top-0.5 after:h-5 after:w-5 peer-checked:after:translate-x-5'; + + return ( + + ); + } + + const { variant: _variant, ...inputProps } = props; + + return ; +}; + +export default FieldInput; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldLabel.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldLabel.tsx new file mode 100644 index 00000000..6ca3753f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldLabel.tsx @@ -0,0 +1,20 @@ +import type { ComponentProps, PropsWithChildren, ReactElement } from 'react'; + +const FieldLabel = ({ + children, + className, + ...props +}: PropsWithChildren>): ReactElement => { + return ( + + ); +}; + +export default FieldLabel; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldRow.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldRow.tsx new file mode 100644 index 00000000..928c1e51 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldRow.tsx @@ -0,0 +1,18 @@ +import type { ComponentProps, PropsWithChildren, ReactElement } from 'react'; + +const FieldRow = ({ + children, + className, + ...props +}: PropsWithChildren>): ReactElement => { + return ( +
+ {children} +
+ ); +}; + +export default FieldRow; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/index.tsx new file mode 100644 index 00000000..f90ee8f0 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/index.tsx @@ -0,0 +1,4 @@ +import Field from './Field'; + +export type { FieldInputProps } from './FieldInput'; +export default Field; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/LabeledValueList/LabeledValueList.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/LabeledValueList/LabeledValueList.tsx new file mode 100644 index 00000000..49ba46fa --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/LabeledValueList/LabeledValueList.tsx @@ -0,0 +1,39 @@ +import type { ReactElement } from 'react'; + +export type LabeledValueItem = { + label: string; + value: string; +}; + +export type LabeledValueListProps = { + title: string; + items: LabeledValueItem[]; +}; + +const LabeledValueList = ({ title, items }: LabeledValueListProps): ReactElement => { + return ( +
+

+ {title} +

+ +
    + {items.map((item) => ( +
  • + + {item.label} + + + {item.value} + +
  • + ))} +
+
+ ); +}; + +export default LabeledValueList; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/LabeledValueList/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/LabeledValueList/index.tsx new file mode 100644 index 00000000..f84a9a0a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/LabeledValueList/index.tsx @@ -0,0 +1,4 @@ +import LabeledValueList from './LabeledValueList'; + +export type { LabeledValueItem, LabeledValueListProps } from './LabeledValueList'; +export default LabeledValueList; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/PageLayout/PageLayout.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/PageLayout/PageLayout.tsx index 9d82ead5..81d9d637 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/PageLayout/PageLayout.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/PageLayout/PageLayout.tsx @@ -1,89 +1,61 @@ import React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import type { BoxProps } from '@mui/material/Box'; -import useTheme from '../theme'; -import { isFunction } from '@common/assertions'; +import { findSlotByDisplayName } from '../helpers'; +import { twMerge } from 'tailwind-merge'; type WithChildren = { children: React.ReactNode }; -export type PageLayoutProps = BoxProps; +export type PageLayoutProps = React.ComponentProps<'section'>; -export enum PageLayoutRegions { - Banner = 'Banner', - Left = 'Left', - Right = 'Right', - Footer = 'Footer', +export enum PageLayoutSlots { + Banner = 'PageLayout.Banner', + Left = 'PageLayout.Left', + Right = 'PageLayout.Right', + Footer = 'PageLayout.Footer', } -const PageLayout = ({ children, sx, ...props }: PageLayoutProps): React.ReactNode => { - const theme = useTheme(); - +const PageLayout = ({ children, className, ...props }: PageLayoutProps): React.ReactNode => { const childrenArray = React.Children.toArray(children); - const banner = pickChild(childrenArray, PageLayoutRegions.Banner); - const left = pickChild(childrenArray, PageLayoutRegions.Left); - const right = pickChild(childrenArray, PageLayoutRegions.Right); - const footer = pickChild(childrenArray, PageLayoutRegions.Footer); + const banner = findSlotByDisplayName({ + children: childrenArray, + displayName: PageLayoutSlots.Banner, + }); + + const left = findSlotByDisplayName({ + children: childrenArray, + displayName: PageLayoutSlots.Left, + }); + + const right = findSlotByDisplayName({ + children: childrenArray, + displayName: PageLayoutSlots.Right, + }); + + const footer = findSlotByDisplayName({ + children: childrenArray, + displayName: PageLayoutSlots.Footer, + }); return ( - +
{banner} - +
{left && ( - +
{left} - +
)} {right && ( - +
{right} - +
)} - +
{footer} - +
); }; @@ -103,10 +75,10 @@ const PageLayoutFooter: React.FC = ({ children }) => { return children; }; -PageLayoutBanner.displayName = PageLayoutRegions.Banner; -PageLayoutLeft.displayName = PageLayoutRegions.Left; -PageLayoutRight.displayName = PageLayoutRegions.Right; -PageLayoutFooter.displayName = PageLayoutRegions.Footer; +PageLayoutBanner.displayName = PageLayoutSlots.Banner; +PageLayoutLeft.displayName = PageLayoutSlots.Left; +PageLayoutRight.displayName = PageLayoutSlots.Right; +PageLayoutFooter.displayName = PageLayoutSlots.Footer; /** * Banner that will be displayed at the top of the layout @@ -124,19 +96,8 @@ PageLayout.Left = PageLayoutLeft; PageLayout.Right = PageLayoutRight; /** - * Content for the left column + * Content for the footer */ PageLayout.Footer = PageLayoutFooter; -function pickChild(children: React.ReactNode[], identifier: PageLayoutRegions): React.ReactNode { - return ( - children.find((child: unknown) => { - const isValidElement = React.isValidElement(child) && isFunction(child.type); - if (!isValidElement) return false; - - return (child.type as React.ComponentType).displayName === identifier; - }) ?? null - ); -} - export default PageLayout; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/PageLayoutEmbed/PageLayoutEmbed.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/PageLayoutEmbed/PageLayoutEmbed.tsx index 4a71bd24..dabd805e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/PageLayoutEmbed/PageLayoutEmbed.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/PageLayoutEmbed/PageLayoutEmbed.tsx @@ -2,7 +2,6 @@ import React from 'react'; import Box from '@mui/material/Box'; import Stack from '@mui/material/Stack'; import type { BoxProps } from '@mui/material/Box'; -import useTheme from '../theme'; import { isFunction } from '@common/assertions'; type WithChildren = { children: React.ReactNode }; @@ -17,8 +16,6 @@ export enum PageLayoutEmbedRegions { } const PageLayoutEmbed = ({ children, sx, ...props }: PageLayoutEmbedProps): React.ReactNode => { - const theme = useTheme(); - const childrenArray = React.Children.toArray(children); const left = pickChild(childrenArray, PageLayoutEmbedRegions.Left); @@ -49,12 +46,12 @@ const PageLayoutEmbed = ({ children, sx, ...props }: PageLayoutEmbedProps): Reac > {left && ( = { + value: TValue; + label: string; +}; + +export type SelectFieldProps = Omit< + ComponentProps<'select'>, + 'value' | 'onChange' | 'children' +> & { + id: string; + label: string; + value: TValue; + options: SelectFieldOption[]; + onChange: (value: TValue) => void; + description?: string; +}; + +const SelectField = ({ + id, + label, + value, + options, + onChange, + description, + ...selectProps +}: SelectFieldProps): ReactElement => { + const handleChange = (event: ChangeEvent) => { + const selectedOption = options.find((option) => String(option.value) === event.target.value); + + if (!selectedOption) return; + + onChange(selectedOption.value); + }; + + return ( +
+ +
+ + +
+ {description ? ( +

{description}

+ ) : null} +
+ ); +}; + +export default SelectField; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SelectField/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SelectField/index.tsx new file mode 100644 index 00000000..e980c09a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SelectField/index.tsx @@ -0,0 +1,4 @@ +import SelectField from './SelectField'; + +export type { SelectFieldOption, SelectFieldProps } from './SelectField'; +export default SelectField; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SwitchField/SwitchField.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SwitchField/SwitchField.tsx new file mode 100644 index 00000000..954e3aa4 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SwitchField/SwitchField.tsx @@ -0,0 +1,38 @@ +import type { CSSProperties, ReactElement } from 'react'; +import Field from '../Field'; + +export type SwitchFieldProps = { + id: string; + label: string; + checked: boolean; + onChange: (checked: boolean) => void; + description?: string; + size?: 'default' | 'small'; + labelClassName?: string; + labelStyle?: CSSProperties; +}; + +const SwitchField = ({ + id, + label, + checked, + onChange, + description, + size, + labelClassName, + labelStyle, +}: SwitchFieldProps): ReactElement => { + return ( + + + + {label} + + + + {description ? {description} : null} + + ); +}; + +export default SwitchField; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SwitchField/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SwitchField/index.tsx new file mode 100644 index 00000000..7c8f82be --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SwitchField/index.tsx @@ -0,0 +1,4 @@ +import SwitchField from './SwitchField'; + +export type { SwitchFieldProps } from './SwitchField'; +export default SwitchField; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/VividIcon/VividIcon.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/VividIcon/VividIcon.tsx new file mode 100644 index 00000000..21647633 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/VividIcon/VividIcon.tsx @@ -0,0 +1,49 @@ +import { hasMediaProcessorSupport } from '@vonage/client-sdk-video'; +import { createElement, type CSSProperties } from 'react'; + +export type VividIconProps = { + name: string; + customSize?: -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5; + /** + * Use `style` instead. Tailwind classes cannot reach Vivid's internal shadow DOM, + * so color set via `className` will be silently overridden by MUI and never applied. + * @deprecated + */ + className?: never; + /** + * Use `style` instead. MUI `sx` is being removed from this codebase. + * VividIcon accepts `style` directly — pass CSS vars there. + * @deprecated + */ + sx?: never; + style?: CSSProperties; +} & Record; + +const VividIcon = ({ name, customSize, style, ...props }: VividIconProps) => { + return createElement('vwc-icon', { + ref: captureRefComponent, + size: customSize, + name, + 'data-testid': `vivid-icon-${name}`, + style: { + color: 'var(--vera-text-secondary)', + ...style, + }, + ...props, + }); +}; + +function captureRefComponent(element: HTMLElement | null) { + if (!element || hasMediaProcessorSupport('both')) return; + + void customElements.whenDefined('vwc-icon').then(() => { + const elementWithShadow = element as HTMLElement & { shadowRoot: ShadowRoot | null }; + const figure = elementWithShadow.shadowRoot?.querySelector('figure'); + if (figure) { + figure.style.paddingLeft = '1px'; + figure.style.paddingRight = '1px'; + } + }); +} + +export default VividIcon; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/VividIcon/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/VividIcon/index.ts new file mode 100644 index 00000000..45ed4b7d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/VividIcon/index.ts @@ -0,0 +1,2 @@ +export { default } from './VividIcon'; +export type { VividIconProps } from './VividIcon'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/Collapsible.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/Collapsible.spec.tsx new file mode 100644 index 00000000..9194468b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/Collapsible.spec.tsx @@ -0,0 +1,55 @@ +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, expect, it } from 'vitest'; +import Collapsible from './Collapsible'; + +describe('CollapsibleSection', () => { + it('renders collapsed by default and keeps the content mounted', () => { + render( + + Publisher statistics + +
Packets sent
+
+
+ ); + + const details = screen.getByText(/publisher statistics/i).closest('details'); + const content = screen.getByText(/packets sent/i); + + expect(details).not.toHaveAttribute('open'); + expect(content).toBeInTheDocument(); + expect(content).not.toBeVisible(); + }); + + it('shows and hides the content without unmounting it', async () => { + const user = userEvent.setup(); + + render( + + Publisher statistics + +
Packets sent
+
+
+ ); + + const summary = screen.getByText(/publisher statistics/i); + const details = summary.closest('details'); + const content = screen.getByText(/packets sent/i); + + expect(details).toHaveAttribute('open'); + expect(content).toBeVisible(); + + await user.click(summary); + + expect(details).not.toHaveAttribute('open'); + expect(content).toBeInTheDocument(); + expect(content).not.toBeVisible(); + + await user.click(summary); + + expect(details).toHaveAttribute('open'); + expect(content).toBeVisible(); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/Collapsible.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/Collapsible.tsx new file mode 100644 index 00000000..4448120a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/Collapsible.tsx @@ -0,0 +1,105 @@ +import { useEffect, type ComponentProps, type PropsWithChildren } from 'react'; +import findSlotByDisplayName from '@ui/helpers/findSlotByDisplayName'; +import { twMerge } from 'tailwind-merge'; +import collapsible$, { CollapsibleState } from './collapsible$'; +import { CollapsibleSlots } from './constants'; +import { Summary, Details } from './components'; +import { useStableCallback } from '@web/hooks'; +import Icon from './components/Icon'; + +export type CollapsibleProps = { + children: React.ReactNode[]; +} & PropsWithChildren, 'children'>>; + +const InnerCollapsible = ({ children, className, onToggle, ...props }: CollapsibleProps) => { + const summary = findSlotByDisplayName({ + children, + displayName: CollapsibleSlots.Summary, + }); + + const details = findSlotByDisplayName({ + children, + displayName: CollapsibleSlots.Details, + }); + + const remainingChildren = children.filter?.((child) => ![summary, details].includes(child)); + + const { + setState, + actions: { toggle }, + } = collapsible$.use.api(); + + const open = collapsible$.use.select((state) => state.open); + + useEffect( + function syncOpenState() { + setState((state) => ({ + ...state, + open: props.open ?? state.open, + })); + }, + [setState, props.open] + ); + + return ( +
{ + toggle({ open: event.currentTarget.open }); + onToggle?.(event); + }} + className={twMerge('Collapsible flex flex-col open:gap-3', className)} + > + {summary} + {details} + {remainingChildren} +
+ ); +}; + +/** + * Collapsible component that can be used to show/hide content. + * + * @example + * + * + * Click to expand + * + * + * + * This is the content that can be collapsed. + * + * + */ +const Collapsible = (props: CollapsibleProps) => { + const initialize = useStableCallback((state: CollapsibleState) => { + return { + ...state, + open: props.open ?? state.open, + }; + }); + + return ( + + + + ); +}; + +/** + * Summary slot for the Collapsible component. + */ +Collapsible.Summary = Summary; + +/** + * Details slot for the Collapsible component. + */ +Collapsible.Details = Details; + +/** + * Icon component for the Collapsible summary + */ +Collapsible.Icon = Icon; + +export default Collapsible; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/collapsible$.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/collapsible$.ts new file mode 100644 index 00000000..da481879 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/collapsible$.ts @@ -0,0 +1,25 @@ +import { createContext, type InferAPI } from 'react-global-state-hooks'; + +export type CollapsibleState = typeof initialState; + +export type CollapsibleAPI = InferAPI; + +const initialState = { + open: false, +}; + +const collapsible$ = createContext(initialState, { + actions: { + /** + * Toggles the open state of the collapsible. If `args.open` is provided, it will set the open state to that value instead of toggling. + */ + toggle(args?: { open: boolean }) { + return ({ setState, getState }) => { + const { open } = getState(); + setState((state) => ({ ...state, open: args?.open ?? !open })); + }; + }, + }, +}); + +export default collapsible$; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Details.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Details.tsx new file mode 100644 index 00000000..0dc96f5b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Details.tsx @@ -0,0 +1,26 @@ +import type { ComponentProps } from 'react'; +import { CollapsibleSlots } from '../constants'; +import classNames from 'classnames'; + +/** + * Details slot for the Collapsible component. + * + * @example + * + * ... + * + * Details content here + * + * + */ +function Details({ className, children, ...restProps }: ComponentProps<'div'>) { + return ( +
+ {children} +
+ ); +} + +Details.displayName = CollapsibleSlots.Details; + +export default Details; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Icon.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Icon.tsx new file mode 100644 index 00000000..ae291c12 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Icon.tsx @@ -0,0 +1,32 @@ +import VividIcon, { VividIconProps } from '@ui/VividIcon'; +import collapsible$ from '../collapsible$'; + +type IconProps = Omit; + +/** + * Default icon for the Collapsible component that indicates whether the content is expanded or collapsed. + * + * @example + * + * ... + * + * Summary content here + * + * + * + */ +const Icon = (props: IconProps) => { + const open = collapsible$.use.select(({ open }) => open); + return ( + + ); +}; + +Icon.displayName = `Collapsible.Icon`; + +export default Icon; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Summary.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Summary.tsx new file mode 100644 index 00000000..9b8805a1 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Summary.tsx @@ -0,0 +1,57 @@ +import type { ComponentProps, ReactNode } from 'react'; +import collapsible$, { CollapsibleAPI, CollapsibleState } from '../collapsible$'; +import { CollapsibleSlots } from '../constants'; +import { twMerge } from 'tailwind-merge'; +import { isFunction } from '@common/assertions'; +import { Prettify } from '@common/types'; + +type Callback = (state: Prettify) => ReactNode; + +type SummaryProps = Omit, 'children'> & { + children: ReactNode | Callback; +}; + +/** + * Summary slot for the Collapsible component. + * + * @example + * + * + * Summary content here + * + * ... + * + * @example + * + * + * {({ open }) => open ? 'Collapse' : 'Expand'} + * + * ... + */ +function Summary({ className, children, ...props }: SummaryProps) { + return ( + + {isFunction(children) ? ( + + ) : ( + (children as ReactNode) + )} + + ); +} + +function StateRenderer({ builder }: { builder: Callback }) { + const [state, actions] = collapsible$.use(); + return builder({ ...state, ...actions }); +} + +Summary.displayName = CollapsibleSlots.Summary; + +export default Summary; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/index.ts new file mode 100644 index 00000000..3c5ff98b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/index.ts @@ -0,0 +1,2 @@ +export { default as Summary } from './Summary'; +export { default as Details } from './Details'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/constants/CollapsibleSlots.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/constants/CollapsibleSlots.ts new file mode 100644 index 00000000..d579beb2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/constants/CollapsibleSlots.ts @@ -0,0 +1,6 @@ +enum CollapsibleSlots { + Summary = 'Collapsible.Summary', + Details = 'Collapsible.Details', +} + +export default CollapsibleSlots; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/constants/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/constants/index.ts new file mode 100644 index 00000000..5e060122 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/constants/index.ts @@ -0,0 +1 @@ +export { default as CollapsibleSlots } from './CollapsibleSlots'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/index.tsx new file mode 100644 index 00000000..92c0879e --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/index.tsx @@ -0,0 +1 @@ +export { default } from './Collapsible'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.spec.tsx new file mode 100644 index 00000000..c663c460 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.spec.tsx @@ -0,0 +1,72 @@ +import { render as renderBase } from '@testing-library/react'; +import { createInstance } from 'i18next'; +import { type ReactNode } from 'react'; +import { I18nextProvider, initReactI18next } from 'react-i18next'; +import { afterEach, describe, expect, it, vi } from 'vitest'; +import NotificationItem from './NotificationItem'; + +describe('NotificationItem', () => { + afterEach(() => { + vi.useRealTimers(); + }); + + it('calls onDismiss after expirationMs passes', () => { + vi.useFakeTimers(); + + const onDismiss = vi.fn(); + + render( + + ); + + vi.advanceTimersByTime(0); + expect(onDismiss).not.toHaveBeenCalled(); + + vi.advanceTimersByTime(1); + expect(onDismiss).toHaveBeenCalledWith('notification:item-1'); + }); + + it('clears the pending timeout when unmounted', () => { + vi.useFakeTimers(); + + const onDismiss = vi.fn(); + const setTimeoutSpy = vi.spyOn(globalThis, 'setTimeout'); + const clearTimeoutSpy = vi.spyOn(globalThis, 'clearTimeout'); + + const { unmount } = render( + + ); + + const timeoutHandle = setTimeoutSpy.mock.results.at(-1)?.value; + + unmount(); + + expect(clearTimeoutSpy).toHaveBeenCalledWith(timeoutHandle); + }); +}); + +const i18n = createInstance(); + +void i18n.use(initReactI18next).init({ + lng: 'en', + fallbackLng: 'en', + resources: { en: { translation: {} } }, + interpolation: { escapeValue: false }, + initImmediate: false, +}); + +function render(ui: ReactNode) { + return renderBase({ui}); +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.stories.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.stories.tsx new file mode 100644 index 00000000..6d3a6411 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.stories.tsx @@ -0,0 +1,144 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import i18next from 'i18next'; +import { initReactI18next, I18nextProvider } from 'react-i18next'; +import type { NotificationId } from '@core/stores/notifications'; +import NotificationItem from './NotificationItem'; +import { notifications$ } from '@core/stores'; + +const i18n = i18next.createInstance(); +void i18n.use(initReactI18next).init({ + lng: 'en', + resources: { en: { translation: { 'notification.dismiss': 'Dismiss notification' } } }, +}); + +const meta = { + title: 'UI/Notifications/NotificationItem', + component: NotificationItem, + decorators: [ + (Story) => ( + + + + ), + ], + argTypes: { + type: { + control: { type: 'select' }, + options: ['info', 'warning', 'success'], + }, + }, + args: { + id: 'notification:preview' as const, + message: 'This is a notification message.', + expirationMs: null, + }, +} satisfies Meta; + +type Story = StoryObj; + +export const AllTypes: Story = { + args: { type: 'info', onDismiss: () => {} }, + parameters: { controls: { disable: true } }, + render: () => { + const infoId = 'notification:info' as NotificationId; + const warningId = 'notification:warning' as NotificationId; + const successId = 'notification:success' as NotificationId; + const childrenId = 'notification:children' as NotificationId; + + return ( + +
+ + + + +
+ View error details +
+                {`MediaProcessorError: GPU acceleration unavailable\n  at BackgroundProcessor.apply (processor.js:42)`}
+              
+
+
+
+
+ ); + }, +}; + +export const Info: Story = { + args: { type: 'info', onDismiss: notifications$.actions.dismiss }, +}; + +export const Warning: Story = { + args: { type: 'warning', onDismiss: notifications$.actions.dismiss }, +}; + +export const Success: Story = { + args: { type: 'success', onDismiss: notifications$.actions.dismiss }, +}; + +export const WithAutoDismiss: Story = { + args: { + type: 'info', + message: 'This notification will dismiss after 3 seconds.', + expirationMs: 3000, + onDismiss: notifications$.actions.dismiss, + }, +}; + +export const LongMessage: Story = { + args: { + type: 'warning', + message: + 'This is a longer notification message to show how text wraps inside the notification item component when the content exceeds one line.', + onDismiss: notifications$.actions.dismiss, + }, +}; + +export const WithChildren: Story = { + args: { + type: 'warning', + message: 'Failed to apply background effect.', + onDismiss: notifications$.actions.dismiss, + }, + render: (args) => ( + + +
+ + View error details + +
+            {`MediaProcessorError: GPU acceleration unavailable\n  at BackgroundProcessor.apply (processor.js:42)\n  at VideoSession.applyEffect (session.js:118)`}
+          
+
+
+
+ ), +}; + +export default meta; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.tsx new file mode 100644 index 00000000..3069d949 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.tsx @@ -0,0 +1,105 @@ +import { + useEffect, + type ReactElement, + PropsWithChildren, + ComponentProps, + CSSProperties, +} from 'react'; +import { useTranslation } from 'react-i18next'; +import type { NotificationEntry, NotificationId } from '@core/stores/notifications'; +import VividIcon from '@ui/VividIcon'; +import classNames from 'classnames'; +import { twMerge } from 'tailwind-merge'; +import { Prettify } from '@common/types'; +import { isString } from '@common/assertions'; + +const typeIconName: Record = { + info: 'info-line', + warning: 'warning-line', + success: 'check-circle-line', +}; + +const typeIconColorVar: Record = { + info: 'var(--vera-information)', + warning: 'var(--vera-warning)', + success: 'var(--vera-success)', +}; + +type NotificationItemProps = PropsWithChildren< + Prettify< + ComponentProps<'div'> & + NotificationEntry & { + onDismiss: (id: NotificationId) => void; + iconStyle?: CSSProperties; + } + > +>; + +function NotificationItem({ + id, + type, + message, + expirationMs, + onDismiss, + children, + className, + iconStyle, + ...rest +}: NotificationItemProps): ReactElement { + const { t } = useTranslation(); + + useEffect(() => { + if (expirationMs === null) return; + + const timer = setTimeout(() => onDismiss(id), expirationMs); + + return () => clearTimeout(timer); + }, [id, expirationMs, onDismiss]); + + const iconColorStyle: CSSProperties = { + color: typeIconColorVar[type], + pointerEvents: 'none', + ...iconStyle, + }; + + return ( +
+
+ +
+ +
+ {isString(message) ? ( +

+ ) : ( + message + )} + + {children} +

+ + +
+ ); +} + +export default NotificationItem; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/index.ts new file mode 100644 index 00000000..9a5a4dc9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/index.ts @@ -0,0 +1 @@ +export { default } from './NotificationItem'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/NotificationsContainer.stories.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/NotificationsContainer.stories.tsx new file mode 100644 index 00000000..6473a321 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/NotificationsContainer.stories.tsx @@ -0,0 +1,166 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import i18next from 'i18next'; +import { initReactI18next, I18nextProvider } from 'react-i18next'; +import notifications$ from '@core/stores/notifications'; +import NotificationsContainer from './NotificationsContainer'; +import { ZodIssue } from '@common/errors'; +import { handleClientApplicationError } from '@ui/helpers'; +import { ApplicationClientError } from '@core/errors'; + +const i18n = i18next.createInstance(); +void i18n.use(initReactI18next).init({ + lng: 'en', + resources: { en: { translation: { 'notification.dismiss': 'Dismiss notification' } } }, +}); + +const meta = { + title: 'UI/Notifications/NotificationsContainer', + component: NotificationsContainer, + argTypes: { + position: { + control: { type: 'select' }, + options: ['top-right', 'bottom-center'], + }, + }, + args: { + position: 'top-right', + }, + parameters: { + layout: 'fullscreen', + }, + decorators: [ + (Story) => ( + +
+ +
+
+ ), + ], +} satisfies Meta; + +type Story = StoryObj; + +const mocks: ZodIssue[] = [ + { + code: 'invalid_type', + path: ['username'], + message: 'Invalid input: expected string, received number', + expected: 'string', + received: 'number', + }, + { + code: 'too_small', + path: ['password'], + message: 'String must contain at least 8 character(s)', + expected: 'string', + received: 'string', + }, + { + code: 'invalid_enum_value', + path: ['role'], + message: "Invalid enum value. Expected 'admin' | 'user', received 'superuser'", + expected: "'admin' | 'user'", + received: "'superuser'", + }, +]; + +export const Interactive: Story = { + render: ({ position }) => { + return ( + <> +
+ + + + + + + + +
+ + + + ); + }, +}; + +export default meta; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/NotificationsContainer.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/NotificationsContainer.tsx new file mode 100644 index 00000000..8f64e13d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/NotificationsContainer.tsx @@ -0,0 +1,48 @@ +import { type ReactElement } from 'react'; +import { tv } from 'tailwind-variants'; +import notifications$ from '@core/stores/notifications'; +import type { NotificationId } from '@core/stores/notifications'; +import NotificationItem from '../NotificationItem'; + +type NotificationPosition = 'top-right' | 'bottom-center'; + +const NotificationsContainer = ({ + position = 'top-right', +}: NotificationsContainerProps): ReactElement => { + const notifications = notifications$.use.select(({ notifications }) => notifications); + + const handleDismiss = (id: NotificationId) => { + notifications$.actions.dismiss(id); + }; + + return ( +
+ {[...notifications.values()].map((notification) => ( + + ))} +
+ ); +}; + +const variants = tv({ + base: 'fixed z-1400 flex flex-col gap-3 pointer-events-none max-sm:w-[calc(100%-12px)] pl-3', + variants: { + position: { + 'top-right': 'top-4 right-3', + 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2 items-center', + }, + }, + defaultVariants: { + position: 'top-right', + }, +}); + +function styles({ position }: { position: NotificationPosition }) { + return variants({ position }); +} + +type NotificationsContainerProps = { + position?: 'top-right' | 'bottom-center'; +}; + +export default NotificationsContainer; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/index.ts new file mode 100644 index 00000000..3deb6f7a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/index.ts @@ -0,0 +1 @@ +export { default } from './NotificationsContainer'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/index.ts new file mode 100644 index 00000000..7d7839dc --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/index.ts @@ -0,0 +1,3 @@ +export { default as Collapsible } from './Collapsible'; +export { default as NotificationsContainer } from './NotificationsContainer'; +export { default as NotificationItem } from './NotificationItem'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/findSlotByDisplayName/findSlotByDisplayName.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/findSlotByDisplayName/findSlotByDisplayName.ts new file mode 100644 index 00000000..40743104 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/findSlotByDisplayName/findSlotByDisplayName.ts @@ -0,0 +1,24 @@ +import { isFunction } from '@common/assertions'; +import React from 'react'; + +/** + * In a collection of React nodes, finds the first node that matches the provided display name. + */ +function findSlotByDisplayName({ + children, + displayName, +}: { + children: React.ReactNode[]; + displayName: string; +}): React.ReactNode { + return ( + children.find?.((child: unknown) => { + const isValidElement = React.isValidElement(child) && isFunction(child.type); + if (!isValidElement) return false; + + return (child.type as React.ComponentType).displayName === displayName; + }) ?? null + ); +} + +export default findSlotByDisplayName; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/findSlotByDisplayName/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/findSlotByDisplayName/index.ts new file mode 100644 index 00000000..dba9e3ba --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/findSlotByDisplayName/index.ts @@ -0,0 +1 @@ +export { default } from './findSlotByDisplayName'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/handleClientApplicationError.test.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/handleClientApplicationError.test.tsx new file mode 100644 index 00000000..38edddd0 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/handleClientApplicationError.test.tsx @@ -0,0 +1,44 @@ +import { renderHook, act } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import handleClientApplicationError from './handleClientApplicationError'; +import ApplicationClientError from '@core/errors/ApplicationClientError/ApplicationClientError'; +import notifications$ from '@core/stores/notifications/notifications$'; + +describe('handleClientApplicationError', () => { + it('pushes warning notifications with children for string and ZodIssue issues', () => { + const { result } = renderHook(() => notifications$.use()); + + const stringIssueError = new ApplicationClientError({ + src: { message: 'Validation failed', issues: ['Field is required'] }, + fallbackConfig: { fallbackMessage: 'Fallback' }, + }); + + const zodIssueError = new ApplicationClientError({ + src: { + message: 'Invalid input', + issues: [ + { + code: 'invalid_type', + path: ['email'], + message: 'Expected string', + expected: 'string', + received: 'number', + }, + ], + }, + fallbackConfig: { fallbackMessage: 'Fallback' }, + }); + + act(() => { + handleClientApplicationError(stringIssueError); + handleClientApplicationError(zodIssueError); + }); + + const entries = [...result.current[0].notifications.values()]; + expect(entries).toHaveLength(2); + entries.forEach((entry) => { + expect(entry.type).toBe('warning'); + expect(entry.children).not.toBeUndefined(); + }); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/handleClientApplicationError.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/handleClientApplicationError.tsx new file mode 100644 index 00000000..7319df0f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/handleClientApplicationError.tsx @@ -0,0 +1,101 @@ +import notifications$ from '@core/stores/notifications'; +import { makeApplicationErrorMapper, type ApplicationClientError } from '@core/errors'; +import { Collapsible } from '../../components'; +import classNames from 'classnames'; +import type { ZodIssue } from '@common/errors'; +import logger from '@core/logger'; +import { isString } from '@common/assertions'; + +/** + * Handles application errors on the client by showing a notification with the error message and details + */ +function handleClientApplicationError(error: ApplicationClientError): void; + +/** + * Handles application errors on the client by showing a notification with the error message and details. + * The fallbackMessage only will be shown to the user if the exception is not an ApplicationClientError. + */ +function handleClientApplicationError(fallbackMessage: string, error: unknown): void; + +function handleClientApplicationError(arg0: ApplicationClientError | string, arg1?: unknown): void { + const fallbackMessage = isString(arg0) ? arg0 : arg0.fallbackConfig.fallbackMessage; + const error = isString(arg0) ? makeApplicationErrorMapper(fallbackMessage)(arg1) : arg0; + + notifications$.actions.push({ + type: 'warning', + message: error.fallbackMessage, + expirationMs: null, + children: error.issues.length ? makeErrorDetails(error) : undefined, + }); + + logger.reportError(error); +} + +function makeErrorDetails(error: ApplicationClientError) { + if (!error.issues?.length) return null; + + return ( + + + {({ open }) => ( + + {open ? 'See less' : 'See details'} + + )} + + + + {error.issues.map((issue: unknown, index) => { + const isZodIssue = isZodIssueObject(issue); + + return ( +
+ + ✖ {isZodIssue ? issueLabel(issue) : (issue as string)} + + + {isZodIssue && issue.expected && issue.received && ( +

+ expected {issue.expected}, received {issue.received} +

+ )} + + {isZodIssue && issue.path.length > 0 && ( +

→ at {issue.path.join('.')}

+ )} +
+ ); + })} +
+
+ ); +} + +function issueLabel(issue: ZodIssue): string { + if (issue.expected && issue.received) { + return issue.message.split(':')[0] + ':'; + } + + return issue.message; +} + +function isZodIssueObject(issue: unknown): issue is ZodIssue { + return ( + typeof issue === 'object' && + issue !== null && + typeof (issue as ZodIssue).message === 'string' && + Array.isArray((issue as ZodIssue).path) + ); +} + +export default handleClientApplicationError; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/index.ts new file mode 100644 index 00000000..52792bec --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/index.ts @@ -0,0 +1 @@ +export { default } from './handleClientApplicationError'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/index.ts new file mode 100644 index 00000000..fd952f4c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/index.ts @@ -0,0 +1,2 @@ +export { default as findSlotByDisplayName } from './findSlotByDisplayName'; +export { default as handleClientApplicationError } from './handleClientApplicationError'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/pick b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/pick new file mode 100644 index 00000000..e69de29b diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/hooks/useDistinctLabelMediaDevices/useDistinctLabelMediaDevices.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/hooks/useDistinctLabelMediaDevices/useDistinctLabelMediaDevices.spec.ts index 41f686b0..c577b612 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/hooks/useDistinctLabelMediaDevices/useDistinctLabelMediaDevices.spec.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/hooks/useDistinctLabelMediaDevices/useDistinctLabelMediaDevices.spec.ts @@ -4,6 +4,7 @@ import type { MediaDeviceInfoJSON } from '@web/types'; import useDistinctLabelMediaDevices from '.'; import mediaDevices$ from '@core/stores/devices'; import { makeMediaDeviceInfos, setupWindowNavigatorMock } from '@web-test/fixtures'; +import { mediaDevicesEnvelop } from '@core/interceptors'; const devices = makeMediaDeviceInfos(); @@ -20,6 +21,8 @@ describe('useDistinctLabelMediaDevices', () => { }, }); + mediaDevicesEnvelop.rebind(navigator); + mediaDevices$.reset(); }); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/index.ts index d9b08b76..517c03ec 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/index.ts @@ -1,6 +1,18 @@ export { default as Card, type CardProps } from './Card'; +export { default as Collapsible } from './components/Collapsible'; +export { default as Field, type FieldInputProps } from './Field'; export { default as Header, type HeaderProps } from './Header'; +export { + default as LabeledValueList, + type LabeledValueItem, + type LabeledValueListProps, +} from './LabeledValueList'; export { default as PageLayout, type PageLayoutProps } from './PageLayout'; export { default as PageLayoutEmbed, type PageLayoutEmbedProps } from './PageLayoutEmbed'; - -export { default as theme } from './theme'; +export { + default as SelectField, + type SelectFieldOption, + type SelectFieldProps, +} from './SelectField'; +export { default as SwitchField, type SwitchFieldProps } from './SwitchField'; +export { default as VividIcon, type VividIconProps } from './VividIcon'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/ThemeProvider.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/ThemeProvider.tsx new file mode 100644 index 00000000..09ec8261 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/ThemeProvider.tsx @@ -0,0 +1,16 @@ +import { ThemeProvider as ThemeProviderBase } from '@mui/material'; +import React, { PropsWithChildren, useMemo } from 'react'; +import useSynchronizeThemeAndMedia from './hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia'; +import getMuiCustomTheme, { GetMuiCustomThemeProps } from './helpers/getMuiCustomTheme'; + +export type ThemeProviderProps = PropsWithChildren; + +export const ThemeProvider: React.FC = ({ children, container }) => { + const theme = useMemo(() => getMuiCustomTheme({ container }), [container]); + + useSynchronizeThemeAndMedia(); + + return {children}; +}; + +export default ThemeProvider; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/themeContext.types.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/ThemeProvider.types.ts similarity index 92% rename from tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/themeContext.types.ts rename to tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/ThemeProvider.types.ts index 8f78bfd4..fbe391ea 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/themeContext.types.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/ThemeProvider.types.ts @@ -119,25 +119,25 @@ export type ColorsTokens = { 'skeleton-like': ColorTokenItem; }; -export type ShapeTokenItem = { +export type BorderTokenItem = { value: string; type: 'radius'; description: string; }; -export type ShapesTokens = { - none: ShapeTokenItem; - 'extra-small': ShapeTokenItem; - small: ShapeTokenItem; - medium: ShapeTokenItem; - large: ShapeTokenItem; - 'extra-large': ShapeTokenItem; +export type BorderTokens = { + none: BorderTokenItem; + 'extra-small': BorderTokenItem; + small: BorderTokenItem; + medium: BorderTokenItem; + large: BorderTokenItem; + 'extra-large': BorderTokenItem; }; export type ThemeTokens = { typography: TypographyTokens; colors: ColorsTokens; - shapes: ShapesTokens; + border: BorderTokens; }; export type Camelize = S extends `${infer Head}-${infer Tail}` @@ -146,7 +146,7 @@ export type Camelize = S extends `${infer Head}-${infer Tail}` export type ThemeColors = Record, string>; -export type ThemeShapes = { +export type ThemeBorder = { borderRadiusNone: string; borderRadiusExtraSmall: string; borderRadiusSmall: string; @@ -165,13 +165,13 @@ export type ThemeWeight = keyof ThemeTypography['weight']; export type Theme = { colors: ThemeColors; - shapes: ThemeShapes; + border: ThemeBorder; typography: ThemeTypography; }; export type PartialTheme = { colors?: Partial; - shapes?: Partial; + border?: Partial; typography?: { typeface?: Partial>; typeScale?: Partial>>; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/designTokens.json b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/designTokens.json index 455306f7..c048a067 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/designTokens.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/designTokens.json @@ -1,245 +1,195 @@ { - "colors": { - "light": { - "primary": "#9941FF", - "text-primary": "#9941FF", - "on-primary": "#FFFFFF", - "primary-hover": "#871EFF", - "secondary": "#000000", - "text-secondary": "#000000", - "on-secondary": "#FFFFFF", - "secondary-hover": "#666666", - "tertiary": "#757575", - "text-tertiary": "#757575", - "on-tertiary": "#FFFFFF", - "tertiary-hover": "#929292", - "accent": "#FFFFFF", - "on-accent": "#000000", - "background": "#F5F0FD", - "on-background": "#757575", - "surface": "#FFFFFF", - "on-surface": "#929292", - "alert-background": "#FFEEF2", - "alert-background-hover": "#FEDFDF", - "alert-text": "#CD0000", - "error": "#E61D1D", - "on-error": "#FFFFFF", - "error-hover": "#CD0000", - "warning": "#BE5702", - "on-warning": "#FFFFFF", - "warning-hover": "#A64C03", - "success": "#1C8731", - "on-success": "#FFFFFF", - "success-hover": "#1F7629", - "information": "#0276D5", - "on-information": "#FFFFFF", - "information-hover": "#2997F0", - "information-background": "#E8F4FB", - "border": "#E6E6E6", - "dark-background": "#202124", - "dark-grey": "#333333", - "dark-grey-hover": "#292828", - "on-dark-grey": "#FFFFFF", - "dark-grey-opacity": "#333333CD", - "disabled": "#E6E6E6", - "text-disabled": "#B3B3B3", - "skeleton-like": "#B3B3B3" - }, - "dark": { - "primary": "#B27BF2", - "text-primary": "#B27BF2", - "on-primary": "#000000", - "primary-hover": "#CBA1FA", - "secondary": "#FFFFFF", - "text-secondary": "#FFFFFF", - "on-secondary": "#000000", - "secondary-hover": "#929292", - "tertiary": "#B3B3B3", - "text-tertiary": "#B3B3B3", - "on-tertiary": "#000000", - "tertiary-hover": "#B3B3B3", - "accent": "#FFFFFF", - "on-accent": "#000000", - "background": "#26044D", - "on-background": "#B3B3B3", - "surface": "#000000", - "on-surface": "#FFFFFF", - "alert-background": "#3E0004", - "alert-background-hover": "#6E0000", - "alert-text": "#FEDFDF", - "error": "#F75959", - "on-error": "#000000", - "error-hover": "#FE9696", - "warning": "#FA9F00", - "on-warning": "#000000", - "warning-hover": "#FACC4B", - "success": "#30A849", - "on-success": "#000000", - "success-hover": "#53CA6A", - "information": "#2997F0", - "on-information": "#FFFFFF", - "information-hover": "#0276D5", - "information-background": "#E8F4FB", - "border": "#333333", - "dark-background": "#202124", - "dark-grey": "#333333", - "dark-grey-hover": "#292828", - "on-dark-grey": "#FFFFFF", - "dark-grey-opacity": "#333333CD", - "disabled": "#333333", - "text-disabled": "#666666", - "skeleton-like": "#333333" - } + "light": { + "primary": "#9941FF", + "textPrimary": "#9941FF", + "onPrimary": "#FFFFFF", + "primaryHover": "#871EFF", + "secondary": "#000000", + "textSecondary": "#000000", + "onSecondary": "#FFFFFF", + "secondaryHover": "#666666", + "tertiary": "#757575", + "textTertiary": "#757575", + "onTertiary": "#FFFFFF", + "tertiaryHover": "#929292", + "accent": "#FFFFFF", + "onAccent": "#000000", + "background": "#F5F0FD", + "onBackground": "#757575", + "surface": "#FFFFFF", + "onSurface": "#929292", + "alertBackground": "#FFEEF2", + "alertBackgroundHover": "#FEDFDF", + "alertText": "#CD0000", + "error": "#E61D1D", + "onError": "#FFFFFF", + "errorHover": "#CD0000", + "warning": "#BE5702", + "onWarning": "#FFFFFF", + "warningHover": "#A64C03", + "success": "#1C8731", + "onSuccess": "#FFFFFF", + "successHover": "#1F7629", + "information": "#0276D5", + "onInformation": "#FFFFFF", + "informationHover": "#2997F0", + "informationBackground": "#E8F4FB", + "border": "#E6E6E6", + "darkBackground": "#202124", + "darkGrey": "#333333", + "darkGreyHover": "#292828", + "onDarkGrey": "#FFFFFF", + "darkGreyOpacity": "#333333CD", + "disabled": "#E6E6E6", + "textDisabled": "#B3B3B3", + "skeletonLike": "#B3B3B3" }, - "borderRadius": { - "none": "0px", - "extra-small": "2px", - "small": "4px", - "medium": "8px", - "large": "12px", - "extra-large": "24px" + "dark": { + "primary": "#B27BF2", + "textPrimary": "#B27BF2", + "onPrimary": "#000000", + "primaryHover": "#CBA1FA", + "secondary": "#FFFFFF", + "textSecondary": "#FFFFFF", + "onSecondary": "#000000", + "secondaryHover": "#929292", + "tertiary": "#B3B3B3", + "textTertiary": "#B3B3B3", + "onTertiary": "#000000", + "tertiaryHover": "#B3B3B3", + "accent": "#FFFFFF", + "onAccent": "#000000", + "background": "#26044D", + "onBackground": "#B3B3B3", + "surface": "#000000", + "onSurface": "#FFFFFF", + "alertBackground": "#3E0004", + "alertBackgroundHover": "#6E0000", + "alertText": "#FEDFDF", + "error": "#F75959", + "onError": "#000000", + "errorHover": "#FE9696", + "warning": "#FA9F00", + "onWarning": "#000000", + "warningHover": "#FACC4B", + "success": "#30A849", + "onSuccess": "#000000", + "successHover": "#53CA6A", + "information": "#2997F0", + "onInformation": "#FFFFFF", + "informationHover": "#0276D5", + "informationBackground": "#E8F4FB", + "border": "#333333", + "darkBackground": "#202124", + "darkGrey": "#333333", + "darkGreyHover": "#292828", + "onDarkGrey": "#FFFFFF", + "darkGreyOpacity": "#333333CD", + "disabled": "#333333", + "textDisabled": "#666666", + "skeletonLike": "#333333" }, - "fontFamily": { - "plain": "Inter, sans-serif, system-ui, ui-sans-serif, Marker Felt, Trebuchet MS" + "borderRadiusNone": "0px", + "borderRadiusExtraSmall": "2px", + "borderRadiusSmall": "4px", + "borderRadiusMedium": "8px", + "borderRadiusLarge": "12px", + "borderRadiusExtraLarge": "24px", + "fontFamilyPlain": "Inter, sans-serif, system-ui, ui-sans-serif, Marker Felt, Trebuchet MS", + "headline": { + "fontSize": "4.125rem", + "lineHeight": "5.5rem", + "fontWeight": "500", + "mobileFontSize": "2rem", + "mobileLineHeight": "2.5rem", + "mobileFontWeight": "500" }, - "fontSize": { - "desktop": { - "headline": { - "fontSize": "4.125rem", - "lineHeight": "5.5rem", - "fontWeight": "500" - }, - "subtitle": { - "fontSize": "3.25rem", - "lineHeight": "4.25rem", - "fontWeight": "500" - }, - "heading-1": { - "fontSize": "2.5rem", - "lineHeight": "3.25rem", - "fontWeight": "500" - }, - "heading-2": { - "fontSize": "2rem", - "lineHeight": "2.75rem", - "fontWeight": "500" - }, - "heading-3": { - "fontSize": "1.625rem", - "lineHeight": "2.25rem", - "fontWeight": "500" - }, - "heading-4": { - "fontSize": "1.25rem", - "lineHeight": "1.75rem", - "fontWeight": "500" - }, - "body-extended": { - "fontSize": "1rem", - "lineHeight": "1.5rem", - "fontWeight": "400" - }, - "body-extended-semibold": { - "fontSize": "1rem", - "lineHeight": "1.5rem", - "fontWeight": "600" - }, - "body-base": { - "fontSize": "0.875rem", - "lineHeight": "1.25rem", - "fontWeight": "400" - }, - "body-base-semibold": { - "fontSize": "0.875rem", - "lineHeight": "1.25rem", - "fontWeight": "600" - }, - "caption": { - "fontSize": "0.75rem", - "lineHeight": "1rem", - "fontWeight": "400" - }, - "caption-semibold": { - "fontSize": "0.75rem", - "lineHeight": "1rem", - "fontWeight": "600" - } - }, - "mobile": { - "headline": { - "fontSize": "2rem", - "lineHeight": "2.5rem", - "fontWeight": "500" - }, - "subtitle": { - "fontSize": "1.875rem", - "lineHeight": "2.375rem", - "fontWeight": "500" - }, - "heading-1": { - "fontSize": "1.75rem", - "lineHeight": "2.25rem", - "fontWeight": "500" - }, - "heading-2": { - "fontSize": "1.5rem", - "lineHeight": "2rem", - "fontWeight": "500" - }, - "heading-3": { - "fontSize": "1.25rem", - "lineHeight": "1.75rem", - "fontWeight": "500" - }, - "heading-4": { - "fontSize": "1.125rem", - "lineHeight": "1.5rem", - "fontWeight": "500" - }, - "body-extended": { - "fontSize": "1rem", - "lineHeight": "1.5rem", - "fontWeight": "400" - }, - "body-extended-semibold": { - "fontSize": "1rem", - "lineHeight": "1.5rem", - "fontWeight": "600" - }, - "body-base": { - "fontSize": "0.875rem", - "lineHeight": "1.25rem", - "fontWeight": "400" - }, - "body-base-semibold": { - "fontSize": "0.875rem", - "lineHeight": "1.25rem", - "fontWeight": "600" - }, - "caption": { - "fontSize": "0.75rem", - "lineHeight": "1rem", - "fontWeight": "400" - }, - "caption-semibold": { - "fontSize": "0.75rem", - "lineHeight": "1rem", - "fontWeight": "600" - } - } + "subtitle": { + "fontSize": "3.25rem", + "lineHeight": "4.25rem", + "fontWeight": "500", + "mobileFontSize": "1.875rem", + "mobileLineHeight": "2.375rem", + "mobileFontWeight": "500" }, - "fontWeight": { - "headline": 500, - "subtitle": 500, - "heading-1": 500, - "heading-2": 500, - "heading-3": 500, - "heading-4": 500, - "body-extended": 400, - "body-extended-semibold": 600, - "body-base": 400, - "body-base-semibold": 600, - "caption": 400, - "caption-semibold": 600 + "heading1": { + "fontSize": "2.5rem", + "lineHeight": "3.25rem", + "fontWeight": "500", + "mobileFontSize": "1.75rem", + "mobileLineHeight": "2.25rem", + "mobileFontWeight": "500" + }, + "heading2": { + "fontSize": "2rem", + "lineHeight": "2.75rem", + "fontWeight": "500", + "mobileFontSize": "1.5rem", + "mobileLineHeight": "2rem", + "mobileFontWeight": "500" + }, + "heading3": { + "fontSize": "1.625rem", + "lineHeight": "2.25rem", + "fontWeight": "500", + "mobileFontSize": "1.25rem", + "mobileLineHeight": "1.75rem", + "mobileFontWeight": "500" + }, + "heading4": { + "fontSize": "1.25rem", + "lineHeight": "1.75rem", + "fontWeight": "500", + "mobileFontSize": "1.125rem", + "mobileLineHeight": "1.5rem", + "mobileFontWeight": "500" + }, + "bodyExtended": { + "fontSize": "1rem", + "lineHeight": "1.5rem", + "fontWeight": "400", + "mobileFontSize": "1rem", + "mobileLineHeight": "1.5rem", + "mobileFontWeight": "400" + }, + "bodyExtendedSemibold": { + "fontSize": "1rem", + "lineHeight": "1.5rem", + "fontWeight": "600", + "mobileFontSize": "1rem", + "mobileLineHeight": "1.5rem", + "mobileFontWeight": "600" + }, + "bodyBase": { + "fontSize": "0.875rem", + "lineHeight": "1.25rem", + "fontWeight": "400", + "mobileFontSize": "0.875rem", + "mobileLineHeight": "1.25rem", + "mobileFontWeight": "400" + }, + "bodyBaseSemibold": { + "fontSize": "0.875rem", + "lineHeight": "1.25rem", + "fontWeight": "600", + "mobileFontSize": "0.875rem", + "mobileLineHeight": "1.25rem", + "mobileFontWeight": "600" + }, + "caption": { + "fontSize": "0.75rem", + "lineHeight": "1rem", + "fontWeight": "400", + "mobileFontSize": "0.75rem", + "mobileLineHeight": "1rem", + "mobileFontWeight": "400" + }, + "captionSemibold": { + "fontSize": "0.75rem", + "lineHeight": "1rem", + "fontWeight": "600", + "mobileFontSize": "0.75rem", + "mobileLineHeight": "1rem", + "mobileFontWeight": "600" } } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/designTokens.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/designTokens.ts index 7e12a001..4fc9c188 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/designTokens.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/designTokens.ts @@ -1,11 +1,11 @@ import typography from './tokens/typography'; import color from './tokens/color'; -import shape from './tokens/shape'; +import border from './tokens/border'; const designTokens = { typography, color, - shape, + border, }; export default designTokens; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/helpers/tokensToJson.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/helpers/tokensToJson.ts index 99195193..e4601898 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/helpers/tokensToJson.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/helpers/tokensToJson.ts @@ -1,149 +1,145 @@ import * as fs from 'node:fs'; import * as path from 'node:path'; +import { fileURLToPath } from 'node:url'; import designTokens from '../designTokens.js'; -import type { Device, ThemeTypeface, ThemeTypeScale, ThemeWeight } from '@ui/theme'; - -const outputFile = path.resolve('libs/ui/src/theme/helpers/designTokens/designTokens.json'); - -type FontSize = { - fontSize: string; - lineHeight: string; - fontWeight: string; -}; - -type UnwrappedTokens = { - lightColor: Record; - darkColor: Record; - shape: Record; - elevation: Record; - state: Record; - motion: { - duration: Record; - easing: Record; - }; - typography: { - typeface: Record; - weight: Record; - typeScale: Record< - Device, - Record< - ThemeTypeScale, - { - fontSize: string; - lineHeight: string; - fontWeight: number; - } - > - >; - }; -}; +import type { VeraUIConfig } from '@ui/theme/helpers/veraUI.types'; /** - * Converts the design tokens to tailwind format and writes them to a JSON file. + * Transforms design tokens into VeraUIConfig shape and writes to JSON file. + * @param outputDirPath - Directory to write output file + * @param outputFileName - Name of output file */ -function designTokensToJson() { - // Ensure parent directory exists - fs.mkdirSync(path.dirname(outputFile), { recursive: true }); - - const unwrappedTokens = unwrapValue({ - ...designTokens, - lightColor: designTokens.color.light, - darkColor: designTokens.color.dark, - }) as UnwrappedTokens; - - const desktopFontSize = parseResponsiveFontSize(unwrappedTokens.typography.typeScale.desktop); - const mobileFontSize = parseResponsiveFontSize(unwrappedTokens.typography.typeScale.mobile); - - const tailwindExtend = { - colors: { - light: unwrappedTokens.lightColor, - dark: unwrappedTokens.darkColor, - }, - borderRadius: unwrappedTokens.shape, - boxShadow: unwrappedTokens.elevation, - opacity: unwrappedTokens.state, - transitionDuration: unwrappedTokens.motion?.duration, - transitionTimingFunction: unwrappedTokens.motion?.easing, - fontFamily: unwrappedTokens.typography?.typeface, - fontSize: { - desktop: desktopFontSize, - mobile: mobileFontSize, - }, - fontWeight: unwrappedTokens.typography?.weight, - }; - - // Write or overwrite the file - fs.writeFileSync(outputFile, JSON.stringify(tailwindExtend, null, 2) + '\n', { - flag: 'w', - }); - - console.log(`\x1b[32m✔ Design tokens JSON written to ${outputFile}\x1b[0m`); +export function tokensToJson(outputDirPath: string, outputFileName: string): void { + const outputFilePath = path.resolve(outputDirPath, outputFileName); + const veraConfig = buildVeraUIConfig(); + + fs.mkdirSync(path.dirname(outputFilePath), { recursive: true }); + fs.writeFileSync(outputFilePath, JSON.stringify(veraConfig, null, 2) + '\n', { flag: 'w' }); + + console.log(`\x1b[32m✔ Design tokens JSON written to ${outputFilePath}\x1b[0m`); } /** - * Recursively unwraps the `value` properties from the design tokens. - * @param {unknown} obj - The object to unwrap. - * @returns {unknown} The unwrapped object. + * Transforms unwrapped design tokens into VeraUIConfig shape. */ -function unwrapValue(obj: unknown): unknown { - if (!isRecord(obj)) { - return obj; - } - if (!isUndefined(obj.value)) { - return obj.value; - } +function buildVeraUIConfig(): VeraUIConfig { + const unwrapped = unwrapValue(designTokens) as Record; - return Object.fromEntries( - Object.entries(obj) - .filter(([, value]) => value !== undefined) - .map(([key, value]) => [key, unwrapValue(value)]) + const kebabToCamelCase = (str: string): string => + str.replace(/-([a-z0-9])/g, (_, c: string) => c.toUpperCase()); + + // Light colors + const colorObj = unwrapped.color as Record> | undefined; + const lightColor = colorObj?.light ?? {}; + + const light = Object.fromEntries( + Object.entries(lightColor) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([k, v]) => [kebabToCamelCase(k), v]) ); -} -/** - * Type guard to check if a value is a Record. - * @param {unknown} value - The value to check. - * @returns {boolean} True if the value is a Record, false otherwise. - */ -function isRecord(value: unknown): value is Record { - return typeof value === 'object' && value !== null; -} + // Dark colors + const darkColor = colorObj?.dark ?? {}; -/** - * Type guard to check if a value is undefined. - * @param {unknown} value - The value to check. - * @returns {boolean} True if the value is undefined, false otherwise. - */ -function isUndefined(value: unknown): value is undefined { - return typeof value === 'undefined'; + const dark = Object.fromEntries( + Object.entries(darkColor) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([k, v]) => [kebabToCamelCase(k), v]) + ); + + // Border radius + const border = (unwrapped.border as Record | undefined) ?? {}; + const borderRadiusConfig = Object.fromEntries( + Object.entries(border) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([k, v]) => [`borderRadius${kebabToCamelCase(`-${k}`)}`, v]) + ); + + // Font family + const typography = (unwrapped.typography as Record | undefined) ?? {}; + const typeface = (typography.typeface as Record | undefined) ?? {}; + + const fontFamilyConfig = Object.fromEntries( + Object.entries(typeface) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([k, v]) => [`fontFamily${kebabToCamelCase(`-${k}`)}`, v]) + ); + + // Typography + const typeScaleObj = typography.typeScale as + | Record>> + | undefined; + const typeScale = typeScaleObj ?? {}; + const desktop = (typeScale.desktop as Record> | undefined) ?? {}; + const mobile = (typeScale.mobile as Record> | undefined) ?? {}; + + const typographyKeysByConfig = { + headline: 'headline', + subtitle: 'subtitle', + heading1: 'heading-1', + heading2: 'heading-2', + heading3: 'heading-3', + heading4: 'heading-4', + bodyExtended: 'body-extended', + bodyExtendedSemibold: 'body-extended-semibold', + bodyBase: 'body-base', + bodyBaseSemibold: 'body-base-semibold', + caption: 'caption', + captionSemibold: 'caption-semibold', + } as const; + + const typographyConfig = Object.fromEntries( + Object.entries(typographyKeysByConfig).map(([configKey, tokenKey]) => { + const dtObj = desktop[tokenKey] ?? {}; + const mtObj = mobile[tokenKey] ?? {}; + + const fontSize = dtObj.fontSize as string | undefined; + const lineHeight = dtObj.lineHeight as string | undefined; + const fontWeight = dtObj.fontWeight as string | number | undefined; + const mobileFontSize = mtObj.fontSize as string | undefined; + const mobileLineHeight = mtObj.lineHeight as string | undefined; + const mobileFontWeight = mtObj.fontWeight as string | number | undefined; + + return [ + configKey, + { + ...(fontSize !== undefined ? { fontSize } : {}), + ...(lineHeight !== undefined ? { lineHeight } : {}), + ...(fontWeight !== undefined ? { fontWeight: String(fontWeight) } : {}), + ...(mobileFontSize !== undefined ? { mobileFontSize } : {}), + ...(mobileLineHeight !== undefined ? { mobileLineHeight } : {}), + ...(mobileFontWeight !== undefined ? { mobileFontWeight: String(mobileFontWeight) } : {}), + }, + ]; + }) + ); + + return { + light: light as VeraUIConfig['light'], + dark: dark as VeraUIConfig['dark'], + ...borderRadiusConfig, + ...fontFamilyConfig, + ...typographyConfig, + } as VeraUIConfig; } /** - * Transforms responsive font size objects into the desired format. - * @param {Record} fontSizes - The font size objects to transform. - * @returns {Record} The transformed font sizes. + * Recursively unwraps `value` properties from token objects. */ -function parseResponsiveFontSize( - fontSizes: Record< - ThemeTypeScale, - { - fontSize: string; - lineHeight: string; - fontWeight: number; - } - > -): Record { - return Object.entries(fontSizes).reduce( - (acc, [key, val]) => { - acc[key] = { - fontSize: val.fontSize, - lineHeight: val.lineHeight, - fontWeight: val.fontWeight.toString(), - }; - return acc; - }, - {} as Record +function unwrapValue(obj: unknown): unknown { + if (typeof obj !== 'object' || obj === null) return obj; + if (typeof (obj as Record).value !== 'undefined') + return (obj as Record).value; + + return Object.fromEntries( + Object.entries(obj as Record) + .filter(([, v]) => v !== undefined) + .map(([k, v]) => [k, unwrapValue(v)]) ); } -designTokensToJson(); +if (process.argv[1] === fileURLToPath(import.meta.url)) { + tokensToJson('.', 'designTokens.example.json'); +} + +export default tokensToJson; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/shape.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/border.ts similarity index 94% rename from tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/shape.ts rename to tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/border.ts index 4826ed46..01164a3e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/shape.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/border.ts @@ -1,11 +1,11 @@ /** - * Shape Tokens + * Border Tokens * * These tokens define the corner radius values used throughout the design system. * They provide a consistent approach to rounding corners on various UI components, * enhancing the overall visual coherence and user experience. */ -const shape = { +const border = { none: { value: '0px', type: 'radius', @@ -38,4 +38,4 @@ const shape = { }, }; -export default shape; +export default border; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/color.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/color.ts index 5c780387..457ed334 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/color.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/color.ts @@ -1,4 +1,4 @@ -import type { ThemeTokens } from '../../../themeContext.types'; +import type { ThemeTokens } from '../../../ThemeProvider.types'; /** * Color Tokens diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getMuiCustomTheme.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getMuiCustomTheme.spec.ts index fda8f314..24d82c08 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getMuiCustomTheme.spec.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getMuiCustomTheme.spec.ts @@ -1,10 +1,7 @@ import { describe, it, expect } from 'vitest'; import getMuiCustomTheme from './getMuiCustomTheme'; -import getTokensByMode from './getTokensByMode'; -const customTheme = getMuiCustomTheme({ - tokens: getTokensByMode('light'), -}); +const customTheme = getMuiCustomTheme(); describe('customTheme', () => { it('should have palette defined', () => { @@ -34,18 +31,15 @@ describe('customTheme', () => { expect(customTheme.components?.MuiButton?.styleOverrides).toBeDefined(); }); - it('should have custom palette colors', () => { - const { palette } = customTheme; - expect(palette.tertiary).toBeDefined(); - expect(palette.hover).toBeDefined(); - expect(palette.disabled).toBeDefined(); - }); - it('should have text colors defined', () => { const { text } = customTheme.palette; expect(text.primary).toBeDefined(); expect(text.secondary).toBeDefined(); - expect(text.tertiary).toBeDefined(); - expect(text.main).toBeDefined(); + }); + + it('should add a border to dialog paper in dark mode', () => { + expect(customTheme.components?.MuiDialog?.defaultProps?.slotProps?.paper).toMatchObject({ + className: expect.stringContaining('dark:border'), + }); }); }); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getMuiCustomTheme.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getMuiCustomTheme.ts index d5b325f8..a05192cb 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getMuiCustomTheme.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getMuiCustomTheme.ts @@ -1,109 +1,123 @@ -import { createTheme, type PaletteColor, type PaletteColorOptions } from '@mui/material'; -import type { Theme } from '@ui/theme'; -import isDarkMode from './isDarkMode'; - -// Extend theme options -declare module '@mui/material' { - interface TypeText { - tertiary: string; - main: string; - } - - interface Palette { - tertiary: PaletteColor; - hover: PaletteColor; - disabled: PaletteColor; - } - - interface PaletteOptions { - tertiary?: PaletteColorOptions; - hover?: PaletteColorOptions; - disabled?: PaletteColorOptions; - } -} +import { createTheme, Theme } from '@mui/material/styles'; +import { + veraTypographyCssVariableNames, + type VeraCssVariable, + type VeraTypographyTokenKey, +} from './veraUI.types'; export type GetMuiCustomThemeProps = { - tokens: Theme; container?: HTMLElement | null; }; -const getMuiCustomTheme = ({ tokens, container }: GetMuiCustomThemeProps) => { +const temporaryTypographyVariables = getTemporaryTypographyVariables(); + +const getMuiCustomTheme = ({ container }: GetMuiCustomThemeProps = {}): Theme => { + const getCssVariable = (name: VeraCssVariable): string => { + return `var(${name})`; + }; + + const getTemporaryTypography = ( + variant: keyof ReturnType + ) => { + const variableNames = temporaryTypographyVariables[variant].desktop; + + return { + fontSize: getCssVariable(variableNames.fontSize), + lineHeight: getCssVariable(variableNames.lineHeight), + fontWeight: getCssVariable(variableNames.fontWeight), + }; + }; + const buttonSx = { height: 40, // 40px textTransform: 'none', - borderRadius: tokens.shapes.borderRadiusMedium, + borderRadius: getCssVariable('--vera-border-radius-medium'), } as const; - const { colors } = tokens; + const cssVariables = container + ? { + rootSelector: ':host', + colorSchemeSelector: 'class', + } + : true; return createTheme({ + cssVariables, palette: { - mode: isDarkMode() ? 'dark' : 'light', primary: { - main: colors.primary, - contrastText: colors.onPrimary, - dark: colors.primary, - light: colors.background, + main: getCssVariable('--vera-primary'), + contrastText: getCssVariable('--vera-on-primary'), + dark: getCssVariable('--vera-primary-dark'), + light: getCssVariable('--vera-primary-light'), }, secondary: { - main: colors.secondary, - contrastText: colors.onSecondary, - dark: colors.secondary, - light: colors.background, + main: getCssVariable('--vera-secondary'), + contrastText: getCssVariable('--vera-on-secondary'), + dark: getCssVariable('--vera-secondary-dark'), + light: getCssVariable('--vera-secondary-light'), }, tertiary: { - main: colors.tertiary, - contrastText: colors.onTertiary, - dark: colors.tertiary, - light: colors.background, + main: getCssVariable('--vera-tertiary'), + contrastText: getCssVariable('--vera-on-tertiary'), + dark: getCssVariable('--vera-tertiary-dark'), + light: getCssVariable('--vera-tertiary-light'), }, success: { - main: colors.success, - contrastText: colors.onSuccess, - dark: colors.successHover, - light: colors.background, + main: getCssVariable('--vera-success'), + contrastText: getCssVariable('--vera-on-success'), + dark: getCssVariable('--vera-success-hover'), + light: getCssVariable('--vera-success-light'), }, warning: { - main: colors.warning, - contrastText: colors.onWarning, - dark: colors.warningHover, - light: colors.background, + main: getCssVariable('--vera-warning'), + contrastText: getCssVariable('--vera-on-warning'), + dark: getCssVariable('--vera-warning-hover'), + light: getCssVariable('--vera-warning-light'), }, error: { - main: colors.error, - contrastText: colors.onError, - dark: colors.errorHover, - light: colors.background, + main: getCssVariable('--vera-error'), + contrastText: getCssVariable('--vera-on-error'), + dark: getCssVariable('--vera-error-hover'), + light: getCssVariable('--vera-error-light'), }, background: { - default: colors.background, - paper: colors.surface, + default: getCssVariable('--vera-background'), + paper: getCssVariable('--vera-surface'), }, text: { - primary: colors.textSecondary, // This is the default text color - main: colors.textPrimary, // This is primary color for specific uses - secondary: colors.textSecondary, - tertiary: colors.textTertiary, - }, - divider: colors.border, + primary: getCssVariable('--vera-text-secondary'), + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + main: getCssVariable('--vera-text-primary'), + secondary: getCssVariable('--vera-text-secondary'), + tertiary: getCssVariable('--vera-text-tertiary'), + }, + divider: getCssVariable('--vera-border'), hover: { - main: colors.primaryHover, + main: getCssVariable('--vera-primary-hover'), }, disabled: { - main: colors.disabled, + main: getCssVariable('--vera-disabled'), }, }, components: { + MuiTextField: { + styleOverrides: { + root: { + borderColor: getCssVariable('--vera-border'), + }, + }, + }, MuiButton: { styleOverrides: { root: { ...buttonSx, - fontSize: tokens.typography.typeScale.desktop['body-base'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['body-base'].lineHeight.value, - fontWeight: tokens.typography.weight['caption-semibold'].value, + fontSize: getCssVariable('--vera-typography-body-base-font-size'), + lineHeight: getCssVariable('--vera-typography-body-base-line-height'), + fontWeight: getCssVariable('--vera-typography-caption-semibold-font-weight'), }, outlined: { - borderColor: colors.primary, + borderColor: getCssVariable('--vera-primary'), }, }, }, @@ -122,87 +136,101 @@ const getMuiCustomTheme = ({ tokens, container }: GetMuiCustomThemeProps) => { MuiAppBar: { styleOverrides: { root: { - backgroundColor: colors.surface, - color: colors.onSurface, + backgroundColor: getCssVariable('--vera-surface'), + color: getCssVariable('--vera-on-surface'), }, }, }, MuiPaper: { styleOverrides: { root: { - backgroundColor: colors.background, - color: colors.onBackground, + backgroundColor: getCssVariable('--vera-background'), + color: getCssVariable('--vera-on-background'), }, }, }, MuiDialog: { + defaultProps: { + slotProps: { + paper: { + className: 'dark:border dark:border-vera-border', + }, + }, + }, styleOverrides: { paper: { - backgroundColor: colors.surface, - color: colors.onSurface, + backgroundColor: getCssVariable('--vera-surface'), + color: getCssVariable('--vera-on-surface'), }, }, }, MuiOutlinedInput: { styleOverrides: { root: { - backgroundColor: colors.surface, - borderRadius: tokens.shapes.borderRadiusMedium, + backgroundColor: getCssVariable('--vera-surface'), + borderRadius: getCssVariable('--vera-border-radius-medium'), backgroundClip: 'padding-box', }, + notchedOutline: { + borderColor: getCssVariable('--vera-border'), + }, + input: { + // backward compatibility after migrating to mui9 + '&:-webkit-autofill': { + WebkitBoxShadow: 'unset', + WebkitTextFillColor: 'unset', + caretColor: 'unset', + }, + }, }, }, MuiInputLabel: { styleOverrides: { sizeSmall: { - fontSize: tokens.typography.typeScale.desktop['body-base'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['body-base'].lineHeight.value, + fontSize: getCssVariable('--vera-typography-body-base-font-size'), + lineHeight: getCssVariable('--vera-typography-body-base-line-height'), }, }, }, MuiFormHelperText: { styleOverrides: { root: { - color: colors.onSurface, + color: getCssVariable('--vera-on-surface'), }, }, }, MuiMenuItem: { styleOverrides: { root: { - color: colors.textSecondary, - fontSize: tokens.typography.typeScale.desktop['body-base'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['body-base'].lineHeight.value, + color: getCssVariable('--vera-text-secondary'), + fontSize: getCssVariable('--vera-typography-body-base-font-size'), + lineHeight: getCssVariable('--vera-typography-body-base-line-height'), }, }, }, MuiList: { styleOverrides: { root: { - backgroundColor: colors.onSecondary, - color: colors.textSecondary, - fontSize: tokens.typography.typeScale.desktop['body-base'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['body-base'].lineHeight.value, + backgroundColor: getCssVariable('--vera-on-secondary'), + color: getCssVariable('--vera-text-secondary'), + fontSize: getCssVariable('--vera-typography-body-base-font-size'), + lineHeight: getCssVariable('--vera-typography-body-base-line-height'), }, }, }, MuiTypography: { styleOverrides: { - h1: createResponsiveTypography(tokens, 'headline', 'headline'), - h2: createResponsiveTypography(tokens, 'subtitle', 'subtitle'), - h3: createResponsiveTypography(tokens, 'heading-1', 'heading-1'), - h4: createResponsiveTypography(tokens, 'heading-2', 'heading-2'), - h5: createResponsiveTypography(tokens, 'heading-3', 'heading-3'), - h6: createResponsiveTypography(tokens, 'heading-4', 'heading-4'), - subtitle1: createResponsiveTypography( - tokens, - 'body-extended-semibold', - 'body-extended-semibold' - ), - subtitle2: createResponsiveTypography(tokens, 'body-base-semibold', 'body-base-semibold'), - body1: createResponsiveTypography(tokens, 'body-extended', 'body-extended'), - body2: createResponsiveTypography(tokens, 'body-base', 'body-base'), - caption: createResponsiveTypography(tokens, 'caption', 'caption'), + h1: createResponsiveTypography('headline'), + h2: createResponsiveTypography('subtitle'), + h3: createResponsiveTypography('heading-1'), + h4: createResponsiveTypography('heading-2'), + h5: createResponsiveTypography('heading-3'), + h6: createResponsiveTypography('heading-4'), + subtitle1: createResponsiveTypography('body-extended-semibold'), + subtitle2: createResponsiveTypography('body-base-semibold'), + body1: createResponsiveTypography('body-extended'), + body2: createResponsiveTypography('body-base'), + caption: createResponsiveTypography('caption'), }, }, // Redirect MUI portals into the shadow root when running as an embed. @@ -221,82 +249,73 @@ const getMuiCustomTheme = ({ tokens, container }: GetMuiCustomThemeProps) => { }), }, typography: { - fontFamily: tokens.typography.typeface.plain.value, - h1: { - fontSize: tokens.typography.typeScale.desktop.headline.fontSize.value, - lineHeight: tokens.typography.typeScale.desktop.headline.lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop.headline.fontWeight.value, - }, - h2: { - fontSize: tokens.typography.typeScale.desktop.subtitle.fontSize.value, - lineHeight: tokens.typography.typeScale.desktop.subtitle.lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop.subtitle.fontWeight.value, - }, - h3: { - fontSize: tokens.typography.typeScale.desktop['heading-1'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['heading-1'].lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop['heading-1'].fontWeight.value, - }, - h4: { - fontSize: tokens.typography.typeScale.desktop['heading-2'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['heading-2'].lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop['heading-2'].fontWeight.value, - }, - h5: { - fontSize: tokens.typography.typeScale.desktop['heading-3'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['heading-3'].lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop['heading-3'].fontWeight.value, - }, - h6: { - fontSize: tokens.typography.typeScale.desktop['heading-4'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['heading-4'].lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop['heading-4'].fontWeight.value, - }, - subtitle1: { - fontSize: tokens.typography.typeScale.desktop['body-extended-semibold'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['body-extended-semibold'].lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop['body-extended-semibold'].fontWeight.value, - }, - subtitle2: { - fontSize: tokens.typography.typeScale.desktop['body-base-semibold'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['body-base-semibold'].lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop['body-base-semibold'].fontWeight.value, - }, - body1: { - fontSize: tokens.typography.typeScale.desktop['body-extended'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['body-extended'].lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop['body-extended'].fontWeight.value, - }, - body2: { - fontSize: tokens.typography.typeScale.desktop['body-base'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['body-base'].lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop['body-base'].fontWeight.value, - }, - caption: { - fontSize: tokens.typography.typeScale.desktop.caption.fontSize.value, - lineHeight: tokens.typography.typeScale.desktop.caption.lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop.caption.fontWeight.value, - }, + fontFamily: getCssVariable('--vera-font-family-plain'), + h1: getTemporaryTypography('headline'), + h2: getTemporaryTypography('subtitle'), + h3: getTemporaryTypography('heading-1'), + h4: getTemporaryTypography('heading-2'), + h5: getTemporaryTypography('heading-3'), + h6: getTemporaryTypography('heading-4'), + subtitle1: getTemporaryTypography('body-extended-semibold'), + subtitle2: getTemporaryTypography('body-base-semibold'), + body1: getTemporaryTypography('body-extended'), + body2: getTemporaryTypography('body-base'), + caption: getTemporaryTypography('caption'), }, }); }; -// Helper function to generate responsive typography +function getTemporaryTypographyVariables() { + type TypographyTokenKeyForTheme = Exclude; + + function createTypographyVariablesByToken(tokenKey: TypographyTokenKeyForTheme) { + return { + desktop: { + fontSize: veraTypographyCssVariableNames[tokenKey].fontSize, + lineHeight: veraTypographyCssVariableNames[tokenKey].lineHeight, + fontWeight: veraTypographyCssVariableNames[tokenKey].fontWeight, + }, + mobile: { + fontSize: `--vera-typography-${tokenKey}-mobile-font-size` as VeraCssVariable, + lineHeight: `--vera-typography-${tokenKey}-mobile-line-height` as VeraCssVariable, + fontWeight: `--vera-typography-${tokenKey}-mobile-font-weight` as VeraCssVariable, + }, + }; + } + + return { + headline: createTypographyVariablesByToken('headline'), + subtitle: createTypographyVariablesByToken('subtitle'), + 'heading-1': createTypographyVariablesByToken('heading-1'), + 'heading-2': createTypographyVariablesByToken('heading-2'), + 'heading-3': createTypographyVariablesByToken('heading-3'), + 'heading-4': createTypographyVariablesByToken('heading-4'), + 'body-extended': createTypographyVariablesByToken('body-extended'), + 'body-extended-semibold': createTypographyVariablesByToken('body-extended-semibold'), + 'body-base': createTypographyVariablesByToken('body-base'), + 'body-base-semibold': createTypographyVariablesByToken('body-base-semibold'), + caption: createTypographyVariablesByToken('caption'), + } as const; +} + function createResponsiveTypography( - tokens: Theme, - desktopVariant: keyof typeof tokens.typography.typeScale.desktop, - mobileVariant: keyof typeof tokens.typography.typeScale.mobile + variant: keyof ReturnType ) { + const variableKey = temporaryTypographyVariables[variant]; + const mobileVariableNames = variableKey.mobile; + const isHeadline = variant === 'headline'; + const tabletScale = isHeadline ? 1.5 : 1.15; + return { '@media (max-width:1199px)': { - fontSize: `calc(${tokens.typography.typeScale.mobile[mobileVariant].fontSize.value} * ${desktopVariant === 'headline' ? 1.5 : 1.15})`, - lineHeight: `calc(${tokens.typography.typeScale.mobile[mobileVariant].lineHeight.value} * ${desktopVariant === 'headline' ? 1.5 : 1.15})`, - fontWeight: tokens.typography.typeScale.mobile[mobileVariant].fontWeight.value, + fontSize: `calc(var(${mobileVariableNames.fontSize}) * ${tabletScale})`, + lineHeight: `calc(var(${mobileVariableNames.lineHeight}) * ${tabletScale})`, + fontWeight: `var(${mobileVariableNames.fontWeight})`, }, '@media (max-width:899px)': { - fontSize: tokens.typography.typeScale.mobile[mobileVariant].fontSize.value, - lineHeight: tokens.typography.typeScale.mobile[mobileVariant].lineHeight.value, - fontWeight: tokens.typography.typeScale.mobile[mobileVariant].fontWeight.value, + fontSize: `var(${mobileVariableNames.fontSize})`, + lineHeight: `var(${mobileVariableNames.lineHeight})`, + fontWeight: `var(${mobileVariableNames.fontWeight})`, }, }; } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getTokensByMode.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getTokensByMode.ts deleted file mode 100644 index e5f2d729..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getTokensByMode.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { Theme, ThemeColors } from '@ui/theme'; -import designTokens from './designTokens'; - -const getTokensByMode = (mode: 'light' | 'dark'): Theme => { - const colors = mode === 'light' ? designTokens.color.light : designTokens.color.dark; - - return { - /** - * { primary: string; onPrimary: string; secondary: string; onSecondary: string; ... } - */ - colors: Object.keys(colors).reduce((acc, originalKey): ThemeColors => { - let key = originalKey; - - if (key.includes('-')) { - key = key.replaceAll(/-([a-z])/g, (_, char: string) => char.toUpperCase()); - } - - acc[key as keyof ThemeColors] = colors[originalKey as keyof typeof colors].value; - - return acc; - }, {} as ThemeColors), - - shapes: { - borderRadiusNone: designTokens.shape.none.value, - borderRadiusExtraSmall: designTokens.shape['extra-small'].value, - borderRadiusSmall: designTokens.shape.small.value, - borderRadiusMedium: designTokens.shape.medium.value, - borderRadiusLarge: designTokens.shape.large.value, - borderRadiusExtraLarge: designTokens.shape['extra-large'].value, - }, - - typography: designTokens.typography, - }; -}; - -export default getTokensByMode; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/mergeThemeConfigurations.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/mergeThemeConfigurations.ts deleted file mode 100644 index 7ac26475..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/mergeThemeConfigurations.ts +++ /dev/null @@ -1,40 +0,0 @@ -import Theme, { PartialTheme } from '../themeContext.types'; - -export function mergeThemeConfigurations({ - defaultValue, - overrides = {}, -}: { - defaultValue: Theme; - overrides: PartialTheme; -}): Theme { - const typeface = { - ...defaultValue.typography.typeface, - ...overrides.typography?.typeface, - } as Theme['typography']['typeface']; - - const typeScale = { - ...defaultValue.typography.typeScale, - ...overrides.typography?.typeScale, - } as Theme['typography']['typeScale']; - - const weight = { - ...defaultValue.typography.weight, - ...overrides.typography?.weight, - } as Theme['typography']['weight']; - - return { - colors: { - ...defaultValue.colors, - ...overrides.colors, - }, - shapes: { - ...defaultValue.shapes, - ...overrides.shapes, - }, - typography: { - typeface, - typeScale, - weight, - }, - }; -} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/tailwind/generateTailwindPlugin.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/tailwind/generateTailwindPlugin.ts index 6dfddeec..071d54c6 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/tailwind/generateTailwindPlugin.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/tailwind/generateTailwindPlugin.ts @@ -1,10 +1,415 @@ import * as fs from 'node:fs'; import * as path from 'node:path'; +// eslint-disable-next-line @nx/enforce-module-boundaries +import kebabToCamel from '../../../../../common/src/helpers/kebabToCamel'; import designTokens from '../designTokens/designTokens.json'; +import tsDesignTokens from '../designTokens/designTokens.js'; +import type { + VeraTypographyTokenKey, + VeraTypographyVariableNamesByToken, + VeraUIConfig, +} from '../veraUI.types'; +import { veraTypographyCssVariableNames } from '../veraUI.types'; const VERA_DARK_MODE_CLASS = 'vera-dark-mode'; const pluginFile = path.resolve('libs/ui/src/theme/helpers/tailwind/veraUI.cjs'); +const veraTypographyVariableNames: Record< + VeraTypographyTokenKey, + VeraTypographyVariableNamesByToken +> = veraTypographyCssVariableNames; + +const VERA_UI_CONFIG_JSDOC = `/** + * @typedef {Object} VeraTypographyProperties + * @property {string} [fontSize] + * @property {string} [lineHeight] + * @property {string} [fontWeight] + * @property {string} [mobileFontSize] + * @property {string} [mobileLineHeight] + * @property {string} [mobileFontWeight] + */ +/** + * @typedef {Object} VeraColorThemeConfig + * @property {string} [accent] + * @property {string} [alertBackground] + * @property {string} [alertBackgroundHover] + * @property {string} [alertText] + * @property {string} [background] + * @property {string} [border] + * @property {string} [darkBackground] + * @property {string} [darkGrey] + * @property {string} [darkGreyHover] + * @property {string} [darkGreyOpacity] + * @property {string} [disabled] + * @property {string} [error] + * @property {string} [errorHover] + * @property {string} [information] + * @property {string} [informationBackground] + * @property {string} [informationHover] + * @property {string} [onAccent] + * @property {string} [onBackground] + * @property {string} [onDarkGrey] + * @property {string} [onError] + * @property {string} [onInformation] + * @property {string} [onPrimary] + * @property {string} [onSecondary] + * @property {string} [onSuccess] + * @property {string} [onSurface] + * @property {string} [onTertiary] + * @property {string} [onWarning] + * @property {string} [primary] + * @property {string} [primaryHover] + * @property {string} [secondary] + * @property {string} [secondaryHover] + * @property {string} [skeletonLike] + * @property {string} [success] + * @property {string} [successHover] + * @property {string} [surface] + * @property {string} [tertiary] + * @property {string} [tertiaryHover] + * @property {string} [textDisabled] + * @property {string} [textPrimary] + * @property {string} [textSecondary] + * @property {string} [textTertiary] + * @property {string} [warning] + * @property {string} [warningHover] + */ +/** + * @typedef {Object} VeraUIConfig + * @property {VeraColorThemeConfig} [light] + * @property {VeraColorThemeConfig} [dark] + * @property {string} [borderRadiusExtraLarge] + * @property {string} [borderRadiusExtraSmall] + * @property {string} [borderRadiusLarge] + * @property {string} [borderRadiusMedium] + * @property {string} [borderRadiusNone] + * @property {string} [borderRadiusSmall] + * @property {string} [fontFamilyPlain] + * @property {VeraTypographyProperties} [headline] + * @property {VeraTypographyProperties} [subtitle] + * @property {VeraTypographyProperties} [heading1] + * @property {VeraTypographyProperties} [heading2] + * @property {VeraTypographyProperties} [heading3] + * @property {VeraTypographyProperties} [heading4] + * @property {VeraTypographyProperties} [bodyExtended] + * @property {VeraTypographyProperties} [bodyExtendedSemibold] + * @property {VeraTypographyProperties} [bodyBase] + * @property {VeraTypographyProperties} [bodyBaseSemibold] + * @property {VeraTypographyProperties} [caption] + * @property {VeraTypographyProperties} [captionSemibold] + */ + +/** + * @param {VeraUIConfig} [config={}] + */`; + +const typographyTokenByConfigKey = { + headline: 'headline', + subtitle: 'subtitle', + heading1: 'heading-1', + heading2: 'heading-2', + heading3: 'heading-3', + heading4: 'heading-4', + bodyExtended: 'body-extended', + bodyExtendedSemibold: 'body-extended-semibold', + bodyBase: 'body-base', + bodyBaseSemibold: 'body-base-semibold', + caption: 'caption', + captionSemibold: 'caption-semibold', +} as const; + +function camelToKebab(value: string): string { + return value.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase(); +} + +function buildDefaultVeraUIConfig(): VeraUIConfig { + const { color, border, typography } = tsDesignTokens; + + const light = Object.fromEntries( + Object.entries(color.light).map(([key, token]) => [kebabToCamel(key), token.value]) + ) as VeraUIConfig['light']; + + const dark = Object.fromEntries( + Object.entries(color.dark).map(([key, token]) => [kebabToCamel(key), token.value]) + ) as VeraUIConfig['dark']; + + const typo = (tokenKey: keyof typeof typographyTokenByConfigKey): VeraUIConfig['headline'] => { + const tsKey = typographyTokenByConfigKey[tokenKey]; + const desktop = typography.typeScale.desktop[tsKey]; + const mobile = typography.typeScale.mobile[tsKey]; + return { + fontSize: desktop.fontSize.value, + lineHeight: desktop.lineHeight.value, + fontWeight: String(desktop.fontWeight.value), + mobileFontSize: mobile.fontSize.value, + mobileLineHeight: mobile.lineHeight.value, + mobileFontWeight: String(mobile.fontWeight.value), + }; + }; + + return { + light, + dark, + borderRadiusNone: border.none.value, + borderRadiusExtraSmall: border['extra-small'].value, + borderRadiusSmall: border.small.value, + borderRadiusMedium: border.medium.value, + borderRadiusLarge: border.large.value, + borderRadiusExtraLarge: border['extra-large'].value, + fontFamilyPlain: typography.typeface.plain.value, + headline: typo('headline'), + subtitle: typo('subtitle'), + heading1: typo('heading1'), + heading2: typo('heading2'), + heading3: typo('heading3'), + heading4: typo('heading4'), + bodyExtended: typo('bodyExtended'), + bodyExtendedSemibold: typo('bodyExtendedSemibold'), + bodyBase: typo('bodyBase'), + bodyBaseSemibold: typo('bodyBaseSemibold'), + caption: typo('caption'), + captionSemibold: typo('captionSemibold'), + }; +} + +function mergeVeraUIConfig(defaults: VeraUIConfig, partial: VeraUIConfig): VeraUIConfig { + return { + ...defaults, + ...partial, + light: { ...defaults.light, ...partial.light }, + dark: { ...defaults.dark, ...partial.dark }, + headline: { ...defaults.headline, ...partial.headline }, + subtitle: { ...defaults.subtitle, ...partial.subtitle }, + heading1: { ...defaults.heading1, ...partial.heading1 }, + heading2: { ...defaults.heading2, ...partial.heading2 }, + heading3: { ...defaults.heading3, ...partial.heading3 }, + heading4: { ...defaults.heading4, ...partial.heading4 }, + bodyExtended: { ...defaults.bodyExtended, ...partial.bodyExtended }, + bodyExtendedSemibold: { ...defaults.bodyExtendedSemibold, ...partial.bodyExtendedSemibold }, + bodyBase: { ...defaults.bodyBase, ...partial.bodyBase }, + bodyBaseSemibold: { ...defaults.bodyBaseSemibold, ...partial.bodyBaseSemibold }, + caption: { ...defaults.caption, ...partial.caption }, + captionSemibold: { ...defaults.captionSemibold, ...partial.captionSemibold }, + }; +} + +function normalizeDesignTokensFromConfig(config: VeraUIConfig): { + colors: { + light: Record; + dark: Record; + }; + borderRadius: Record; + fontFamily: Record; + fontSize: { + desktop: Record; + mobile: Record; + }; +} { + const lightColors = Object.fromEntries( + Object.entries(config.light ?? {}).map(([key, tokenValue]) => [camelToKebab(key), tokenValue]) + ); + + const darkColors = Object.fromEntries( + Object.entries(config.dark ?? {}).map(([key, tokenValue]) => [camelToKebab(key), tokenValue]) + ); + + const borderRadius = Object.fromEntries( + Object.entries(config) + .filter(([key]) => key.startsWith('borderRadius')) + .map(([key, tokenValue]) => [camelToKebab(key.replace('borderRadius', '')), tokenValue]) + ) as Record; + + const fontFamily = Object.fromEntries( + Object.entries(config) + .filter(([key]) => key.startsWith('fontFamily')) + .map(([key, tokenValue]) => [camelToKebab(key.replace('fontFamily', '')), tokenValue]) + ) as Record; + + const desktopFontSize: Record< + string, + { + fontSize: string; + lineHeight: string; + fontWeight: string; + } + > = {}; + + const mobileFontSize: Record< + string, + { + fontSize: string; + lineHeight: string; + fontWeight: string; + } + > = {}; + + for (const [configKey, tokenKey] of Object.entries(typographyTokenByConfigKey)) { + const typographyValues = config[configKey as keyof VeraUIConfig] as + | { + fontSize?: string; + lineHeight?: string; + fontWeight?: string; + mobileFontSize?: string; + mobileLineHeight?: string; + mobileFontWeight?: string; + } + | undefined; + + desktopFontSize[tokenKey] = { + fontSize: typographyValues?.fontSize ?? '', + lineHeight: typographyValues?.lineHeight ?? '', + fontWeight: typographyValues?.fontWeight ?? '', + }; + + mobileFontSize[tokenKey] = { + fontSize: typographyValues?.mobileFontSize ?? typographyValues?.fontSize ?? '', + lineHeight: typographyValues?.mobileLineHeight ?? typographyValues?.lineHeight ?? '', + fontWeight: typographyValues?.mobileFontWeight ?? typographyValues?.fontWeight ?? '', + }; + } + + return { + colors: { + light: lightColors, + dark: darkColors, + }, + borderRadius, + fontFamily, + fontSize: { + desktop: desktopFontSize, + mobile: mobileFontSize, + }, + }; +} + +/** + * Extracts the config path from a CSS variable name. + * Examples: + * - '--vera-accent' -> 'accent' + * - '--vera-alert-background' -> 'alertBackground' + * - '--vera-typography-headline-font-size' -> 'headline?.fontSize' + * - '--vera-typography-heading-1-font-size' -> 'heading1?.fontSize' + * - '--vera-typography-body-extended-font-size' -> 'bodyExtended?.fontSize' + */ +function getCssVariableConfigPath(variableName: string): string { + // Remove '--vera-' prefix + const withoutPrefix = variableName.replace('--vera-', ''); + + // Handle typography special case: strip the known property suffix from the end + // Properties are always: font-size, line-height, or font-weight + if (withoutPrefix.startsWith('typography-')) { + const typographySuffix = withoutPrefix.replace('typography-', ''); + const propertySuffixes = [ + '-mobile-font-size', + '-mobile-line-height', + '-mobile-font-weight', + '-font-size', + '-line-height', + '-font-weight', + ]; + + for (const suffix of propertySuffixes) { + if (typographySuffix.endsWith(suffix)) { + const tokenKey = typographySuffix.slice(0, -suffix.length); + const propertyKey = kebabToCamel(suffix.slice(1)); + return `${kebabToCamel(tokenKey)}?.${propertyKey}`; + } + } + } + + return kebabToCamel(withoutPrefix); +} + +/** + * Generates a config lookup expression with fallback value. + * Example: 'light.accent ?? "#FFFFFF"' + */ +function generateConfigLookup( + theme: 'light' | 'dark', + configPath: string, + fallbackValue: string +): string { + return `config.${configPath} ?? ${theme}.${configPath} ?? '${fallbackValue}'`; +} + +/** + * Generates a config lookup expression for non-theme-aware variables. + * All layout, font, and typography tokens are configurable at the root level. + */ +function generateGlobalConfigLookup(variableName: string, fallbackValue: string): string { + if (variableName.startsWith('--vera-typography-')) { + const configPath = getCssVariableConfigPath(variableName); + return `config.${configPath} ?? '${fallbackValue}'`; + } + + if (variableName.startsWith('--vera-border-radius-')) { + const key = variableName.replace('--vera-', ''); + const configKey = kebabToCamel(key); + return `config.${configKey} ?? '${fallbackValue}'`; + } + + if (variableName.startsWith('--vera-font-family-')) { + const key = variableName.replace('--vera-', ''); + const configKey = kebabToCamel(key); + return `config.${configKey} ?? '${fallbackValue}'`; + } + + return `'${fallbackValue}'`; +} + +/** + * Generates addBase color and typography variables with config lookups. + */ +function generateAddBaseVariablesWithConfig( + lightColors: Record, + darkColors: Record, + typographyAndLayoutVariables: Record, + indentation: string +): { rootVars: string; darkVars: string } { + const rootLines: string[] = []; + const darkLines: string[] = []; + + const colorKeys = Object.keys(lightColors).sort((a, b) => a.localeCompare(b)); + + // Generate variables in original order: for each key, add theme-aware then static variants + for (const key of colorKeys) { + const lightValue = lightColors[key]; + const darkValue = darkColors[key]; + const cssVarName = `--vera-${key}`; + const configPath = getCssVariableConfigPath(cssVarName); + const lightConfigLookup = generateConfigLookup('light', configPath, lightValue); + const darkConfigLookup = generateConfigLookup('dark', configPath, darkValue); + + // Theme-aware color (changes with theme) + rootLines.push(`${indentation}'${cssVarName}': ${lightConfigLookup},`); + darkLines.push(`${indentation}'${cssVarName}': ${darkConfigLookup},`); + + // Light variant (always uses light theme from config) + rootLines.push(`${indentation}'--vera-${key}-light': ${lightConfigLookup},`); + + // Dark variant (always uses dark theme from config) + rootLines.push(`${indentation}'--vera-${key}-dark': ${darkConfigLookup},`); + } + + // Add typography and layout variables (remain static) + const typographyKeys = Object.keys(typographyAndLayoutVariables); + + // Add blank line and comment before typography section + rootLines.push(''); + rootLines.push(`${indentation}// Typography and layout design tokens`); + + for (const key of typographyKeys) { + const value = typographyAndLayoutVariables[key]; + const configLookup = generateGlobalConfigLookup(key, value); + rootLines.push(`${indentation}'${key}': ${configLookup},`); + } + + return { + rootVars: rootLines.join('\n'), + darkVars: darkLines.join('\n'), + }; +} + /** * Generates a comprehensive Tailwind plugin with all Vera design tokens. * This script reads from designTokens.json and generates veraUI.cjs @@ -14,78 +419,114 @@ const pluginFile = path.resolve('libs/ui/src/theme/helpers/tailwind/veraUI.cjs') * - Overridable by the user */ function generateVeraUIPlugin() { - const { colorVariables, colorTokens } = generateColorTokens( - designTokens.colors.light, - designTokens.colors.dark + const mergedConfig = mergeVeraUIConfig(buildDefaultVeraUIConfig(), designTokens as VeraUIConfig); + const normalizedDesignTokens = normalizeDesignTokensFromConfig(mergedConfig); + const { desktop: fontSizeDesktop, mobile: fontSizeMobile } = normalizedDesignTokens.fontSize; + + const { colorTokens } = generateColorTokens( + normalizedDesignTokens.colors.light, + normalizedDesignTokens.colors.dark ); - const borderRadius = generateBorderRadiusTokens(designTokens.borderRadius); - const fontFamily = generateFontFamilyTokens(designTokens.fontFamily); + const typographyAndLayoutVariables = generateTypographyAndLayoutVariables({ + borderRadius: normalizedDesignTokens.borderRadius, + fontFamily: normalizedDesignTokens.fontFamily, + fontSizeDesktop, + fontSizeMobile, + }); + + const borderRadius = generateBorderRadiusTokens(normalizedDesignTokens.borderRadius); + const fontFamily = generateFontFamilyTokens(normalizedDesignTokens.fontFamily); const screens = { 'vera-mobile': { max: '767px' }, 'vera-desktop': { min: '768px' }, }; + // Generate addBase variables with config lookups + const { rootVars, darkVars } = generateAddBaseVariablesWithConfig( + normalizedDesignTokens.colors.light, + normalizedDesignTokens.colors.dark, + typographyAndLayoutVariables, + ' ' + ); + let plugin = `/** * Auto-generated Tailwind plugin for Vera design system * DO NOT EDIT MANUALLY - Generated by generateTailwindPlugin.ts */ +// eslint-disable-next-line @typescript-eslint/no-require-imports const plugin = require('tailwindcss/plugin'); -const veraUI = plugin(({ addUtilities, addBase, addVariant }) => { - const fontSizeUtilities = {}; - const fontWeightUtilities = {}; +${VERA_UI_CONFIG_JSDOC} - // Add custom variants - addVariant('child', '& > *'); +const veraUI = (config = {}) => { +return plugin( + ({ addUtilities, addBase, addVariant }) => { + const { light = {}, dark = {} } = config; // also includes typography and layout + const fontSizeUtilities = {}; + const fontWeightUtilities = {}; - // Add CSS variables for theme-aware colors - addBase({ - ':root': ${JSON.stringify(colorVariables.root, null, 6).replace(/\n/g, '\n ')}, - 'html.vera-dark-mode': ${JSON.stringify(colorVariables.dark, null, 6).replace(/\n/g, '\n ')}, - }); + // Add custom variants + addVariant('child', '& > *'); + // Add CSS variables for theme-aware colors + addBase({ + ':host, :root': { +${rootVars} + }, + ':host(.vera-dark-mode), :host(.dark), html.vera-dark-mode': { +${darkVars} + }, + }); `; - const { desktop: fontSizeDesktop, mobile: fontSizeMobile } = designTokens.fontSize; - // Generate font size utilities for (const key of Object.keys(fontSizeDesktop)) { - const desktop = fontSizeDesktop[key as keyof typeof fontSizeDesktop]; - const mobile = fontSizeMobile[key as keyof typeof fontSizeMobile]; - - plugin += ` // ${key}\n`; - plugin += ` fontSizeUtilities['.text-vera-${key}'] = {\n`; - plugin += ` fontSize: '${mobile.fontSize}',\n`; - plugin += ` lineHeight: '${mobile.lineHeight}',\n`; - plugin += ` fontWeight: ${mobile.fontWeight},\n`; - plugin += ` '@media (min-width: 768px)': {\n`; - plugin += ` fontSize: '${desktop.fontSize}',\n`; - plugin += ` lineHeight: '${desktop.lineHeight}',\n`; - plugin += ` fontWeight: ${desktop.fontWeight},\n`; - plugin += ` },\n`; - plugin += ` };\n\n`; + const mobile = fontSizeMobile[key] ?? { + fontSize: '1rem', + lineHeight: '1.5rem', + fontWeight: '400', + }; + + const desktop = fontSizeDesktop[key] ?? mobile; + + const desktopVariableNames = veraTypographyVariableNames[key as VeraTypographyTokenKey]; + + plugin += ` // ${key}\n`; + plugin += ` fontSizeUtilities['.text-vera-${key}'] = {\n`; + plugin += ` fontSize: '${mobile.fontSize}',\n`; + plugin += ` lineHeight: '${mobile.lineHeight}',\n`; + plugin += ` fontWeight: ${mobile.fontWeight},\n`; + plugin += ` '@media (min-width: 768px)': {\n`; + plugin += ` fontSize: 'var(${desktopVariableNames.fontSize}, ${desktop.fontSize})',\n`; + plugin += ` lineHeight: 'var(${desktopVariableNames.lineHeight}, ${desktop.lineHeight})',\n`; + plugin += ` fontWeight: 'var(${desktopVariableNames.fontWeight}, ${desktop.fontWeight})',\n`; + plugin += ` },\n`; + plugin += ` };\n\n`; // Generate responsive font weight utilities - plugin += ` fontWeightUtilities['.font-vera-${key}'] = {\n`; - plugin += ` fontWeight: ${mobile.fontWeight},\n`; - plugin += ` '@media (min-width: 768px)': {\n`; - plugin += ` fontWeight: ${desktop.fontWeight},\n`; - plugin += ` },\n`; - plugin += ` };\n\n`; + plugin += ` fontWeightUtilities['.font-vera-${key}'] = {\n`; + plugin += ` fontWeight: ${mobile.fontWeight},\n`; + plugin += ` '@media (min-width: 768px)': {\n`; + plugin += ` fontWeight: 'var(${desktopVariableNames.fontWeight}, ${desktop.fontWeight})',\n`; + plugin += ` },\n`; + plugin += ` };\n\n`; } - plugin += ` addUtilities(fontSizeUtilities); - addUtilities(fontWeightUtilities); -}, { - theme: { - extend: { - borderRadius: ${JSON.stringify(borderRadius, null, 6).replace(/\n/g, '\n ')}, - colors: ${JSON.stringify(colorTokens, null, 6).replace(/\n/g, '\n ')}, - fontFamily: ${JSON.stringify(fontFamily, null, 6).replace(/\n/g, '\n ')}, - screens: ${JSON.stringify(screens, null, 6).replace(/\n/g, '\n ')}, - }, + plugin += ` addUtilities(fontSizeUtilities); + addUtilities(fontWeightUtilities); }, -}); + { + theme: { + extend: { + borderRadius: ${generateBorderRadiusThemeConfig(borderRadius)}, + colors: ${JSON.stringify(colorTokens, null, 6).replace(/\n/g, '\n ')}, + fontFamily: ${generateFontFamilyThemeConfig(fontFamily)}, + screens: ${JSON.stringify(screens, null, 6).replace(/\n/g, '\n ')}, + }, + }, + } +); +}; veraUI.safelist = ['${VERA_DARK_MODE_CLASS}']; @@ -161,37 +602,117 @@ function generateColorTokens( /** * Generates border radius tokens with vera- prefix. + * Values reference CSS variables with fallbacks for runtime customization. * Tokens are sorted alphabetically for consistent output. */ -function generateBorderRadiusTokens(shape: Record): Record { +function generateBorderRadiusTokens(border: Record): Record { const borderRadius: Record = {}; // Sort keys alphabetically for consistent output - const sortedKeys = Object.keys(shape).sort((a, b) => a.localeCompare(b)); + const sortedKeys = Object.keys(border).sort((a, b) => a.localeCompare(b)); for (const key of sortedKeys) { - borderRadius[`vera-${key}`] = shape[key]; + borderRadius[`vera-${key}`] = `var(--vera-border-radius-${key}, ${border[key]})`; } return borderRadius; } +/** + * Generates a JS object literal string for the borderRadius theme config. + */ +function generateBorderRadiusThemeConfig(borderRadius: Record): string { + const entries = Object.entries(borderRadius) + .map(([key, value]) => ` '${key}': '${value}',`) + .join('\n'); + return `{\n${entries}\n }`; +} + /** * Generates font family tokens with vera- prefix. + * Values reference CSS variables for runtime customization. * Tokens are sorted alphabetically for consistent output. */ -function generateFontFamilyTokens(typeface: Record): Record { - const fontFamily: Record = {}; +function generateFontFamilyTokens(typeface: Record): Record { + const fontFamily: Record = {}; // Sort keys alphabetically for consistent output const sortedKeys = Object.keys(typeface).sort((a, b) => a.localeCompare(b)); for (const key of sortedKeys) { - fontFamily[`vera-${key}`] = typeface[key].split(', '); + fontFamily[`vera-${key}`] = `var(--vera-font-family-${key}, ${typeface[key]})`; } return fontFamily; } +/** + * Generates a JS object literal string for the fontFamily theme config. + */ +function generateFontFamilyThemeConfig(fontFamily: Record): string { + const entries = Object.entries(fontFamily) + .map(([key, value]) => ` '${key}': ['${value}'],`) + .join('\n'); + return `{\n${entries}\n }`; +} + +/** + * Generates typography and layout CSS variables for the Vera framework. + * The temporary MUI custom theme can consume these variables, but the variables + * themselves are framework design tokens rather than adapter-only values. + */ +function generateTypographyAndLayoutVariables(args: { + borderRadius: Record; + fontFamily: Record; + fontSizeDesktop: Record; + fontSizeMobile: Record; +}): Record { + const variables: Record = {}; + + // Add ALL border radius CSS variables + const borderRadiusKeys = Object.keys(args.borderRadius).sort((a, b) => a.localeCompare(b)); + for (const key of borderRadiusKeys) { + const cssVarName = `--vera-border-radius-${key}` as const; + variables[cssVarName] = args.borderRadius[key]; + } + + // Add font family CSS variables + const fontFamilyKeys = Object.keys(args.fontFamily).sort((a, b) => a.localeCompare(b)); + for (const key of fontFamilyKeys) { + const cssVarName = `--vera-font-family-${key}` as const; + variables[cssVarName] = args.fontFamily[key]; + } + + const usedTokenKeys: VeraTypographyTokenKey[] = [ + 'headline', + 'subtitle', + 'heading-1', + 'heading-2', + 'heading-3', + 'heading-4', + 'body-extended', + 'body-extended-semibold', + 'body-base', + 'body-base-semibold', + 'caption', + 'caption-semibold', + ]; + + for (const tokenKey of usedTokenKeys) { + const cssVariableNames = veraTypographyVariableNames[tokenKey]; + const desktop = args.fontSizeDesktop[tokenKey]; + const mobile = args.fontSizeMobile[tokenKey]; + + variables[cssVariableNames.fontSize] = desktop.fontSize; + variables[cssVariableNames.lineHeight] = desktop.lineHeight; + variables[cssVariableNames.fontWeight] = desktop.fontWeight; + variables[`--vera-typography-${tokenKey}-mobile-font-size`] = mobile.fontSize; + variables[`--vera-typography-${tokenKey}-mobile-line-height`] = mobile.lineHeight; + variables[`--vera-typography-${tokenKey}-mobile-font-weight`] = mobile.fontWeight; + } + + return variables; +} + // Run the generation generateVeraUIPlugin(); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/tailwind/veraUI.cjs b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/tailwind/veraUI.cjs index 266e98cb..0352140b 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/tailwind/veraUI.cjs +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/tailwind/veraUI.cjs @@ -2,591 +2,819 @@ * Auto-generated Tailwind plugin for Vera design system * DO NOT EDIT MANUALLY - Generated by generateTailwindPlugin.ts */ +// eslint-disable-next-line @typescript-eslint/no-require-imports const plugin = require('tailwindcss/plugin'); -const veraUI = plugin( - ({ addUtilities, addBase, addVariant }) => { - const fontSizeUtilities = {}; - const fontWeightUtilities = {}; - - // Add custom variants - addVariant('child', '& > *'); - - // Add CSS variables for theme-aware colors - addBase({ - ':root': { - '--vera-accent': '#FFFFFF', - '--vera-accent-light': '#FFFFFF', - '--vera-accent-dark': '#FFFFFF', - '--vera-alert-background': '#FFEEF2', - '--vera-alert-background-light': '#FFEEF2', - '--vera-alert-background-dark': '#3E0004', - '--vera-alert-background-hover': '#FEDFDF', - '--vera-alert-background-hover-light': '#FEDFDF', - '--vera-alert-background-hover-dark': '#6E0000', - '--vera-alert-text': '#CD0000', - '--vera-alert-text-light': '#CD0000', - '--vera-alert-text-dark': '#FEDFDF', - '--vera-background': '#F5F0FD', - '--vera-background-light': '#F5F0FD', - '--vera-background-dark': '#26044D', - '--vera-border': '#E6E6E6', - '--vera-border-light': '#E6E6E6', - '--vera-border-dark': '#333333', - '--vera-dark-background': '#202124', - '--vera-dark-background-light': '#202124', - '--vera-dark-background-dark': '#202124', - '--vera-dark-grey': '#333333', - '--vera-dark-grey-light': '#333333', - '--vera-dark-grey-dark': '#333333', - '--vera-dark-grey-hover': '#292828', - '--vera-dark-grey-hover-light': '#292828', - '--vera-dark-grey-hover-dark': '#292828', - '--vera-dark-grey-opacity': '#333333CD', - '--vera-dark-grey-opacity-light': '#333333CD', - '--vera-dark-grey-opacity-dark': '#333333CD', - '--vera-disabled': '#E6E6E6', - '--vera-disabled-light': '#E6E6E6', - '--vera-disabled-dark': '#333333', - '--vera-error': '#E61D1D', - '--vera-error-light': '#E61D1D', - '--vera-error-dark': '#F75959', - '--vera-error-hover': '#CD0000', - '--vera-error-hover-light': '#CD0000', - '--vera-error-hover-dark': '#FE9696', - '--vera-information': '#0276D5', - '--vera-information-light': '#0276D5', - '--vera-information-dark': '#2997F0', - '--vera-information-background': '#E8F4FB', - '--vera-information-background-light': '#E8F4FB', - '--vera-information-background-dark': '#E8F4FB', - '--vera-information-hover': '#2997F0', - '--vera-information-hover-light': '#2997F0', - '--vera-information-hover-dark': '#0276D5', - '--vera-on-accent': '#000000', - '--vera-on-accent-light': '#000000', - '--vera-on-accent-dark': '#000000', - '--vera-on-background': '#757575', - '--vera-on-background-light': '#757575', - '--vera-on-background-dark': '#B3B3B3', - '--vera-on-dark-grey': '#FFFFFF', - '--vera-on-dark-grey-light': '#FFFFFF', - '--vera-on-dark-grey-dark': '#FFFFFF', - '--vera-on-error': '#FFFFFF', - '--vera-on-error-light': '#FFFFFF', - '--vera-on-error-dark': '#000000', - '--vera-on-information': '#FFFFFF', - '--vera-on-information-light': '#FFFFFF', - '--vera-on-information-dark': '#FFFFFF', - '--vera-on-primary': '#FFFFFF', - '--vera-on-primary-light': '#FFFFFF', - '--vera-on-primary-dark': '#000000', - '--vera-on-secondary': '#FFFFFF', - '--vera-on-secondary-light': '#FFFFFF', - '--vera-on-secondary-dark': '#000000', - '--vera-on-success': '#FFFFFF', - '--vera-on-success-light': '#FFFFFF', - '--vera-on-success-dark': '#000000', - '--vera-on-surface': '#929292', - '--vera-on-surface-light': '#929292', - '--vera-on-surface-dark': '#FFFFFF', - '--vera-on-tertiary': '#FFFFFF', - '--vera-on-tertiary-light': '#FFFFFF', - '--vera-on-tertiary-dark': '#000000', - '--vera-on-warning': '#FFFFFF', - '--vera-on-warning-light': '#FFFFFF', - '--vera-on-warning-dark': '#000000', - '--vera-primary': '#9941FF', - '--vera-primary-light': '#9941FF', - '--vera-primary-dark': '#B27BF2', - '--vera-primary-hover': '#871EFF', - '--vera-primary-hover-light': '#871EFF', - '--vera-primary-hover-dark': '#CBA1FA', - '--vera-secondary': '#000000', - '--vera-secondary-light': '#000000', - '--vera-secondary-dark': '#FFFFFF', - '--vera-secondary-hover': '#666666', - '--vera-secondary-hover-light': '#666666', - '--vera-secondary-hover-dark': '#929292', - '--vera-skeleton-like': '#B3B3B3', - '--vera-skeleton-like-light': '#B3B3B3', - '--vera-skeleton-like-dark': '#333333', - '--vera-success': '#1C8731', - '--vera-success-light': '#1C8731', - '--vera-success-dark': '#30A849', - '--vera-success-hover': '#1F7629', - '--vera-success-hover-light': '#1F7629', - '--vera-success-hover-dark': '#53CA6A', - '--vera-surface': '#FFFFFF', - '--vera-surface-light': '#FFFFFF', - '--vera-surface-dark': '#000000', - '--vera-tertiary': '#757575', - '--vera-tertiary-light': '#757575', - '--vera-tertiary-dark': '#B3B3B3', - '--vera-tertiary-hover': '#929292', - '--vera-tertiary-hover-light': '#929292', - '--vera-tertiary-hover-dark': '#B3B3B3', - '--vera-text-disabled': '#B3B3B3', - '--vera-text-disabled-light': '#B3B3B3', - '--vera-text-disabled-dark': '#666666', - '--vera-text-primary': '#9941FF', - '--vera-text-primary-light': '#9941FF', - '--vera-text-primary-dark': '#B27BF2', - '--vera-text-secondary': '#000000', - '--vera-text-secondary-light': '#000000', - '--vera-text-secondary-dark': '#FFFFFF', - '--vera-text-tertiary': '#757575', - '--vera-text-tertiary-light': '#757575', - '--vera-text-tertiary-dark': '#B3B3B3', - '--vera-warning': '#BE5702', - '--vera-warning-light': '#BE5702', - '--vera-warning-dark': '#FA9F00', - '--vera-warning-hover': '#A64C03', - '--vera-warning-hover-light': '#A64C03', - '--vera-warning-hover-dark': '#FACC4B', - }, - 'html.vera-dark-mode': { - '--vera-accent': '#FFFFFF', - '--vera-alert-background': '#3E0004', - '--vera-alert-background-hover': '#6E0000', - '--vera-alert-text': '#FEDFDF', - '--vera-background': '#26044D', - '--vera-border': '#333333', - '--vera-dark-background': '#202124', - '--vera-dark-grey': '#333333', - '--vera-dark-grey-hover': '#292828', - '--vera-dark-grey-opacity': '#333333CD', - '--vera-disabled': '#333333', - '--vera-error': '#F75959', - '--vera-error-hover': '#FE9696', - '--vera-information': '#2997F0', - '--vera-information-background': '#E8F4FB', - '--vera-information-hover': '#0276D5', - '--vera-on-accent': '#000000', - '--vera-on-background': '#B3B3B3', - '--vera-on-dark-grey': '#FFFFFF', - '--vera-on-error': '#000000', - '--vera-on-information': '#FFFFFF', - '--vera-on-primary': '#000000', - '--vera-on-secondary': '#000000', - '--vera-on-success': '#000000', - '--vera-on-surface': '#FFFFFF', - '--vera-on-tertiary': '#000000', - '--vera-on-warning': '#000000', - '--vera-primary': '#B27BF2', - '--vera-primary-hover': '#CBA1FA', - '--vera-secondary': '#FFFFFF', - '--vera-secondary-hover': '#929292', - '--vera-skeleton-like': '#333333', - '--vera-success': '#30A849', - '--vera-success-hover': '#53CA6A', - '--vera-surface': '#000000', - '--vera-tertiary': '#B3B3B3', - '--vera-tertiary-hover': '#B3B3B3', - '--vera-text-disabled': '#666666', - '--vera-text-primary': '#B27BF2', - '--vera-text-secondary': '#FFFFFF', - '--vera-text-tertiary': '#B3B3B3', - '--vera-warning': '#FA9F00', - '--vera-warning-hover': '#FACC4B', - }, - }); - - // headline - fontSizeUtilities['.text-vera-headline'] = { - fontSize: '2rem', - lineHeight: '2.5rem', - fontWeight: 500, - '@media (min-width: 768px)': { - fontSize: '4.125rem', - lineHeight: '5.5rem', - fontWeight: 500, - }, - }; +/** + * @typedef {Object} VeraTypographyProperties + * @property {string} [fontSize] + * @property {string} [lineHeight] + * @property {string} [fontWeight] + * @property {string} [mobileFontSize] + * @property {string} [mobileLineHeight] + * @property {string} [mobileFontWeight] + */ +/** + * @typedef {Object} VeraColorThemeConfig + * @property {string} [accent] + * @property {string} [alertBackground] + * @property {string} [alertBackgroundHover] + * @property {string} [alertText] + * @property {string} [background] + * @property {string} [border] + * @property {string} [darkBackground] + * @property {string} [darkGrey] + * @property {string} [darkGreyHover] + * @property {string} [darkGreyOpacity] + * @property {string} [disabled] + * @property {string} [error] + * @property {string} [errorHover] + * @property {string} [information] + * @property {string} [informationBackground] + * @property {string} [informationHover] + * @property {string} [onAccent] + * @property {string} [onBackground] + * @property {string} [onDarkGrey] + * @property {string} [onError] + * @property {string} [onInformation] + * @property {string} [onPrimary] + * @property {string} [onSecondary] + * @property {string} [onSuccess] + * @property {string} [onSurface] + * @property {string} [onTertiary] + * @property {string} [onWarning] + * @property {string} [primary] + * @property {string} [primaryHover] + * @property {string} [secondary] + * @property {string} [secondaryHover] + * @property {string} [skeletonLike] + * @property {string} [success] + * @property {string} [successHover] + * @property {string} [surface] + * @property {string} [tertiary] + * @property {string} [tertiaryHover] + * @property {string} [textDisabled] + * @property {string} [textPrimary] + * @property {string} [textSecondary] + * @property {string} [textTertiary] + * @property {string} [warning] + * @property {string} [warningHover] + */ +/** + * @typedef {Object} VeraUIConfig + * @property {VeraColorThemeConfig} [light] + * @property {VeraColorThemeConfig} [dark] + * @property {string} [borderRadiusExtraLarge] + * @property {string} [borderRadiusExtraSmall] + * @property {string} [borderRadiusLarge] + * @property {string} [borderRadiusMedium] + * @property {string} [borderRadiusNone] + * @property {string} [borderRadiusSmall] + * @property {string} [fontFamilyPlain] + * @property {VeraTypographyProperties} [headline] + * @property {VeraTypographyProperties} [subtitle] + * @property {VeraTypographyProperties} [heading1] + * @property {VeraTypographyProperties} [heading2] + * @property {VeraTypographyProperties} [heading3] + * @property {VeraTypographyProperties} [heading4] + * @property {VeraTypographyProperties} [bodyExtended] + * @property {VeraTypographyProperties} [bodyExtendedSemibold] + * @property {VeraTypographyProperties} [bodyBase] + * @property {VeraTypographyProperties} [bodyBaseSemibold] + * @property {VeraTypographyProperties} [caption] + * @property {VeraTypographyProperties} [captionSemibold] + */ - fontWeightUtilities['.font-vera-headline'] = { - fontWeight: 500, - '@media (min-width: 768px)': { - fontWeight: 500, - }, - }; - - // subtitle - fontSizeUtilities['.text-vera-subtitle'] = { - fontSize: '1.875rem', - lineHeight: '2.375rem', - fontWeight: 500, - '@media (min-width: 768px)': { - fontSize: '3.25rem', - lineHeight: '4.25rem', +/** + * @param {VeraUIConfig} [config={}] + */ + +const veraUI = (config = {}) => { + return plugin( + ({ addUtilities, addBase, addVariant }) => { + const { light = {}, dark = {} } = config; // also includes typography and layout + const fontSizeUtilities = {}; + const fontWeightUtilities = {}; + + // Add custom variants + addVariant('child', '& > *'); + + // Add CSS variables for theme-aware colors + addBase({ + ':host, :root': { + '--vera-accent': config.accent ?? light.accent ?? '#FFFFFF', + '--vera-accent-light': config.accent ?? light.accent ?? '#FFFFFF', + '--vera-accent-dark': config.accent ?? dark.accent ?? '#FFFFFF', + '--vera-alert-background': config.alertBackground ?? light.alertBackground ?? '#FFEEF2', + '--vera-alert-background-light': + config.alertBackground ?? light.alertBackground ?? '#FFEEF2', + '--vera-alert-background-dark': + config.alertBackground ?? dark.alertBackground ?? '#3E0004', + '--vera-alert-background-hover': + config.alertBackgroundHover ?? light.alertBackgroundHover ?? '#FEDFDF', + '--vera-alert-background-hover-light': + config.alertBackgroundHover ?? light.alertBackgroundHover ?? '#FEDFDF', + '--vera-alert-background-hover-dark': + config.alertBackgroundHover ?? dark.alertBackgroundHover ?? '#6E0000', + '--vera-alert-text': config.alertText ?? light.alertText ?? '#CD0000', + '--vera-alert-text-light': config.alertText ?? light.alertText ?? '#CD0000', + '--vera-alert-text-dark': config.alertText ?? dark.alertText ?? '#FEDFDF', + '--vera-background': config.background ?? light.background ?? '#F5F0FD', + '--vera-background-light': config.background ?? light.background ?? '#F5F0FD', + '--vera-background-dark': config.background ?? dark.background ?? '#26044D', + '--vera-border': config.border ?? light.border ?? '#E6E6E6', + '--vera-border-light': config.border ?? light.border ?? '#E6E6E6', + '--vera-border-dark': config.border ?? dark.border ?? '#333333', + '--vera-dark-background': config.darkBackground ?? light.darkBackground ?? '#202124', + '--vera-dark-background-light': + config.darkBackground ?? light.darkBackground ?? '#202124', + '--vera-dark-background-dark': config.darkBackground ?? dark.darkBackground ?? '#202124', + '--vera-dark-grey': config.darkGrey ?? light.darkGrey ?? '#333333', + '--vera-dark-grey-light': config.darkGrey ?? light.darkGrey ?? '#333333', + '--vera-dark-grey-dark': config.darkGrey ?? dark.darkGrey ?? '#333333', + '--vera-dark-grey-hover': config.darkGreyHover ?? light.darkGreyHover ?? '#292828', + '--vera-dark-grey-hover-light': config.darkGreyHover ?? light.darkGreyHover ?? '#292828', + '--vera-dark-grey-hover-dark': config.darkGreyHover ?? dark.darkGreyHover ?? '#292828', + '--vera-dark-grey-opacity': + config.darkGreyOpacity ?? light.darkGreyOpacity ?? '#333333CD', + '--vera-dark-grey-opacity-light': + config.darkGreyOpacity ?? light.darkGreyOpacity ?? '#333333CD', + '--vera-dark-grey-opacity-dark': + config.darkGreyOpacity ?? dark.darkGreyOpacity ?? '#333333CD', + '--vera-disabled': config.disabled ?? light.disabled ?? '#E6E6E6', + '--vera-disabled-light': config.disabled ?? light.disabled ?? '#E6E6E6', + '--vera-disabled-dark': config.disabled ?? dark.disabled ?? '#333333', + '--vera-error': config.error ?? light.error ?? '#E61D1D', + '--vera-error-light': config.error ?? light.error ?? '#E61D1D', + '--vera-error-dark': config.error ?? dark.error ?? '#F75959', + '--vera-error-hover': config.errorHover ?? light.errorHover ?? '#CD0000', + '--vera-error-hover-light': config.errorHover ?? light.errorHover ?? '#CD0000', + '--vera-error-hover-dark': config.errorHover ?? dark.errorHover ?? '#FE9696', + '--vera-information': config.information ?? light.information ?? '#0276D5', + '--vera-information-light': config.information ?? light.information ?? '#0276D5', + '--vera-information-dark': config.information ?? dark.information ?? '#2997F0', + '--vera-information-background': + config.informationBackground ?? light.informationBackground ?? '#E8F4FB', + '--vera-information-background-light': + config.informationBackground ?? light.informationBackground ?? '#E8F4FB', + '--vera-information-background-dark': + config.informationBackground ?? dark.informationBackground ?? '#E8F4FB', + '--vera-information-hover': + config.informationHover ?? light.informationHover ?? '#2997F0', + '--vera-information-hover-light': + config.informationHover ?? light.informationHover ?? '#2997F0', + '--vera-information-hover-dark': + config.informationHover ?? dark.informationHover ?? '#0276D5', + '--vera-on-accent': config.onAccent ?? light.onAccent ?? '#000000', + '--vera-on-accent-light': config.onAccent ?? light.onAccent ?? '#000000', + '--vera-on-accent-dark': config.onAccent ?? dark.onAccent ?? '#000000', + '--vera-on-background': config.onBackground ?? light.onBackground ?? '#757575', + '--vera-on-background-light': config.onBackground ?? light.onBackground ?? '#757575', + '--vera-on-background-dark': config.onBackground ?? dark.onBackground ?? '#B3B3B3', + '--vera-on-dark-grey': config.onDarkGrey ?? light.onDarkGrey ?? '#FFFFFF', + '--vera-on-dark-grey-light': config.onDarkGrey ?? light.onDarkGrey ?? '#FFFFFF', + '--vera-on-dark-grey-dark': config.onDarkGrey ?? dark.onDarkGrey ?? '#FFFFFF', + '--vera-on-error': config.onError ?? light.onError ?? '#FFFFFF', + '--vera-on-error-light': config.onError ?? light.onError ?? '#FFFFFF', + '--vera-on-error-dark': config.onError ?? dark.onError ?? '#000000', + '--vera-on-information': config.onInformation ?? light.onInformation ?? '#FFFFFF', + '--vera-on-information-light': config.onInformation ?? light.onInformation ?? '#FFFFFF', + '--vera-on-information-dark': config.onInformation ?? dark.onInformation ?? '#FFFFFF', + '--vera-on-primary': config.onPrimary ?? light.onPrimary ?? '#FFFFFF', + '--vera-on-primary-light': config.onPrimary ?? light.onPrimary ?? '#FFFFFF', + '--vera-on-primary-dark': config.onPrimary ?? dark.onPrimary ?? '#000000', + '--vera-on-secondary': config.onSecondary ?? light.onSecondary ?? '#FFFFFF', + '--vera-on-secondary-light': config.onSecondary ?? light.onSecondary ?? '#FFFFFF', + '--vera-on-secondary-dark': config.onSecondary ?? dark.onSecondary ?? '#000000', + '--vera-on-success': config.onSuccess ?? light.onSuccess ?? '#FFFFFF', + '--vera-on-success-light': config.onSuccess ?? light.onSuccess ?? '#FFFFFF', + '--vera-on-success-dark': config.onSuccess ?? dark.onSuccess ?? '#000000', + '--vera-on-surface': config.onSurface ?? light.onSurface ?? '#929292', + '--vera-on-surface-light': config.onSurface ?? light.onSurface ?? '#929292', + '--vera-on-surface-dark': config.onSurface ?? dark.onSurface ?? '#FFFFFF', + '--vera-on-tertiary': config.onTertiary ?? light.onTertiary ?? '#FFFFFF', + '--vera-on-tertiary-light': config.onTertiary ?? light.onTertiary ?? '#FFFFFF', + '--vera-on-tertiary-dark': config.onTertiary ?? dark.onTertiary ?? '#000000', + '--vera-on-warning': config.onWarning ?? light.onWarning ?? '#FFFFFF', + '--vera-on-warning-light': config.onWarning ?? light.onWarning ?? '#FFFFFF', + '--vera-on-warning-dark': config.onWarning ?? dark.onWarning ?? '#000000', + '--vera-primary': config.primary ?? light.primary ?? '#9941FF', + '--vera-primary-light': config.primary ?? light.primary ?? '#9941FF', + '--vera-primary-dark': config.primary ?? dark.primary ?? '#B27BF2', + '--vera-primary-hover': config.primaryHover ?? light.primaryHover ?? '#871EFF', + '--vera-primary-hover-light': config.primaryHover ?? light.primaryHover ?? '#871EFF', + '--vera-primary-hover-dark': config.primaryHover ?? dark.primaryHover ?? '#CBA1FA', + '--vera-secondary': config.secondary ?? light.secondary ?? '#000000', + '--vera-secondary-light': config.secondary ?? light.secondary ?? '#000000', + '--vera-secondary-dark': config.secondary ?? dark.secondary ?? '#FFFFFF', + '--vera-secondary-hover': config.secondaryHover ?? light.secondaryHover ?? '#666666', + '--vera-secondary-hover-light': + config.secondaryHover ?? light.secondaryHover ?? '#666666', + '--vera-secondary-hover-dark': config.secondaryHover ?? dark.secondaryHover ?? '#929292', + '--vera-skeleton-like': config.skeletonLike ?? light.skeletonLike ?? '#B3B3B3', + '--vera-skeleton-like-light': config.skeletonLike ?? light.skeletonLike ?? '#B3B3B3', + '--vera-skeleton-like-dark': config.skeletonLike ?? dark.skeletonLike ?? '#333333', + '--vera-success': config.success ?? light.success ?? '#1C8731', + '--vera-success-light': config.success ?? light.success ?? '#1C8731', + '--vera-success-dark': config.success ?? dark.success ?? '#30A849', + '--vera-success-hover': config.successHover ?? light.successHover ?? '#1F7629', + '--vera-success-hover-light': config.successHover ?? light.successHover ?? '#1F7629', + '--vera-success-hover-dark': config.successHover ?? dark.successHover ?? '#53CA6A', + '--vera-surface': config.surface ?? light.surface ?? '#FFFFFF', + '--vera-surface-light': config.surface ?? light.surface ?? '#FFFFFF', + '--vera-surface-dark': config.surface ?? dark.surface ?? '#000000', + '--vera-tertiary': config.tertiary ?? light.tertiary ?? '#757575', + '--vera-tertiary-light': config.tertiary ?? light.tertiary ?? '#757575', + '--vera-tertiary-dark': config.tertiary ?? dark.tertiary ?? '#B3B3B3', + '--vera-tertiary-hover': config.tertiaryHover ?? light.tertiaryHover ?? '#929292', + '--vera-tertiary-hover-light': config.tertiaryHover ?? light.tertiaryHover ?? '#929292', + '--vera-tertiary-hover-dark': config.tertiaryHover ?? dark.tertiaryHover ?? '#B3B3B3', + '--vera-text-disabled': config.textDisabled ?? light.textDisabled ?? '#B3B3B3', + '--vera-text-disabled-light': config.textDisabled ?? light.textDisabled ?? '#B3B3B3', + '--vera-text-disabled-dark': config.textDisabled ?? dark.textDisabled ?? '#666666', + '--vera-text-primary': config.textPrimary ?? light.textPrimary ?? '#9941FF', + '--vera-text-primary-light': config.textPrimary ?? light.textPrimary ?? '#9941FF', + '--vera-text-primary-dark': config.textPrimary ?? dark.textPrimary ?? '#B27BF2', + '--vera-text-secondary': config.textSecondary ?? light.textSecondary ?? '#000000', + '--vera-text-secondary-light': config.textSecondary ?? light.textSecondary ?? '#000000', + '--vera-text-secondary-dark': config.textSecondary ?? dark.textSecondary ?? '#FFFFFF', + '--vera-text-tertiary': config.textTertiary ?? light.textTertiary ?? '#757575', + '--vera-text-tertiary-light': config.textTertiary ?? light.textTertiary ?? '#757575', + '--vera-text-tertiary-dark': config.textTertiary ?? dark.textTertiary ?? '#B3B3B3', + '--vera-warning': config.warning ?? light.warning ?? '#BE5702', + '--vera-warning-light': config.warning ?? light.warning ?? '#BE5702', + '--vera-warning-dark': config.warning ?? dark.warning ?? '#FA9F00', + '--vera-warning-hover': config.warningHover ?? light.warningHover ?? '#A64C03', + '--vera-warning-hover-light': config.warningHover ?? light.warningHover ?? '#A64C03', + '--vera-warning-hover-dark': config.warningHover ?? dark.warningHover ?? '#FACC4B', + + // Typography and layout design tokens + '--vera-border-radius-extra-large': config.borderRadiusExtraLarge ?? '24px', + '--vera-border-radius-extra-small': config.borderRadiusExtraSmall ?? '2px', + '--vera-border-radius-large': config.borderRadiusLarge ?? '12px', + '--vera-border-radius-medium': config.borderRadiusMedium ?? '8px', + '--vera-border-radius-none': config.borderRadiusNone ?? '0px', + '--vera-border-radius-small': config.borderRadiusSmall ?? '4px', + '--vera-font-family-plain': + config.fontFamilyPlain ?? + 'Inter, sans-serif, system-ui, ui-sans-serif, Marker Felt, Trebuchet MS', + '--vera-typography-headline-font-size': config.headline?.fontSize ?? '4.125rem', + '--vera-typography-headline-line-height': config.headline?.lineHeight ?? '5.5rem', + '--vera-typography-headline-font-weight': config.headline?.fontWeight ?? '500', + '--vera-typography-headline-mobile-font-size': config.headline?.mobileFontSize ?? '2rem', + '--vera-typography-headline-mobile-line-height': + config.headline?.mobileLineHeight ?? '2.5rem', + '--vera-typography-headline-mobile-font-weight': + config.headline?.mobileFontWeight ?? '500', + '--vera-typography-subtitle-font-size': config.subtitle?.fontSize ?? '3.25rem', + '--vera-typography-subtitle-line-height': config.subtitle?.lineHeight ?? '4.25rem', + '--vera-typography-subtitle-font-weight': config.subtitle?.fontWeight ?? '500', + '--vera-typography-subtitle-mobile-font-size': + config.subtitle?.mobileFontSize ?? '1.875rem', + '--vera-typography-subtitle-mobile-line-height': + config.subtitle?.mobileLineHeight ?? '2.375rem', + '--vera-typography-subtitle-mobile-font-weight': + config.subtitle?.mobileFontWeight ?? '500', + '--vera-typography-heading-1-font-size': config.heading1?.fontSize ?? '2.5rem', + '--vera-typography-heading-1-line-height': config.heading1?.lineHeight ?? '3.25rem', + '--vera-typography-heading-1-font-weight': config.heading1?.fontWeight ?? '500', + '--vera-typography-heading-1-mobile-font-size': + config.heading1?.mobileFontSize ?? '1.75rem', + '--vera-typography-heading-1-mobile-line-height': + config.heading1?.mobileLineHeight ?? '2.25rem', + '--vera-typography-heading-1-mobile-font-weight': + config.heading1?.mobileFontWeight ?? '500', + '--vera-typography-heading-2-font-size': config.heading2?.fontSize ?? '2rem', + '--vera-typography-heading-2-line-height': config.heading2?.lineHeight ?? '2.75rem', + '--vera-typography-heading-2-font-weight': config.heading2?.fontWeight ?? '500', + '--vera-typography-heading-2-mobile-font-size': + config.heading2?.mobileFontSize ?? '1.5rem', + '--vera-typography-heading-2-mobile-line-height': + config.heading2?.mobileLineHeight ?? '2rem', + '--vera-typography-heading-2-mobile-font-weight': + config.heading2?.mobileFontWeight ?? '500', + '--vera-typography-heading-3-font-size': config.heading3?.fontSize ?? '1.625rem', + '--vera-typography-heading-3-line-height': config.heading3?.lineHeight ?? '2.25rem', + '--vera-typography-heading-3-font-weight': config.heading3?.fontWeight ?? '500', + '--vera-typography-heading-3-mobile-font-size': + config.heading3?.mobileFontSize ?? '1.25rem', + '--vera-typography-heading-3-mobile-line-height': + config.heading3?.mobileLineHeight ?? '1.75rem', + '--vera-typography-heading-3-mobile-font-weight': + config.heading3?.mobileFontWeight ?? '500', + '--vera-typography-heading-4-font-size': config.heading4?.fontSize ?? '1.25rem', + '--vera-typography-heading-4-line-height': config.heading4?.lineHeight ?? '1.75rem', + '--vera-typography-heading-4-font-weight': config.heading4?.fontWeight ?? '500', + '--vera-typography-heading-4-mobile-font-size': + config.heading4?.mobileFontSize ?? '1.125rem', + '--vera-typography-heading-4-mobile-line-height': + config.heading4?.mobileLineHeight ?? '1.5rem', + '--vera-typography-heading-4-mobile-font-weight': + config.heading4?.mobileFontWeight ?? '500', + '--vera-typography-body-extended-font-size': config.bodyExtended?.fontSize ?? '1rem', + '--vera-typography-body-extended-line-height': + config.bodyExtended?.lineHeight ?? '1.5rem', + '--vera-typography-body-extended-font-weight': config.bodyExtended?.fontWeight ?? '400', + '--vera-typography-body-extended-mobile-font-size': + config.bodyExtended?.mobileFontSize ?? '1rem', + '--vera-typography-body-extended-mobile-line-height': + config.bodyExtended?.mobileLineHeight ?? '1.5rem', + '--vera-typography-body-extended-mobile-font-weight': + config.bodyExtended?.mobileFontWeight ?? '400', + '--vera-typography-body-extended-semibold-font-size': + config.bodyExtendedSemibold?.fontSize ?? '1rem', + '--vera-typography-body-extended-semibold-line-height': + config.bodyExtendedSemibold?.lineHeight ?? '1.5rem', + '--vera-typography-body-extended-semibold-font-weight': + config.bodyExtendedSemibold?.fontWeight ?? '600', + '--vera-typography-body-extended-semibold-mobile-font-size': + config.bodyExtendedSemibold?.mobileFontSize ?? '1rem', + '--vera-typography-body-extended-semibold-mobile-line-height': + config.bodyExtendedSemibold?.mobileLineHeight ?? '1.5rem', + '--vera-typography-body-extended-semibold-mobile-font-weight': + config.bodyExtendedSemibold?.mobileFontWeight ?? '600', + '--vera-typography-body-base-font-size': config.bodyBase?.fontSize ?? '0.875rem', + '--vera-typography-body-base-line-height': config.bodyBase?.lineHeight ?? '1.25rem', + '--vera-typography-body-base-font-weight': config.bodyBase?.fontWeight ?? '400', + '--vera-typography-body-base-mobile-font-size': + config.bodyBase?.mobileFontSize ?? '0.875rem', + '--vera-typography-body-base-mobile-line-height': + config.bodyBase?.mobileLineHeight ?? '1.25rem', + '--vera-typography-body-base-mobile-font-weight': + config.bodyBase?.mobileFontWeight ?? '400', + '--vera-typography-body-base-semibold-font-size': + config.bodyBaseSemibold?.fontSize ?? '0.875rem', + '--vera-typography-body-base-semibold-line-height': + config.bodyBaseSemibold?.lineHeight ?? '1.25rem', + '--vera-typography-body-base-semibold-font-weight': + config.bodyBaseSemibold?.fontWeight ?? '600', + '--vera-typography-body-base-semibold-mobile-font-size': + config.bodyBaseSemibold?.mobileFontSize ?? '0.875rem', + '--vera-typography-body-base-semibold-mobile-line-height': + config.bodyBaseSemibold?.mobileLineHeight ?? '1.25rem', + '--vera-typography-body-base-semibold-mobile-font-weight': + config.bodyBaseSemibold?.mobileFontWeight ?? '600', + '--vera-typography-caption-font-size': config.caption?.fontSize ?? '0.75rem', + '--vera-typography-caption-line-height': config.caption?.lineHeight ?? '1rem', + '--vera-typography-caption-font-weight': config.caption?.fontWeight ?? '400', + '--vera-typography-caption-mobile-font-size': config.caption?.mobileFontSize ?? '0.75rem', + '--vera-typography-caption-mobile-line-height': + config.caption?.mobileLineHeight ?? '1rem', + '--vera-typography-caption-mobile-font-weight': config.caption?.mobileFontWeight ?? '400', + '--vera-typography-caption-semibold-font-size': + config.captionSemibold?.fontSize ?? '0.75rem', + '--vera-typography-caption-semibold-line-height': + config.captionSemibold?.lineHeight ?? '1rem', + '--vera-typography-caption-semibold-font-weight': + config.captionSemibold?.fontWeight ?? '600', + '--vera-typography-caption-semibold-mobile-font-size': + config.captionSemibold?.mobileFontSize ?? '0.75rem', + '--vera-typography-caption-semibold-mobile-line-height': + config.captionSemibold?.mobileLineHeight ?? '1rem', + '--vera-typography-caption-semibold-mobile-font-weight': + config.captionSemibold?.mobileFontWeight ?? '600', + }, + ':host(.vera-dark-mode), :host(.dark), html.vera-dark-mode': { + '--vera-accent': config.accent ?? dark.accent ?? '#FFFFFF', + '--vera-alert-background': config.alertBackground ?? dark.alertBackground ?? '#3E0004', + '--vera-alert-background-hover': + config.alertBackgroundHover ?? dark.alertBackgroundHover ?? '#6E0000', + '--vera-alert-text': config.alertText ?? dark.alertText ?? '#FEDFDF', + '--vera-background': config.background ?? dark.background ?? '#26044D', + '--vera-border': config.border ?? dark.border ?? '#333333', + '--vera-dark-background': config.darkBackground ?? dark.darkBackground ?? '#202124', + '--vera-dark-grey': config.darkGrey ?? dark.darkGrey ?? '#333333', + '--vera-dark-grey-hover': config.darkGreyHover ?? dark.darkGreyHover ?? '#292828', + '--vera-dark-grey-opacity': config.darkGreyOpacity ?? dark.darkGreyOpacity ?? '#333333CD', + '--vera-disabled': config.disabled ?? dark.disabled ?? '#333333', + '--vera-error': config.error ?? dark.error ?? '#F75959', + '--vera-error-hover': config.errorHover ?? dark.errorHover ?? '#FE9696', + '--vera-information': config.information ?? dark.information ?? '#2997F0', + '--vera-information-background': + config.informationBackground ?? dark.informationBackground ?? '#E8F4FB', + '--vera-information-hover': config.informationHover ?? dark.informationHover ?? '#0276D5', + '--vera-on-accent': config.onAccent ?? dark.onAccent ?? '#000000', + '--vera-on-background': config.onBackground ?? dark.onBackground ?? '#B3B3B3', + '--vera-on-dark-grey': config.onDarkGrey ?? dark.onDarkGrey ?? '#FFFFFF', + '--vera-on-error': config.onError ?? dark.onError ?? '#000000', + '--vera-on-information': config.onInformation ?? dark.onInformation ?? '#FFFFFF', + '--vera-on-primary': config.onPrimary ?? dark.onPrimary ?? '#000000', + '--vera-on-secondary': config.onSecondary ?? dark.onSecondary ?? '#000000', + '--vera-on-success': config.onSuccess ?? dark.onSuccess ?? '#000000', + '--vera-on-surface': config.onSurface ?? dark.onSurface ?? '#FFFFFF', + '--vera-on-tertiary': config.onTertiary ?? dark.onTertiary ?? '#000000', + '--vera-on-warning': config.onWarning ?? dark.onWarning ?? '#000000', + '--vera-primary': config.primary ?? dark.primary ?? '#B27BF2', + '--vera-primary-hover': config.primaryHover ?? dark.primaryHover ?? '#CBA1FA', + '--vera-secondary': config.secondary ?? dark.secondary ?? '#FFFFFF', + '--vera-secondary-hover': config.secondaryHover ?? dark.secondaryHover ?? '#929292', + '--vera-skeleton-like': config.skeletonLike ?? dark.skeletonLike ?? '#333333', + '--vera-success': config.success ?? dark.success ?? '#30A849', + '--vera-success-hover': config.successHover ?? dark.successHover ?? '#53CA6A', + '--vera-surface': config.surface ?? dark.surface ?? '#000000', + '--vera-tertiary': config.tertiary ?? dark.tertiary ?? '#B3B3B3', + '--vera-tertiary-hover': config.tertiaryHover ?? dark.tertiaryHover ?? '#B3B3B3', + '--vera-text-disabled': config.textDisabled ?? dark.textDisabled ?? '#666666', + '--vera-text-primary': config.textPrimary ?? dark.textPrimary ?? '#B27BF2', + '--vera-text-secondary': config.textSecondary ?? dark.textSecondary ?? '#FFFFFF', + '--vera-text-tertiary': config.textTertiary ?? dark.textTertiary ?? '#B3B3B3', + '--vera-warning': config.warning ?? dark.warning ?? '#FA9F00', + '--vera-warning-hover': config.warningHover ?? dark.warningHover ?? '#FACC4B', + }, + }); + // headline + fontSizeUtilities['.text-vera-headline'] = { + fontSize: '2rem', + lineHeight: '2.5rem', fontWeight: 500, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-headline-font-size, 4.125rem)', + lineHeight: 'var(--vera-typography-headline-line-height, 5.5rem)', + fontWeight: 'var(--vera-typography-headline-font-weight, 500)', + }, + }; - fontWeightUtilities['.font-vera-subtitle'] = { - fontWeight: 500, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-headline'] = { fontWeight: 500, - }, - }; - - // heading-1 - fontSizeUtilities['.text-vera-heading-1'] = { - fontSize: '1.75rem', - lineHeight: '2.25rem', - fontWeight: 500, - '@media (min-width: 768px)': { - fontSize: '2.5rem', - lineHeight: '3.25rem', + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-headline-font-weight, 500)', + }, + }; + + // subtitle + fontSizeUtilities['.text-vera-subtitle'] = { + fontSize: '1.875rem', + lineHeight: '2.375rem', fontWeight: 500, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-subtitle-font-size, 3.25rem)', + lineHeight: 'var(--vera-typography-subtitle-line-height, 4.25rem)', + fontWeight: 'var(--vera-typography-subtitle-font-weight, 500)', + }, + }; - fontWeightUtilities['.font-vera-heading-1'] = { - fontWeight: 500, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-subtitle'] = { fontWeight: 500, - }, - }; - - // heading-2 - fontSizeUtilities['.text-vera-heading-2'] = { - fontSize: '1.5rem', - lineHeight: '2rem', - fontWeight: 500, - '@media (min-width: 768px)': { - fontSize: '2rem', - lineHeight: '2.75rem', + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-subtitle-font-weight, 500)', + }, + }; + + // heading-1 + fontSizeUtilities['.text-vera-heading-1'] = { + fontSize: '1.75rem', + lineHeight: '2.25rem', fontWeight: 500, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-heading-1-font-size, 2.5rem)', + lineHeight: 'var(--vera-typography-heading-1-line-height, 3.25rem)', + fontWeight: 'var(--vera-typography-heading-1-font-weight, 500)', + }, + }; - fontWeightUtilities['.font-vera-heading-2'] = { - fontWeight: 500, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-heading-1'] = { fontWeight: 500, - }, - }; - - // heading-3 - fontSizeUtilities['.text-vera-heading-3'] = { - fontSize: '1.25rem', - lineHeight: '1.75rem', - fontWeight: 500, - '@media (min-width: 768px)': { - fontSize: '1.625rem', - lineHeight: '2.25rem', + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-heading-1-font-weight, 500)', + }, + }; + + // heading-2 + fontSizeUtilities['.text-vera-heading-2'] = { + fontSize: '1.5rem', + lineHeight: '2rem', fontWeight: 500, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-heading-2-font-size, 2rem)', + lineHeight: 'var(--vera-typography-heading-2-line-height, 2.75rem)', + fontWeight: 'var(--vera-typography-heading-2-font-weight, 500)', + }, + }; - fontWeightUtilities['.font-vera-heading-3'] = { - fontWeight: 500, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-heading-2'] = { fontWeight: 500, - }, - }; - - // heading-4 - fontSizeUtilities['.text-vera-heading-4'] = { - fontSize: '1.125rem', - lineHeight: '1.5rem', - fontWeight: 500, - '@media (min-width: 768px)': { + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-heading-2-font-weight, 500)', + }, + }; + + // heading-3 + fontSizeUtilities['.text-vera-heading-3'] = { fontSize: '1.25rem', lineHeight: '1.75rem', fontWeight: 500, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-heading-3-font-size, 1.625rem)', + lineHeight: 'var(--vera-typography-heading-3-line-height, 2.25rem)', + fontWeight: 'var(--vera-typography-heading-3-font-weight, 500)', + }, + }; - fontWeightUtilities['.font-vera-heading-4'] = { - fontWeight: 500, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-heading-3'] = { fontWeight: 500, - }, - }; - - // body-extended - fontSizeUtilities['.text-vera-body-extended'] = { - fontSize: '1rem', - lineHeight: '1.5rem', - fontWeight: 400, - '@media (min-width: 768px)': { + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-heading-3-font-weight, 500)', + }, + }; + + // heading-4 + fontSizeUtilities['.text-vera-heading-4'] = { + fontSize: '1.125rem', + lineHeight: '1.5rem', + fontWeight: 500, + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-heading-4-font-size, 1.25rem)', + lineHeight: 'var(--vera-typography-heading-4-line-height, 1.75rem)', + fontWeight: 'var(--vera-typography-heading-4-font-weight, 500)', + }, + }; + + fontWeightUtilities['.font-vera-heading-4'] = { + fontWeight: 500, + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-heading-4-font-weight, 500)', + }, + }; + + // body-extended + fontSizeUtilities['.text-vera-body-extended'] = { fontSize: '1rem', lineHeight: '1.5rem', fontWeight: 400, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-body-extended-font-size, 1rem)', + lineHeight: 'var(--vera-typography-body-extended-line-height, 1.5rem)', + fontWeight: 'var(--vera-typography-body-extended-font-weight, 400)', + }, + }; - fontWeightUtilities['.font-vera-body-extended'] = { - fontWeight: 400, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-body-extended'] = { fontWeight: 400, - }, - }; - - // body-extended-semibold - fontSizeUtilities['.text-vera-body-extended-semibold'] = { - fontSize: '1rem', - lineHeight: '1.5rem', - fontWeight: 600, - '@media (min-width: 768px)': { + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-body-extended-font-weight, 400)', + }, + }; + + // body-extended-semibold + fontSizeUtilities['.text-vera-body-extended-semibold'] = { fontSize: '1rem', lineHeight: '1.5rem', fontWeight: 600, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-body-extended-semibold-font-size, 1rem)', + lineHeight: 'var(--vera-typography-body-extended-semibold-line-height, 1.5rem)', + fontWeight: 'var(--vera-typography-body-extended-semibold-font-weight, 600)', + }, + }; - fontWeightUtilities['.font-vera-body-extended-semibold'] = { - fontWeight: 600, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-body-extended-semibold'] = { fontWeight: 600, - }, - }; - - // body-base - fontSizeUtilities['.text-vera-body-base'] = { - fontSize: '0.875rem', - lineHeight: '1.25rem', - fontWeight: 400, - '@media (min-width: 768px)': { + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-body-extended-semibold-font-weight, 600)', + }, + }; + + // body-base + fontSizeUtilities['.text-vera-body-base'] = { fontSize: '0.875rem', lineHeight: '1.25rem', fontWeight: 400, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-body-base-font-size, 0.875rem)', + lineHeight: 'var(--vera-typography-body-base-line-height, 1.25rem)', + fontWeight: 'var(--vera-typography-body-base-font-weight, 400)', + }, + }; - fontWeightUtilities['.font-vera-body-base'] = { - fontWeight: 400, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-body-base'] = { fontWeight: 400, - }, - }; - - // body-base-semibold - fontSizeUtilities['.text-vera-body-base-semibold'] = { - fontSize: '0.875rem', - lineHeight: '1.25rem', - fontWeight: 600, - '@media (min-width: 768px)': { + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-body-base-font-weight, 400)', + }, + }; + + // body-base-semibold + fontSizeUtilities['.text-vera-body-base-semibold'] = { fontSize: '0.875rem', lineHeight: '1.25rem', fontWeight: 600, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-body-base-semibold-font-size, 0.875rem)', + lineHeight: 'var(--vera-typography-body-base-semibold-line-height, 1.25rem)', + fontWeight: 'var(--vera-typography-body-base-semibold-font-weight, 600)', + }, + }; - fontWeightUtilities['.font-vera-body-base-semibold'] = { - fontWeight: 600, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-body-base-semibold'] = { fontWeight: 600, - }, - }; - - // caption - fontSizeUtilities['.text-vera-caption'] = { - fontSize: '0.75rem', - lineHeight: '1rem', - fontWeight: 400, - '@media (min-width: 768px)': { + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-body-base-semibold-font-weight, 600)', + }, + }; + + // caption + fontSizeUtilities['.text-vera-caption'] = { fontSize: '0.75rem', lineHeight: '1rem', fontWeight: 400, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-caption-font-size, 0.75rem)', + lineHeight: 'var(--vera-typography-caption-line-height, 1rem)', + fontWeight: 'var(--vera-typography-caption-font-weight, 400)', + }, + }; - fontWeightUtilities['.font-vera-caption'] = { - fontWeight: 400, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-caption'] = { fontWeight: 400, - }, - }; - - // caption-semibold - fontSizeUtilities['.text-vera-caption-semibold'] = { - fontSize: '0.75rem', - lineHeight: '1rem', - fontWeight: 600, - '@media (min-width: 768px)': { + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-caption-font-weight, 400)', + }, + }; + + // caption-semibold + fontSizeUtilities['.text-vera-caption-semibold'] = { fontSize: '0.75rem', lineHeight: '1rem', fontWeight: 600, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-caption-semibold-font-size, 0.75rem)', + lineHeight: 'var(--vera-typography-caption-semibold-line-height, 1rem)', + fontWeight: 'var(--vera-typography-caption-semibold-font-weight, 600)', + }, + }; - fontWeightUtilities['.font-vera-caption-semibold'] = { - fontWeight: 600, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-caption-semibold'] = { fontWeight: 600, - }, - }; - - addUtilities(fontSizeUtilities); - addUtilities(fontWeightUtilities); - }, - { - theme: { - extend: { - borderRadius: { - 'vera-extra-large': '24px', - 'vera-extra-small': '2px', - 'vera-large': '12px', - 'vera-medium': '8px', - 'vera-none': '0px', - 'vera-small': '4px', - }, - colors: { - 'vera-accent': 'var(--vera-accent, #FFFFFF)', - 'vera-accent-light': 'var(--vera-accent-light, #FFFFFF)', - 'vera-accent-dark': 'var(--vera-accent-dark, #FFFFFF)', - 'vera-alert-background': 'var(--vera-alert-background, #FFEEF2)', - 'vera-alert-background-light': 'var(--vera-alert-background-light, #FFEEF2)', - 'vera-alert-background-dark': 'var(--vera-alert-background-dark, #3E0004)', - 'vera-alert-background-hover': 'var(--vera-alert-background-hover, #FEDFDF)', - 'vera-alert-background-hover-light': 'var(--vera-alert-background-hover-light, #FEDFDF)', - 'vera-alert-background-hover-dark': 'var(--vera-alert-background-hover-dark, #6E0000)', - 'vera-alert-text': 'var(--vera-alert-text, #CD0000)', - 'vera-alert-text-light': 'var(--vera-alert-text-light, #CD0000)', - 'vera-alert-text-dark': 'var(--vera-alert-text-dark, #FEDFDF)', - 'vera-background': 'var(--vera-background, #F5F0FD)', - 'vera-background-light': 'var(--vera-background-light, #F5F0FD)', - 'vera-background-dark': 'var(--vera-background-dark, #26044D)', - 'vera-border': 'var(--vera-border, #E6E6E6)', - 'vera-border-light': 'var(--vera-border-light, #E6E6E6)', - 'vera-border-dark': 'var(--vera-border-dark, #333333)', - 'vera-dark-background': 'var(--vera-dark-background, #202124)', - 'vera-dark-background-light': 'var(--vera-dark-background-light, #202124)', - 'vera-dark-background-dark': 'var(--vera-dark-background-dark, #202124)', - 'vera-dark-grey': 'var(--vera-dark-grey, #333333)', - 'vera-dark-grey-light': 'var(--vera-dark-grey-light, #333333)', - 'vera-dark-grey-dark': 'var(--vera-dark-grey-dark, #333333)', - 'vera-dark-grey-hover': 'var(--vera-dark-grey-hover, #292828)', - 'vera-dark-grey-hover-light': 'var(--vera-dark-grey-hover-light, #292828)', - 'vera-dark-grey-hover-dark': 'var(--vera-dark-grey-hover-dark, #292828)', - 'vera-dark-grey-opacity': 'var(--vera-dark-grey-opacity, #333333CD)', - 'vera-dark-grey-opacity-light': 'var(--vera-dark-grey-opacity-light, #333333CD)', - 'vera-dark-grey-opacity-dark': 'var(--vera-dark-grey-opacity-dark, #333333CD)', - 'vera-disabled': 'var(--vera-disabled, #E6E6E6)', - 'vera-disabled-light': 'var(--vera-disabled-light, #E6E6E6)', - 'vera-disabled-dark': 'var(--vera-disabled-dark, #333333)', - 'vera-error': 'var(--vera-error, #E61D1D)', - 'vera-error-light': 'var(--vera-error-light, #E61D1D)', - 'vera-error-dark': 'var(--vera-error-dark, #F75959)', - 'vera-error-hover': 'var(--vera-error-hover, #CD0000)', - 'vera-error-hover-light': 'var(--vera-error-hover-light, #CD0000)', - 'vera-error-hover-dark': 'var(--vera-error-hover-dark, #FE9696)', - 'vera-information': 'var(--vera-information, #0276D5)', - 'vera-information-light': 'var(--vera-information-light, #0276D5)', - 'vera-information-dark': 'var(--vera-information-dark, #2997F0)', - 'vera-information-background': 'var(--vera-information-background, #E8F4FB)', - 'vera-information-background-light': 'var(--vera-information-background-light, #E8F4FB)', - 'vera-information-background-dark': 'var(--vera-information-background-dark, #E8F4FB)', - 'vera-information-hover': 'var(--vera-information-hover, #2997F0)', - 'vera-information-hover-light': 'var(--vera-information-hover-light, #2997F0)', - 'vera-information-hover-dark': 'var(--vera-information-hover-dark, #0276D5)', - 'vera-on-accent': 'var(--vera-on-accent, #000000)', - 'vera-on-accent-light': 'var(--vera-on-accent-light, #000000)', - 'vera-on-accent-dark': 'var(--vera-on-accent-dark, #000000)', - 'vera-on-background': 'var(--vera-on-background, #757575)', - 'vera-on-background-light': 'var(--vera-on-background-light, #757575)', - 'vera-on-background-dark': 'var(--vera-on-background-dark, #B3B3B3)', - 'vera-on-dark-grey': 'var(--vera-on-dark-grey, #FFFFFF)', - 'vera-on-dark-grey-light': 'var(--vera-on-dark-grey-light, #FFFFFF)', - 'vera-on-dark-grey-dark': 'var(--vera-on-dark-grey-dark, #FFFFFF)', - 'vera-on-error': 'var(--vera-on-error, #FFFFFF)', - 'vera-on-error-light': 'var(--vera-on-error-light, #FFFFFF)', - 'vera-on-error-dark': 'var(--vera-on-error-dark, #000000)', - 'vera-on-information': 'var(--vera-on-information, #FFFFFF)', - 'vera-on-information-light': 'var(--vera-on-information-light, #FFFFFF)', - 'vera-on-information-dark': 'var(--vera-on-information-dark, #FFFFFF)', - 'vera-on-primary': 'var(--vera-on-primary, #FFFFFF)', - 'vera-on-primary-light': 'var(--vera-on-primary-light, #FFFFFF)', - 'vera-on-primary-dark': 'var(--vera-on-primary-dark, #000000)', - 'vera-on-secondary': 'var(--vera-on-secondary, #FFFFFF)', - 'vera-on-secondary-light': 'var(--vera-on-secondary-light, #FFFFFF)', - 'vera-on-secondary-dark': 'var(--vera-on-secondary-dark, #000000)', - 'vera-on-success': 'var(--vera-on-success, #FFFFFF)', - 'vera-on-success-light': 'var(--vera-on-success-light, #FFFFFF)', - 'vera-on-success-dark': 'var(--vera-on-success-dark, #000000)', - 'vera-on-surface': 'var(--vera-on-surface, #929292)', - 'vera-on-surface-light': 'var(--vera-on-surface-light, #929292)', - 'vera-on-surface-dark': 'var(--vera-on-surface-dark, #FFFFFF)', - 'vera-on-tertiary': 'var(--vera-on-tertiary, #FFFFFF)', - 'vera-on-tertiary-light': 'var(--vera-on-tertiary-light, #FFFFFF)', - 'vera-on-tertiary-dark': 'var(--vera-on-tertiary-dark, #000000)', - 'vera-on-warning': 'var(--vera-on-warning, #FFFFFF)', - 'vera-on-warning-light': 'var(--vera-on-warning-light, #FFFFFF)', - 'vera-on-warning-dark': 'var(--vera-on-warning-dark, #000000)', - 'vera-primary': 'var(--vera-primary, #9941FF)', - 'vera-primary-light': 'var(--vera-primary-light, #9941FF)', - 'vera-primary-dark': 'var(--vera-primary-dark, #B27BF2)', - 'vera-primary-hover': 'var(--vera-primary-hover, #871EFF)', - 'vera-primary-hover-light': 'var(--vera-primary-hover-light, #871EFF)', - 'vera-primary-hover-dark': 'var(--vera-primary-hover-dark, #CBA1FA)', - 'vera-secondary': 'var(--vera-secondary, #000000)', - 'vera-secondary-light': 'var(--vera-secondary-light, #000000)', - 'vera-secondary-dark': 'var(--vera-secondary-dark, #FFFFFF)', - 'vera-secondary-hover': 'var(--vera-secondary-hover, #666666)', - 'vera-secondary-hover-light': 'var(--vera-secondary-hover-light, #666666)', - 'vera-secondary-hover-dark': 'var(--vera-secondary-hover-dark, #929292)', - 'vera-skeleton-like': 'var(--vera-skeleton-like, #B3B3B3)', - 'vera-skeleton-like-light': 'var(--vera-skeleton-like-light, #B3B3B3)', - 'vera-skeleton-like-dark': 'var(--vera-skeleton-like-dark, #333333)', - 'vera-success': 'var(--vera-success, #1C8731)', - 'vera-success-light': 'var(--vera-success-light, #1C8731)', - 'vera-success-dark': 'var(--vera-success-dark, #30A849)', - 'vera-success-hover': 'var(--vera-success-hover, #1F7629)', - 'vera-success-hover-light': 'var(--vera-success-hover-light, #1F7629)', - 'vera-success-hover-dark': 'var(--vera-success-hover-dark, #53CA6A)', - 'vera-surface': 'var(--vera-surface, #FFFFFF)', - 'vera-surface-light': 'var(--vera-surface-light, #FFFFFF)', - 'vera-surface-dark': 'var(--vera-surface-dark, #000000)', - 'vera-tertiary': 'var(--vera-tertiary, #757575)', - 'vera-tertiary-light': 'var(--vera-tertiary-light, #757575)', - 'vera-tertiary-dark': 'var(--vera-tertiary-dark, #B3B3B3)', - 'vera-tertiary-hover': 'var(--vera-tertiary-hover, #929292)', - 'vera-tertiary-hover-light': 'var(--vera-tertiary-hover-light, #929292)', - 'vera-tertiary-hover-dark': 'var(--vera-tertiary-hover-dark, #B3B3B3)', - 'vera-text-disabled': 'var(--vera-text-disabled, #B3B3B3)', - 'vera-text-disabled-light': 'var(--vera-text-disabled-light, #B3B3B3)', - 'vera-text-disabled-dark': 'var(--vera-text-disabled-dark, #666666)', - 'vera-text-primary': 'var(--vera-text-primary, #9941FF)', - 'vera-text-primary-light': 'var(--vera-text-primary-light, #9941FF)', - 'vera-text-primary-dark': 'var(--vera-text-primary-dark, #B27BF2)', - 'vera-text-secondary': 'var(--vera-text-secondary, #000000)', - 'vera-text-secondary-light': 'var(--vera-text-secondary-light, #000000)', - 'vera-text-secondary-dark': 'var(--vera-text-secondary-dark, #FFFFFF)', - 'vera-text-tertiary': 'var(--vera-text-tertiary, #757575)', - 'vera-text-tertiary-light': 'var(--vera-text-tertiary-light, #757575)', - 'vera-text-tertiary-dark': 'var(--vera-text-tertiary-dark, #B3B3B3)', - 'vera-warning': 'var(--vera-warning, #BE5702)', - 'vera-warning-light': 'var(--vera-warning-light, #BE5702)', - 'vera-warning-dark': 'var(--vera-warning-dark, #FA9F00)', - 'vera-warning-hover': 'var(--vera-warning-hover, #A64C03)', - 'vera-warning-hover-light': 'var(--vera-warning-hover-light, #A64C03)', - 'vera-warning-hover-dark': 'var(--vera-warning-hover-dark, #FACC4B)', - }, - fontFamily: { - 'vera-plain': [ - 'Inter', - 'sans-serif', - 'system-ui', - 'ui-sans-serif', - 'Marker Felt', - 'Trebuchet MS', - ], + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-caption-semibold-font-weight, 600)', }, - screens: { - 'vera-mobile': { - max: '767px', + }; + + addUtilities(fontSizeUtilities); + addUtilities(fontWeightUtilities); + }, + { + theme: { + extend: { + borderRadius: { + 'vera-extra-large': 'var(--vera-border-radius-extra-large, 24px)', + 'vera-extra-small': 'var(--vera-border-radius-extra-small, 2px)', + 'vera-large': 'var(--vera-border-radius-large, 12px)', + 'vera-medium': 'var(--vera-border-radius-medium, 8px)', + 'vera-none': 'var(--vera-border-radius-none, 0px)', + 'vera-small': 'var(--vera-border-radius-small, 4px)', + }, + colors: { + 'vera-accent': 'var(--vera-accent, #FFFFFF)', + 'vera-accent-light': 'var(--vera-accent-light, #FFFFFF)', + 'vera-accent-dark': 'var(--vera-accent-dark, #FFFFFF)', + 'vera-alert-background': 'var(--vera-alert-background, #FFEEF2)', + 'vera-alert-background-light': 'var(--vera-alert-background-light, #FFEEF2)', + 'vera-alert-background-dark': 'var(--vera-alert-background-dark, #3E0004)', + 'vera-alert-background-hover': 'var(--vera-alert-background-hover, #FEDFDF)', + 'vera-alert-background-hover-light': + 'var(--vera-alert-background-hover-light, #FEDFDF)', + 'vera-alert-background-hover-dark': 'var(--vera-alert-background-hover-dark, #6E0000)', + 'vera-alert-text': 'var(--vera-alert-text, #CD0000)', + 'vera-alert-text-light': 'var(--vera-alert-text-light, #CD0000)', + 'vera-alert-text-dark': 'var(--vera-alert-text-dark, #FEDFDF)', + 'vera-background': 'var(--vera-background, #F5F0FD)', + 'vera-background-light': 'var(--vera-background-light, #F5F0FD)', + 'vera-background-dark': 'var(--vera-background-dark, #26044D)', + 'vera-border': 'var(--vera-border, #E6E6E6)', + 'vera-border-light': 'var(--vera-border-light, #E6E6E6)', + 'vera-border-dark': 'var(--vera-border-dark, #333333)', + 'vera-dark-background': 'var(--vera-dark-background, #202124)', + 'vera-dark-background-light': 'var(--vera-dark-background-light, #202124)', + 'vera-dark-background-dark': 'var(--vera-dark-background-dark, #202124)', + 'vera-dark-grey': 'var(--vera-dark-grey, #333333)', + 'vera-dark-grey-light': 'var(--vera-dark-grey-light, #333333)', + 'vera-dark-grey-dark': 'var(--vera-dark-grey-dark, #333333)', + 'vera-dark-grey-hover': 'var(--vera-dark-grey-hover, #292828)', + 'vera-dark-grey-hover-light': 'var(--vera-dark-grey-hover-light, #292828)', + 'vera-dark-grey-hover-dark': 'var(--vera-dark-grey-hover-dark, #292828)', + 'vera-dark-grey-opacity': 'var(--vera-dark-grey-opacity, #333333CD)', + 'vera-dark-grey-opacity-light': 'var(--vera-dark-grey-opacity-light, #333333CD)', + 'vera-dark-grey-opacity-dark': 'var(--vera-dark-grey-opacity-dark, #333333CD)', + 'vera-disabled': 'var(--vera-disabled, #E6E6E6)', + 'vera-disabled-light': 'var(--vera-disabled-light, #E6E6E6)', + 'vera-disabled-dark': 'var(--vera-disabled-dark, #333333)', + 'vera-error': 'var(--vera-error, #E61D1D)', + 'vera-error-light': 'var(--vera-error-light, #E61D1D)', + 'vera-error-dark': 'var(--vera-error-dark, #F75959)', + 'vera-error-hover': 'var(--vera-error-hover, #CD0000)', + 'vera-error-hover-light': 'var(--vera-error-hover-light, #CD0000)', + 'vera-error-hover-dark': 'var(--vera-error-hover-dark, #FE9696)', + 'vera-information': 'var(--vera-information, #0276D5)', + 'vera-information-light': 'var(--vera-information-light, #0276D5)', + 'vera-information-dark': 'var(--vera-information-dark, #2997F0)', + 'vera-information-background': 'var(--vera-information-background, #E8F4FB)', + 'vera-information-background-light': + 'var(--vera-information-background-light, #E8F4FB)', + 'vera-information-background-dark': 'var(--vera-information-background-dark, #E8F4FB)', + 'vera-information-hover': 'var(--vera-information-hover, #2997F0)', + 'vera-information-hover-light': 'var(--vera-information-hover-light, #2997F0)', + 'vera-information-hover-dark': 'var(--vera-information-hover-dark, #0276D5)', + 'vera-on-accent': 'var(--vera-on-accent, #000000)', + 'vera-on-accent-light': 'var(--vera-on-accent-light, #000000)', + 'vera-on-accent-dark': 'var(--vera-on-accent-dark, #000000)', + 'vera-on-background': 'var(--vera-on-background, #757575)', + 'vera-on-background-light': 'var(--vera-on-background-light, #757575)', + 'vera-on-background-dark': 'var(--vera-on-background-dark, #B3B3B3)', + 'vera-on-dark-grey': 'var(--vera-on-dark-grey, #FFFFFF)', + 'vera-on-dark-grey-light': 'var(--vera-on-dark-grey-light, #FFFFFF)', + 'vera-on-dark-grey-dark': 'var(--vera-on-dark-grey-dark, #FFFFFF)', + 'vera-on-error': 'var(--vera-on-error, #FFFFFF)', + 'vera-on-error-light': 'var(--vera-on-error-light, #FFFFFF)', + 'vera-on-error-dark': 'var(--vera-on-error-dark, #000000)', + 'vera-on-information': 'var(--vera-on-information, #FFFFFF)', + 'vera-on-information-light': 'var(--vera-on-information-light, #FFFFFF)', + 'vera-on-information-dark': 'var(--vera-on-information-dark, #FFFFFF)', + 'vera-on-primary': 'var(--vera-on-primary, #FFFFFF)', + 'vera-on-primary-light': 'var(--vera-on-primary-light, #FFFFFF)', + 'vera-on-primary-dark': 'var(--vera-on-primary-dark, #000000)', + 'vera-on-secondary': 'var(--vera-on-secondary, #FFFFFF)', + 'vera-on-secondary-light': 'var(--vera-on-secondary-light, #FFFFFF)', + 'vera-on-secondary-dark': 'var(--vera-on-secondary-dark, #000000)', + 'vera-on-success': 'var(--vera-on-success, #FFFFFF)', + 'vera-on-success-light': 'var(--vera-on-success-light, #FFFFFF)', + 'vera-on-success-dark': 'var(--vera-on-success-dark, #000000)', + 'vera-on-surface': 'var(--vera-on-surface, #929292)', + 'vera-on-surface-light': 'var(--vera-on-surface-light, #929292)', + 'vera-on-surface-dark': 'var(--vera-on-surface-dark, #FFFFFF)', + 'vera-on-tertiary': 'var(--vera-on-tertiary, #FFFFFF)', + 'vera-on-tertiary-light': 'var(--vera-on-tertiary-light, #FFFFFF)', + 'vera-on-tertiary-dark': 'var(--vera-on-tertiary-dark, #000000)', + 'vera-on-warning': 'var(--vera-on-warning, #FFFFFF)', + 'vera-on-warning-light': 'var(--vera-on-warning-light, #FFFFFF)', + 'vera-on-warning-dark': 'var(--vera-on-warning-dark, #000000)', + 'vera-primary': 'var(--vera-primary, #9941FF)', + 'vera-primary-light': 'var(--vera-primary-light, #9941FF)', + 'vera-primary-dark': 'var(--vera-primary-dark, #B27BF2)', + 'vera-primary-hover': 'var(--vera-primary-hover, #871EFF)', + 'vera-primary-hover-light': 'var(--vera-primary-hover-light, #871EFF)', + 'vera-primary-hover-dark': 'var(--vera-primary-hover-dark, #CBA1FA)', + 'vera-secondary': 'var(--vera-secondary, #000000)', + 'vera-secondary-light': 'var(--vera-secondary-light, #000000)', + 'vera-secondary-dark': 'var(--vera-secondary-dark, #FFFFFF)', + 'vera-secondary-hover': 'var(--vera-secondary-hover, #666666)', + 'vera-secondary-hover-light': 'var(--vera-secondary-hover-light, #666666)', + 'vera-secondary-hover-dark': 'var(--vera-secondary-hover-dark, #929292)', + 'vera-skeleton-like': 'var(--vera-skeleton-like, #B3B3B3)', + 'vera-skeleton-like-light': 'var(--vera-skeleton-like-light, #B3B3B3)', + 'vera-skeleton-like-dark': 'var(--vera-skeleton-like-dark, #333333)', + 'vera-success': 'var(--vera-success, #1C8731)', + 'vera-success-light': 'var(--vera-success-light, #1C8731)', + 'vera-success-dark': 'var(--vera-success-dark, #30A849)', + 'vera-success-hover': 'var(--vera-success-hover, #1F7629)', + 'vera-success-hover-light': 'var(--vera-success-hover-light, #1F7629)', + 'vera-success-hover-dark': 'var(--vera-success-hover-dark, #53CA6A)', + 'vera-surface': 'var(--vera-surface, #FFFFFF)', + 'vera-surface-light': 'var(--vera-surface-light, #FFFFFF)', + 'vera-surface-dark': 'var(--vera-surface-dark, #000000)', + 'vera-tertiary': 'var(--vera-tertiary, #757575)', + 'vera-tertiary-light': 'var(--vera-tertiary-light, #757575)', + 'vera-tertiary-dark': 'var(--vera-tertiary-dark, #B3B3B3)', + 'vera-tertiary-hover': 'var(--vera-tertiary-hover, #929292)', + 'vera-tertiary-hover-light': 'var(--vera-tertiary-hover-light, #929292)', + 'vera-tertiary-hover-dark': 'var(--vera-tertiary-hover-dark, #B3B3B3)', + 'vera-text-disabled': 'var(--vera-text-disabled, #B3B3B3)', + 'vera-text-disabled-light': 'var(--vera-text-disabled-light, #B3B3B3)', + 'vera-text-disabled-dark': 'var(--vera-text-disabled-dark, #666666)', + 'vera-text-primary': 'var(--vera-text-primary, #9941FF)', + 'vera-text-primary-light': 'var(--vera-text-primary-light, #9941FF)', + 'vera-text-primary-dark': 'var(--vera-text-primary-dark, #B27BF2)', + 'vera-text-secondary': 'var(--vera-text-secondary, #000000)', + 'vera-text-secondary-light': 'var(--vera-text-secondary-light, #000000)', + 'vera-text-secondary-dark': 'var(--vera-text-secondary-dark, #FFFFFF)', + 'vera-text-tertiary': 'var(--vera-text-tertiary, #757575)', + 'vera-text-tertiary-light': 'var(--vera-text-tertiary-light, #757575)', + 'vera-text-tertiary-dark': 'var(--vera-text-tertiary-dark, #B3B3B3)', + 'vera-warning': 'var(--vera-warning, #BE5702)', + 'vera-warning-light': 'var(--vera-warning-light, #BE5702)', + 'vera-warning-dark': 'var(--vera-warning-dark, #FA9F00)', + 'vera-warning-hover': 'var(--vera-warning-hover, #A64C03)', + 'vera-warning-hover-light': 'var(--vera-warning-hover-light, #A64C03)', + 'vera-warning-hover-dark': 'var(--vera-warning-hover-dark, #FACC4B)', }, - 'vera-desktop': { - min: '768px', + fontFamily: { + 'vera-plain': [ + 'var(--vera-font-family-plain, Inter, sans-serif, system-ui, ui-sans-serif, Marker Felt, Trebuchet MS)', + ], + }, + screens: { + 'vera-mobile': { + max: '767px', + }, + 'vera-desktop': { + min: '768px', + }, }, }, }, - }, - } -); + } + ); +}; veraUI.safelist = ['vera-dark-mode']; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/veraUI.types.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/veraUI.types.ts new file mode 100644 index 00000000..d3033c75 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/veraUI.types.ts @@ -0,0 +1,244 @@ +export type VeraTypographyTokenKey = + | 'headline' + | 'subtitle' + | 'heading-1' + | 'heading-2' + | 'heading-3' + | 'heading-4' + | 'body-extended' + | 'body-extended-semibold' + | 'body-base' + | 'body-base-semibold' + | 'caption' + | 'caption-semibold'; + +type VeraTypographyPropertyKey = + | 'font-size' + | 'line-height' + | 'font-weight' + | 'mobile-font-size' + | 'mobile-line-height' + | 'mobile-font-weight'; + +export type VeraTypographyCssVariable = + `--vera-typography-${VeraTypographyTokenKey}-${VeraTypographyPropertyKey}`; + +export type VeraTypographyVariableNamesByToken = { + fontSize: VeraTypographyCssVariable; + lineHeight: VeraTypographyCssVariable; + fontWeight: VeraTypographyCssVariable; +}; + +export const veraTypographyCssVariableNames: Record< + VeraTypographyTokenKey, + VeraTypographyVariableNamesByToken +> = { + headline: { + fontSize: '--vera-typography-headline-font-size', + lineHeight: '--vera-typography-headline-line-height', + fontWeight: '--vera-typography-headline-font-weight', + }, + subtitle: { + fontSize: '--vera-typography-subtitle-font-size', + lineHeight: '--vera-typography-subtitle-line-height', + fontWeight: '--vera-typography-subtitle-font-weight', + }, + 'heading-1': { + fontSize: '--vera-typography-heading-1-font-size', + lineHeight: '--vera-typography-heading-1-line-height', + fontWeight: '--vera-typography-heading-1-font-weight', + }, + 'heading-2': { + fontSize: '--vera-typography-heading-2-font-size', + lineHeight: '--vera-typography-heading-2-line-height', + fontWeight: '--vera-typography-heading-2-font-weight', + }, + 'heading-3': { + fontSize: '--vera-typography-heading-3-font-size', + lineHeight: '--vera-typography-heading-3-line-height', + fontWeight: '--vera-typography-heading-3-font-weight', + }, + 'heading-4': { + fontSize: '--vera-typography-heading-4-font-size', + lineHeight: '--vera-typography-heading-4-line-height', + fontWeight: '--vera-typography-heading-4-font-weight', + }, + 'body-extended': { + fontSize: '--vera-typography-body-extended-font-size', + lineHeight: '--vera-typography-body-extended-line-height', + fontWeight: '--vera-typography-body-extended-font-weight', + }, + 'body-extended-semibold': { + fontSize: '--vera-typography-body-extended-semibold-font-size', + lineHeight: '--vera-typography-body-extended-semibold-line-height', + fontWeight: '--vera-typography-body-extended-semibold-font-weight', + }, + 'body-base': { + fontSize: '--vera-typography-body-base-font-size', + lineHeight: '--vera-typography-body-base-line-height', + fontWeight: '--vera-typography-body-base-font-weight', + }, + 'body-base-semibold': { + fontSize: '--vera-typography-body-base-semibold-font-size', + lineHeight: '--vera-typography-body-base-semibold-line-height', + fontWeight: '--vera-typography-body-base-semibold-font-weight', + }, + caption: { + fontSize: '--vera-typography-caption-font-size', + lineHeight: '--vera-typography-caption-line-height', + fontWeight: '--vera-typography-caption-font-weight', + }, + 'caption-semibold': { + fontSize: '--vera-typography-caption-semibold-font-size', + lineHeight: '--vera-typography-caption-semibold-line-height', + fontWeight: '--vera-typography-caption-semibold-font-weight', + }, +}; + +export type VeraLayoutCssVariable = + | '--vera-border-radius-none' + | '--vera-border-radius-extra-small' + | '--vera-border-radius-small' + | '--vera-border-radius-medium' + | '--vera-border-radius-large' + | '--vera-border-radius-extra-large'; +export type VeraFontCssVariable = '--vera-font-family-plain'; + +export type VeraColorCssVariable = + | '--vera-primary' + | '--vera-on-primary' + | '--vera-primary-dark' + | '--vera-primary-light' + | '--vera-primary-hover' + | '--vera-secondary' + | '--vera-on-secondary' + | '--vera-secondary-dark' + | '--vera-secondary-light' + | '--vera-tertiary' + | '--vera-on-tertiary' + | '--vera-tertiary-dark' + | '--vera-tertiary-light' + | '--vera-success' + | '--vera-on-success' + | '--vera-success-hover' + | '--vera-success-light' + | '--vera-warning' + | '--vera-on-warning' + | '--vera-warning-hover' + | '--vera-warning-light' + | '--vera-error' + | '--vera-on-error' + | '--vera-error-hover' + | '--vera-error-light' + | '--vera-background' + | '--vera-surface' + | '--vera-on-surface' + | '--vera-on-background' + | '--vera-text-primary' + | '--vera-text-secondary' + | '--vera-text-tertiary' + | '--vera-border' + | '--vera-disabled'; + +export type VeraCssVariable = + | VeraLayoutCssVariable + | VeraFontCssVariable + | VeraColorCssVariable + | VeraTypographyCssVariable; + +type VeraTypographyProperties = Partial<{ + fontSize: string; + lineHeight: string; + fontWeight: string; + mobileFontSize: string; + mobileLineHeight: string; + mobileFontWeight: string; +}>; + +type VeraColorProperties = Partial<{ + accent: string; + alertBackground: string; + alertBackgroundHover: string; + alertText: string; + background: string; + border: string; + darkBackground: string; + darkGrey: string; + darkGreyHover: string; + darkGreyOpacity: string; + disabled: string; + error: string; + errorHover: string; + information: string; + informationBackground: string; + informationHover: string; + onAccent: string; + onBackground: string; + onDarkGrey: string; + onError: string; + onInformation: string; + onPrimary: string; + onSecondary: string; + onSuccess: string; + onSurface: string; + onTertiary: string; + onWarning: string; + primary: string; + primaryHover: string; + secondary: string; + secondaryHover: string; + skeletonLike: string; + success: string; + successHover: string; + surface: string; + tertiary: string; + tertiaryHover: string; + textDisabled: string; + textPrimary: string; + textSecondary: string; + textTertiary: string; + warning: string; + warningHover: string; +}>; + +/** + * Configuration for the veraUI Tailwind plugin. + * Allows overriding design tokens for colors, typography, border radius, and font family. + * All tokens are optional and will fall back to design system defaults. + * + * @example + * // Using default values + * plugins: [veraUI()] + * + * @example + * // Overriding specific tokens + * plugins: [veraUI({ + * light: { primary: '#FF5733', accent: '#00FF00' }, + * dark: { primary: '#AA2211', accent: '#00AA00' }, + * borderRadiusMedium: '12px', + * headline: { fontSize: '5rem' }, + * })] + */ +export type VeraUIConfig = { + light?: VeraColorProperties; + dark?: VeraColorProperties; + borderRadiusNone?: string; + borderRadiusExtraSmall?: string; + borderRadiusSmall?: string; + borderRadiusMedium?: string; + borderRadiusLarge?: string; + borderRadiusExtraLarge?: string; + fontFamilyPlain?: string; + headline?: VeraTypographyProperties; + subtitle?: VeraTypographyProperties; + heading1?: VeraTypographyProperties; + heading2?: VeraTypographyProperties; + heading3?: VeraTypographyProperties; + heading4?: VeraTypographyProperties; + bodyExtended?: VeraTypographyProperties; + bodyExtendedSemibold?: VeraTypographyProperties; + bodyBase?: VeraTypographyProperties; + bodyBaseSemibold?: VeraTypographyProperties; + caption?: VeraTypographyProperties; + captionSemibold?: VeraTypographyProperties; +}; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia.test.ts index c1ae9f7a..c5e6d940 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia.test.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia.test.ts @@ -8,7 +8,6 @@ describe('useSynchronizeThemeAndMedia', () => { }); it('should set initial light mode classes and subscribe to media changes', () => { - const setTokens = vi.fn(); const addEventListenerSpy = vi.fn(); const matchMediaMock = vi.fn().mockReturnValue({ matches: false, @@ -17,7 +16,7 @@ describe('useSynchronizeThemeAndMedia', () => { vi.spyOn(window, 'matchMedia').mockImplementation(matchMediaMock); - renderHook(() => useSynchronizeThemeAndMedia({ setTokens })); + renderHook(() => useSynchronizeThemeAndMedia()); expect(document.documentElement.classList.contains('vera-dark-mode')).toBe(false); expect(document.documentElement.classList.contains('dark')).toBe(false); @@ -30,7 +29,6 @@ describe('useSynchronizeThemeAndMedia', () => { }); it('should set initial dark mode classes when media prefers dark', () => { - const setTokens = vi.fn(); const matchMediaMock = vi.fn().mockReturnValue({ matches: true, addEventListener: vi.fn(), @@ -38,41 +36,44 @@ describe('useSynchronizeThemeAndMedia', () => { vi.spyOn(window, 'matchMedia').mockImplementation(matchMediaMock); - renderHook(() => useSynchronizeThemeAndMedia({ setTokens })); + renderHook(() => useSynchronizeThemeAndMedia()); expect(document.documentElement.classList.contains('vera-dark-mode')).toBe(true); expect(document.documentElement.classList.contains('dark')).toBe(true); }); - it('should call setTokens when media query changes', () => { - const setTokens = vi.fn(); - let changeHandler: (() => void) | undefined; + it('should synchronize classes when media query changes', () => { + let isDarkModeEnabled = false; + let changeHandler: ((event: MediaQueryListEvent) => void) | undefined; const addEventListenerSpy = vi.fn((event, handler) => { if (event === 'change') { changeHandler = handler; } }); - const matchMediaMock = vi.fn().mockReturnValue({ - matches: false, + const matchMediaMock = vi.fn().mockImplementation(() => ({ + matches: isDarkModeEnabled, addEventListener: addEventListenerSpy, - }); + })); vi.spyOn(window, 'matchMedia').mockImplementation(matchMediaMock); - renderHook(() => useSynchronizeThemeAndMedia({ setTokens })); + renderHook(() => useSynchronizeThemeAndMedia()); - // Change to dark mode - matchMediaMock.mockReturnValue({ matches: true, addEventListener: vi.fn() }); - changeHandler!(); + isDarkModeEnabled = true; + changeHandler!({ matches: true } as MediaQueryListEvent); - expect(setTokens).toHaveBeenCalled(); expect(document.documentElement.classList.contains('vera-dark-mode')).toBe(true); expect(document.documentElement.classList.contains('dark')).toBe(true); + + isDarkModeEnabled = false; + changeHandler!({ matches: false } as MediaQueryListEvent); + + expect(document.documentElement.classList.contains('vera-dark-mode')).toBe(false); + expect(document.documentElement.classList.contains('dark')).toBe(false); }); it('should cleanup by aborting the controller', () => { - const setTokens = vi.fn(); const abortController = new AbortController(); const abortSpy = vi.spyOn(abortController, 'abort'); const addEventListenerSpy = vi.fn(); @@ -86,7 +87,7 @@ describe('useSynchronizeThemeAndMedia', () => { vi.spyOn(window, 'matchMedia').mockImplementation(matchMediaMock); - const { unmount } = renderHook(() => useSynchronizeThemeAndMedia({ setTokens })); + const { unmount } = renderHook(() => useSynchronizeThemeAndMedia()); unmount(); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia.ts index 2005695b..2fdb3eca 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia.ts @@ -1,17 +1,10 @@ -import React from 'react'; import isDarkMode from '../../helpers/isDarkMode'; -import getTokensByMode from '../../helpers/getTokensByMode'; -import type { Theme } from '@ui/theme'; import useStableRef from '@web/hooks/useStableRef'; import useMountEffect from '@web/hooks/useMountEffect'; const VERA_DARK_MODE_CLASSES = ['vera-dark-mode', 'dark']; -const useSynchronizeThemeAndMedia = ({ - setTokens, -}: { - setTokens: React.Dispatch>; -}) => { +const useSynchronizeThemeAndMedia = () => { const modeRef = useStableRef<'light' | 'dark'>(isDarkMode() ? 'dark' : 'light'); useMountEffect(() => { @@ -26,20 +19,19 @@ const useSynchronizeThemeAndMedia = ({ if (mode === 'dark') { documentElement.classList.add(...VERA_DARK_MODE_CLASSES); - } else { - documentElement.classList.remove(...VERA_DARK_MODE_CLASSES); + return; } + + documentElement.classList.remove(...VERA_DARK_MODE_CLASSES); }; const toggleTheme = () => { const newMode = isDarkMode() ? 'dark' : 'light'; const didChange = modeRef.current !== newMode; - if (!didChange) { - return; - } + if (!didChange) return; - setTokens(getTokensByMode(newMode)); + modeRef.current = newMode; setDocumentMode(newMode); }; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/index.ts deleted file mode 100644 index 9c47c391..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './useTheme'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/useTheme.test.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/useTheme.test.tsx deleted file mode 100644 index 7cddddce..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/useTheme.test.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { renderHook } from '@testing-library/react'; -import { ReactNode } from 'react'; -import { describe, it, expect } from 'vitest'; -import { ThemeProvider } from '../../themeContext'; -import useTheme from '.'; - -describe('useTheme', () => { - it('should return colors object with all color tokens', () => { - const wrapper = ({ children }: { children: ReactNode }) => ( - {children} - ); - - const { result } = renderHook(() => useTheme(), { wrapper }); - - expect(result.current.colors).toBeDefined(); - expect(result.current.colors.primary).toBeDefined(); - expect(result.current.colors.secondary).toBeDefined(); - expect(result.current.colors.tertiary).toBeDefined(); - expect(result.current.colors.background).toBeDefined(); - expect(result.current.colors.surface).toBeDefined(); - expect(result.current.colors.error).toBeDefined(); - expect(result.current.colors.warning).toBeDefined(); - expect(result.current.colors.success).toBeDefined(); - }); - - it('should return shapes object with all border radius tokens', () => { - const wrapper = ({ children }: { children: ReactNode }) => ( - {children} - ); - - const { result } = renderHook(() => useTheme(), { wrapper }); - - expect(result.current.shapes).toBeDefined(); - expect(result.current.shapes.borderRadiusNone).toBeDefined(); - expect(result.current.shapes.borderRadiusExtraSmall).toBeDefined(); - expect(result.current.shapes.borderRadiusSmall).toBeDefined(); - expect(result.current.shapes.borderRadiusMedium).toBeDefined(); - expect(result.current.shapes.borderRadiusLarge).toBeDefined(); - expect(result.current.shapes.borderRadiusExtraLarge).toBeDefined(); - }); - - it('should return numeric values for border radius', () => { - const wrapper = ({ children }: { children: ReactNode }) => ( - {children} - ); - - const { result } = renderHook(() => useTheme(), { wrapper }); - - expect(typeof result.current.shapes.borderRadiusNone).toBe('string'); - expect(typeof result.current.shapes.borderRadiusMedium).toBe('string'); - }); - - it('should return hex color strings', () => { - const wrapper = ({ children }: { children: ReactNode }) => ( - {children} - ); - - const { result } = renderHook(() => useTheme(), { wrapper }); - - expect(typeof result.current.colors.primary).toBe('string'); - expect(result.current.colors.primary).toMatch(/^#[0-9A-F]{6}$/i); - }); -}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/useTheme.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/useTheme.ts deleted file mode 100644 index 56a01e46..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/useTheme.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { useContext } from 'react'; -import themeContext from '../../themeContext'; - -const useTheme = () => { - const customTheme = useContext(themeContext); - - if (!customTheme) { - throw new Error('useTheme must be used within a ThemeProvider'); - } - - return customTheme; -}; - -export default useTheme; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/index.ts index ee3dbf4a..0d643b30 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/index.ts @@ -1,3 +1,2 @@ -export type * from './themeContext.types'; -export { ThemeProvider } from './themeContext'; -export { default } from './hooks/useTheme'; +export type * from './ThemeProvider.types'; +export { ThemeProvider, type ThemeProviderProps } from './ThemeProvider'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/themeContext.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/themeContext.tsx deleted file mode 100644 index 489019ad..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/themeContext.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { ThemeProvider as ThemeProviderBase, CssBaseline } from '@mui/material'; -import React, { PropsWithChildren, useMemo, useState } from 'react'; -import getTokensByMode from './helpers/getTokensByMode'; -import isDarkMode from './helpers/isDarkMode'; -import useSynchronizeThemeAndMedia from './hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia'; -import getMuiCustomTheme, { GetMuiCustomThemeProps } from './helpers/getMuiCustomTheme'; -import Theme, { PartialTheme } from './themeContext.types'; -import { mergeThemeConfigurations } from './helpers/mergeThemeConfigurations'; - -const defaultLightValue: Theme = getTokensByMode('light'); -const defaultDarkValue: Theme = getTokensByMode('dark'); - -const themeContext = React.createContext(defaultLightValue); - -export type ThemeProviderPropsBase = { - theme?: { - lightMode: PartialTheme; - darkMode?: PartialTheme; - base?: Omit; - }; -}; - -export type ThemeProviderProps = PropsWithChildren; - -export const ThemeProvider: React.FC = ({ children, theme }) => { - const themeSource: { - light: Theme; - dark: Theme; - } = useMemo(() => { - return { - light: mergeThemeConfigurations({ - defaultValue: defaultLightValue, - overrides: theme?.lightMode ?? {}, - }), - dark: mergeThemeConfigurations({ - defaultValue: defaultDarkValue, - overrides: theme?.darkMode ?? {}, - }), - }; - }, [theme]); - - const [tokens, setTokens] = useState(() => { - return isDarkMode() ? themeSource.dark : themeSource.light; - }); - - const muiTheme = useMemo( - () => getMuiCustomTheme({ ...theme?.base, tokens }), - [tokens, theme?.base] - ); - - useSynchronizeThemeAndMedia({ setTokens }); - - return ( - - - {children} - - ); -}; - -export default themeContext; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tailwind.config.cjs b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tailwind.config.cjs index 22902029..4d98b088 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tailwind.config.cjs +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tailwind.config.cjs @@ -1,5 +1,7 @@ // eslint-disable-next-line @typescript-eslint/no-require-imports const veraUI = require('./src/theme/helpers/tailwind/veraUI.cjs'); +// eslint-disable-next-line @typescript-eslint/no-require-imports +const designTokens = require('../../designTokens.json'); const config = { darkMode: 'class', @@ -15,7 +17,7 @@ const config = { }, // classes to always allow even if not found in files safelist: [...veraUI.safelist], - plugins: [veraUI], + plugins: [veraUI(designTokens)], }; module.exports = config; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.json b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.json index 2f37cdc0..ff69e0e3 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.json @@ -19,7 +19,13 @@ "@web-test": ["../common/testBrowser"], "@web-test/*": ["../common/testBrowser/*"], "@core": ["../core/src"], - "@core/*": ["../core/src/*"] + "@core/*": ["../core/src/*"], + "@core-test": ["../core/test"], + "@core-test/*": ["../core/test/*"], + + // video-router paths (this is just for linter and types) + "@api-lib/*": ["../api/src/*"], + "@node/*": ["../common/srcNode/*"] }, "lib": ["DOM", "DOM.Iterable", "ESNext"] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.lib.json b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.lib.json index 8399b3f7..d6183c3e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.lib.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.lib.json @@ -22,7 +22,18 @@ "../common/testBrowser/**/*.ts", "../common/testBrowser/**/*.tsx", "../core/src/**/*.ts", - "../core/src/**/*.tsx" + "../core/src/**/*.tsx", + + // video-router(this is just for linter and types) + "../api/src/**/*.ts", + "../common/srcNode/**/*.ts" ], - "exclude": ["**/*.spec.*", "**/*.test.*"] + "exclude": [ + "**/*.spec.*", + "**/*.test.*", + "../api/**/*.test.*", + "../api/**/*.spec.*", + "../core/**/*.test.*", + "../core/**/*.spec.*" + ] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.spec.json b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.spec.json index 225d06b0..b08c0035 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.spec.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.spec.json @@ -19,6 +19,8 @@ "src/**/*.ts", "src/**/*.tsx", "../common/test/**/*.ts", + "../common/testBrowser/**/*.ts", + "../common/srcBrowser/**/*.ts", "../core/src/**/*.ts" ] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/vite.config.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/vite.config.ts index 00ae86c3..87a4c343 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/vite.config.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/vite.config.ts @@ -60,6 +60,13 @@ export default defineConfig(() => ({ reportsDirectory: './coverage', provider: 'v8' as const, reporter: ['text', 'lcov'], + allowExternal: true, + include: [ + `${path.resolve(__dirname, 'src')}/**/*.{ts,tsx}`, + `${path.resolve(__dirname, '../common/src')}/**/*.{ts,tsx}`, + `${path.resolve(__dirname, '../common/srcBrowser')}/**/*.{ts,tsx}`, + `${path.resolve(__dirname, '../core/src')}/**/*.{ts,tsx}`, + ], exclude: ['test/**', '**/index.ts'], }, }, diff --git a/tutorials/vonage_video_react_app-feature-config/project/nx.json b/tutorials/vonage_video_react_app-feature-config/project/nx.json index acad1a99..d2d54ed9 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/nx.json +++ b/tutorials/vonage_video_react_app-feature-config/project/nx.json @@ -93,5 +93,6 @@ "unitTestRunner": "jest" } } - } + }, + "analytics": false } diff --git a/tutorials/vonage_video_react_app-feature-config/project/package-lock.json b/tutorials/vonage_video_react_app-feature-config/project/package-lock.json new file mode 100644 index 00000000..b7909b61 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/package-lock.json @@ -0,0 +1,26680 @@ +{ + "name": "vonage-video-react-app", + "version": "1.4.2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vonage-video-react-app", + "version": "1.4.2", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@emotion/css": "11.13.5", + "@emotion/react": "11.14.0", + "@emotion/styled": "11.14.1", + "@mui/icons-material": "9.0.0", + "@mui/material": "9.0.0", + "@tanstack/react-query": "5.99.0", + "@trpc/client": "11.11.0", + "@trpc/server": "11.11.0", + "@vonage/auth": "1.14.0", + "@vonage/client-sdk-video": "2.34.0", + "@vonage/server-sdk": "3.25.1", + "@vonage/vcr-sdk": "1.3.0", + "@vonage/video": "1.26.1", + "@vonage/video-client-network-test": "5.0.0", + "@vonage/vivid": "5.15.1", + "autolinker": "4.1.5", + "axios": "1.16.0", + "body-parser": "1.20.4", + "classnames": "2.5.1", + "cors": "2.8.6", + "dotenv": "16.6.1", + "easy-cancelable-promise": "2.0.1", + "events": "3.3.0", + "express": "4.22.1", + "form-data": "4.0.5", + "i18next": "25.8.8", + "i18next-browser-languagedetector": "8.2.1", + "json-storage-formatter": "3.0.2", + "jsonwebtoken": "9.0.3", + "motion": "12.38.0", + "normalize-range": "0.1.2", + "opentok": "2.22.0", + "opentok-jwt": "0.1.5", + "opentok-layout-js": "5.5.0", + "opentok-solutions-logging": "1.1.5", + "react": "19.2.4", + "react-dom": "19.2.4", + "react-global-state-hooks": "15.0.15", + "react-i18next": "15.7.4", + "react-router-dom": "6.30.3", + "react-syntax-highlighter": "16.1.1", + "resize-observer-polyfill": "1.5.1", + "status-code-enum": "1.0.0", + "tailwind-merge": "3.4.1", + "tailwind-variants": "3.2.2", + "ua-parser-js": "1.0.41", + "uuid": "9.0.1", + "zod": "4.3.6" + }, + "devDependencies": { + "@cspell/eslint-plugin": "9.6.4", + "@eslint/js": "9.39.2", + "@jest/globals": "29.7.0", + "@nx/eslint": "22.0.1", + "@nx/eslint-plugin": "22.5.1", + "@nx/jest": "22.0.1", + "@nx/js": "22.0.1", + "@nx/node": "22.0.1", + "@nx/react": "22.5.1", + "@nx/vite": "22.5.1", + "@playwright/test": "1.46.0", + "@rollup/plugin-replace": "5.0.7", + "@storybook/react": "10.3.5", + "@storybook/react-vite": "10.3.5", + "@tailwindcss/vite": "4.1.18", + "@testing-library/dom": "10.4.0", + "@testing-library/jest-dom": "6.9.1", + "@testing-library/react": "16.3.0", + "@testing-library/user-event": "14.6.1", + "@types/body-parser": "1.19.6", + "@types/cors": "2.8.19", + "@types/express": "4.17.25", + "@types/jest": "29.5.14", + "@types/jsonwebtoken": "9.0.10", + "@types/node": "20.19.9", + "@types/opentok": "2.14.4", + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3", + "@types/react-syntax-highlighter": "15.5.13", + "@types/supertest": "6.0.3", + "@types/ua-parser-js": "0.7.39", + "@typescript-eslint/eslint-plugin": "8.55.0", + "@typescript-eslint/parser": "8.55.0", + "@vitejs/plugin-react": "5.1.4", + "@vitejs/plugin-react-swc": "4.2.3", + "@vitest/coverage-v8": "1.6.1", + "@vitest/ui": "1.6.1", + "concurrently": "9.2.1", + "copy-webpack-plugin": "13.0.1", + "eslint": "8.57.1", + "eslint-config-prettier": "10.1.8", + "eslint-import-resolver-node": "0.3.9", + "eslint-import-resolver-typescript": "4.4.4", + "eslint-plugin-filename-rules": "1.3.1", + "eslint-plugin-import": "2.32.0", + "eslint-plugin-jsx-a11y": "6.10.1", + "eslint-plugin-prettier": "5.5.5", + "eslint-plugin-react": "7.37.5", + "eslint-plugin-react-hooks": "7.0.1", + "eslint-plugin-react-refresh": "0.4.26", + "eslint-plugin-tailwindcss": "4.0.0-beta.0", + "husky": "9.1.7", + "jest": "29.7.0", + "jiti": "2.4.2", + "jsdom": "22.1.0", + "license-checker": "25.0.1", + "minimatch": "10.2.0", + "nodemon": "3.1.11", + "nx": "22.5.1", + "prettier": "3.8.1", + "storybook": "10.3.5", + "supertest": "7.2.2", + "tailwindcss": "4.1.18", + "terser": "5.46.0", + "ts-jest": "29.4.6", + "ts-loader": "9.5.4", + "tslib": "2.8.1", + "tsx": "4.21.0", + "typedoc": "0.26.11", + "typescript": "5.9.3", + "typescript-eslint": "8.55.0", + "vite": "5.4.21", + "vite-plugin-checker": "0.11.0", + "vite-plugin-dts": "4.5.4", + "vitest": "1.6.1", + "webpack": "5.105.2", + "webpack-cli": "6.0.1" + }, + "engines": { + "node": ">=22.x", + "npm": "9.x" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-decorators": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-jsx": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.29.0", + "@babel/plugin-transform-async-to-generator": "^7.28.6", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.28.6", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.29.0", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.29.0", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.6", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/cspell-bundled-dicts": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/dict-ada": "^4.1.1", + "@cspell/dict-al": "^1.1.1", + "@cspell/dict-aws": "^4.0.17", + "@cspell/dict-bash": "^4.2.2", + "@cspell/dict-companies": "^3.2.10", + "@cspell/dict-cpp": "^7.0.2", + "@cspell/dict-cryptocurrencies": "^5.0.5", + "@cspell/dict-csharp": "^4.0.8", + "@cspell/dict-css": "^4.0.19", + "@cspell/dict-dart": "^2.3.2", + "@cspell/dict-data-science": "^2.0.13", + "@cspell/dict-django": "^4.1.6", + "@cspell/dict-docker": "^1.1.17", + "@cspell/dict-dotnet": "^5.0.11", + "@cspell/dict-elixir": "^4.0.8", + "@cspell/dict-en_us": "^4.4.28", + "@cspell/dict-en-common-misspellings": "^2.1.12", + "@cspell/dict-en-gb-mit": "^3.1.17", + "@cspell/dict-filetypes": "^3.0.15", + "@cspell/dict-flutter": "^1.1.1", + "@cspell/dict-fonts": "^4.0.5", + "@cspell/dict-fsharp": "^1.1.1", + "@cspell/dict-fullstack": "^3.2.8", + "@cspell/dict-gaming-terms": "^1.1.2", + "@cspell/dict-git": "^3.1.0", + "@cspell/dict-golang": "^6.0.26", + "@cspell/dict-google": "^1.0.9", + "@cspell/dict-haskell": "^4.0.6", + "@cspell/dict-html": "^4.0.14", + "@cspell/dict-html-symbol-entities": "^4.0.5", + "@cspell/dict-java": "^5.0.12", + "@cspell/dict-julia": "^1.1.1", + "@cspell/dict-k8s": "^1.0.12", + "@cspell/dict-kotlin": "^1.1.1", + "@cspell/dict-latex": "^5.0.0", + "@cspell/dict-lorem-ipsum": "^4.0.5", + "@cspell/dict-lua": "^4.0.8", + "@cspell/dict-makefile": "^1.0.5", + "@cspell/dict-markdown": "^2.0.14", + "@cspell/dict-monkeyc": "^1.0.12", + "@cspell/dict-node": "^5.0.9", + "@cspell/dict-npm": "^5.2.32", + "@cspell/dict-php": "^4.1.1", + "@cspell/dict-powershell": "^5.0.15", + "@cspell/dict-public-licenses": "^2.0.15", + "@cspell/dict-python": "^4.2.25", + "@cspell/dict-r": "^2.1.1", + "@cspell/dict-ruby": "^5.1.0", + "@cspell/dict-rust": "^4.1.2", + "@cspell/dict-scala": "^5.0.9", + "@cspell/dict-shell": "^1.1.2", + "@cspell/dict-software-terms": "^5.1.20", + "@cspell/dict-sql": "^2.2.1", + "@cspell/dict-svelte": "^1.0.7", + "@cspell/dict-swift": "^2.0.6", + "@cspell/dict-terraform": "^1.1.3", + "@cspell/dict-typescript": "^3.2.3", + "@cspell/dict-vue": "^3.0.5", + "@cspell/dict-zig": "^1.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-performance-monitor": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18" + } + }, + "node_modules/@cspell/cspell-pipe": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-resolver": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "global-directory": "^4.0.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-service-bus": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-types": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/dict-ada": { + "version": "4.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-al": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-aws": { + "version": "4.0.17", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-bash": { + "version": "4.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/dict-shell": "1.1.2" + } + }, + "node_modules/@cspell/dict-companies": { + "version": "3.2.10", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-cpp": { + "version": "7.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-cryptocurrencies": { + "version": "5.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-csharp": { + "version": "4.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-css": { + "version": "4.0.19", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-dart": { + "version": "2.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-data-science": { + "version": "2.0.13", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-django": { + "version": "4.1.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-docker": { + "version": "1.1.17", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-dotnet": { + "version": "5.0.12", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-elixir": { + "version": "4.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-en_us": { + "version": "4.4.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-en-common-misspellings": { + "version": "2.1.12", + "dev": true, + "license": "CC BY-SA 4.0" + }, + "node_modules/@cspell/dict-en-gb-mit": { + "version": "3.1.18", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-filetypes": { + "version": "3.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-flutter": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-fonts": { + "version": "4.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-fsharp": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-fullstack": { + "version": "3.2.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-gaming-terms": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-git": { + "version": "3.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-golang": { + "version": "6.0.26", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-google": { + "version": "1.0.9", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-haskell": { + "version": "4.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-html": { + "version": "4.0.14", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-html-symbol-entities": { + "version": "4.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-java": { + "version": "5.0.12", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-julia": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-k8s": { + "version": "1.0.12", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-kotlin": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-latex": { + "version": "5.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-lorem-ipsum": { + "version": "4.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-lua": { + "version": "4.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-makefile": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-markdown": { + "version": "2.0.14", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@cspell/dict-css": "^4.0.19", + "@cspell/dict-html": "^4.0.14", + "@cspell/dict-html-symbol-entities": "^4.0.5", + "@cspell/dict-typescript": "^3.2.3" + } + }, + "node_modules/@cspell/dict-monkeyc": { + "version": "1.0.12", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-node": { + "version": "5.0.9", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-npm": { + "version": "5.2.34", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-php": { + "version": "4.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-powershell": { + "version": "5.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-public-licenses": { + "version": "2.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-python": { + "version": "4.2.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/dict-data-science": "^2.0.13" + } + }, + "node_modules/@cspell/dict-r": { + "version": "2.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-ruby": { + "version": "5.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-rust": { + "version": "4.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-scala": { + "version": "5.0.9", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-shell": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-software-terms": { + "version": "5.1.21", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-sql": { + "version": "2.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-svelte": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-swift": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-terraform": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-typescript": { + "version": "3.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-vue": { + "version": "3.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-zig": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dynamic-import": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/url": "9.6.4", + "import-meta-resolve": "^4.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/eslint-plugin": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-types": "9.6.4", + "@cspell/url": "9.6.4", + "cspell-lib": "9.6.4", + "synckit": "^0.11.12" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "eslint": "^7 || ^8 || ^9" + } + }, + "node_modules/@cspell/filetypes": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/rpc": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18" + } + }, + "node_modules/@cspell/strong-weak-map": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/url": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.17.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/css": { + "version": "11.13.5", + "license": "MIT", + "dependencies": { + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "license": "MIT" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@jest/console/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/@jest/reporters": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@jest/core/node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/core/node_modules/jest-resolve": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@jest/environment/node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@jest/pattern/node_modules/jest-regex-util": { + "version": "30.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/reporters": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@types/node": "*", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/@jest/console": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@jest/test-result": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@jest/transform": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "micromatch": "^4.0.8", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@sinclair/typebox": { + "version": "0.34.48", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/reporters/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jest/reporters/node_modules/ci-info": { + "version": "4.4.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "10.5.0", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/jest-haste-map": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/@jest/reporters/node_modules/jest-message-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-regex-util": { + "version": "30.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-worker": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/pretty-format": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/react-is": { + "version": "18.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/reporters/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/reporters/node_modules/write-file-atomic": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/snapshot-utils": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/@sinclair/typebox": { + "version": "0.34.48", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/snapshot-utils/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@jest/types/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { + "version": "0.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^13.0.1", + "react-docgen-typescript": "^2.2.2" + }, + "peerDependencies": { + "typescript": ">= 4.3.x", + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/glob": { + "version": "13.0.3", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.0", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/lru-cache": { + "version": "11.2.6", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/path-scurry": { + "version": "2.0.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@microsoft/api-extractor": { + "version": "7.56.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor-model": "7.32.2", + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.0", + "@rushstack/node-core-library": "5.19.1", + "@rushstack/rig-package": "0.6.0", + "@rushstack/terminal": "0.21.0", + "@rushstack/ts-command-line": "5.2.0", + "diff": "~8.0.2", + "lodash": "~4.17.23", + "minimatch": "10.1.2", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "source-map": "~0.6.1", + "typescript": "5.8.2" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.32.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.0", + "@rushstack/node-core-library": "5.19.1" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/minimatch": { + "version": "10.1.2", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "5.8.2", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@microsoft/fast-element": { + "version": "2.8.3", + "license": "MIT" + }, + "node_modules/@microsoft/fast-web-utilities": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "exenv-es6": "^1.1.1" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "0.16.0", + "ajv": "~8.12.0", + "jju": "~1.4.0", + "resolve": "~1.22.2" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@module-federation/bridge-react-webpack-plugin": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/sdk": "0.21.6", + "@types/semver": "7.5.8", + "semver": "7.6.3" + } + }, + "node_modules/@module-federation/bridge-react-webpack-plugin/node_modules/semver": { + "version": "7.6.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@module-federation/cli": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/dts-plugin": "0.21.6", + "@module-federation/sdk": "0.21.6", + "chalk": "3.0.0", + "commander": "11.1.0", + "jiti": "2.4.2" + }, + "bin": { + "mf": "bin/mf.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@module-federation/cli/node_modules/chalk": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/cli/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/data-prefetch": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.21.6", + "@module-federation/sdk": "0.21.6", + "fs-extra": "9.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@module-federation/data-prefetch/node_modules/@module-federation/runtime": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.21.6", + "@module-federation/runtime-core": "0.21.6", + "@module-federation/sdk": "0.21.6" + } + }, + "node_modules/@module-federation/data-prefetch/node_modules/@module-federation/runtime-core": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.21.6", + "@module-federation/sdk": "0.21.6" + } + }, + "node_modules/@module-federation/dts-plugin": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.21.6", + "@module-federation/managers": "0.21.6", + "@module-federation/sdk": "0.21.6", + "@module-federation/third-party-dts-extractor": "0.21.6", + "adm-zip": "^0.5.10", + "ansi-colors": "^4.1.3", + "axios": "^1.12.0", + "chalk": "3.0.0", + "fs-extra": "9.1.0", + "isomorphic-ws": "5.0.0", + "koa": "3.0.3", + "lodash.clonedeepwith": "4.5.0", + "log4js": "6.9.1", + "node-schedule": "2.1.1", + "rambda": "^9.1.0", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/dts-plugin/node_modules/chalk": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/dts-plugin/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/enhanced": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.21.6", + "@module-federation/cli": "0.21.6", + "@module-federation/data-prefetch": "0.21.6", + "@module-federation/dts-plugin": "0.21.6", + "@module-federation/error-codes": "0.21.6", + "@module-federation/inject-external-runtime-core-plugin": "0.21.6", + "@module-federation/managers": "0.21.6", + "@module-federation/manifest": "0.21.6", + "@module-federation/rspack": "0.21.6", + "@module-federation/runtime-tools": "0.21.6", + "@module-federation/sdk": "0.21.6", + "btoa": "^1.2.1", + "schema-utils": "^4.3.0", + "upath": "2.0.1" + }, + "bin": { + "mf": "bin/mf.js" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@module-federation/error-codes": { + "version": "0.21.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/inject-external-runtime-core-plugin": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@module-federation/runtime-tools": "0.21.6" + } + }, + "node_modules/@module-federation/managers": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/sdk": "0.21.6", + "find-pkg": "2.0.0", + "fs-extra": "9.1.0" + } + }, + "node_modules/@module-federation/manifest": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/dts-plugin": "0.21.6", + "@module-federation/managers": "0.21.6", + "@module-federation/sdk": "0.21.6", + "chalk": "3.0.0", + "find-pkg": "2.0.0" + } + }, + "node_modules/@module-federation/manifest/node_modules/chalk": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/manifest/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/node": { + "version": "2.7.32", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/enhanced": "2.0.1", + "@module-federation/runtime": "2.0.1", + "@module-federation/sdk": "2.0.1", + "btoa": "1.2.1", + "encoding": "^0.1.13", + "node-fetch": "2.7.0" + }, + "peerDependencies": { + "webpack": "^5.40.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/bridge-react-webpack-plugin": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/sdk": "2.0.1", + "@types/semver": "7.5.8", + "semver": "7.6.3" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/cli": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/dts-plugin": "2.0.1", + "@module-federation/sdk": "2.0.1", + "chalk": "3.0.0", + "commander": "11.1.0", + "jiti": "2.4.2" + }, + "bin": { + "mf": "bin/mf.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/data-prefetch": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "2.0.1", + "@module-federation/sdk": "2.0.1", + "fs-extra": "9.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/dts-plugin": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "2.0.1", + "@module-federation/managers": "2.0.1", + "@module-federation/sdk": "2.0.1", + "@module-federation/third-party-dts-extractor": "2.0.1", + "adm-zip": "^0.5.10", + "ansi-colors": "^4.1.3", + "axios": "^1.12.0", + "chalk": "3.0.0", + "fs-extra": "9.1.0", + "isomorphic-ws": "5.0.0", + "koa": "3.0.3", + "lodash.clonedeepwith": "4.5.0", + "log4js": "6.9.1", + "node-schedule": "2.1.1", + "rambda": "^9.1.0", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/enhanced": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "2.0.1", + "@module-federation/cli": "2.0.1", + "@module-federation/data-prefetch": "2.0.1", + "@module-federation/dts-plugin": "2.0.1", + "@module-federation/error-codes": "2.0.1", + "@module-federation/inject-external-runtime-core-plugin": "2.0.1", + "@module-federation/managers": "2.0.1", + "@module-federation/manifest": "2.0.1", + "@module-federation/rspack": "2.0.1", + "@module-federation/runtime-tools": "2.0.1", + "@module-federation/sdk": "2.0.1", + "btoa": "^1.2.1", + "schema-utils": "^4.3.0", + "upath": "2.0.1" + }, + "bin": { + "mf": "bin/mf.js" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/error-codes": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/node/node_modules/@module-federation/inject-external-runtime-core-plugin": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@module-federation/runtime-tools": "2.0.1" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/managers": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/sdk": "2.0.1", + "find-pkg": "2.0.0", + "fs-extra": "9.1.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/manifest": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/dts-plugin": "2.0.1", + "@module-federation/managers": "2.0.1", + "@module-federation/sdk": "2.0.1", + "chalk": "3.0.0", + "find-pkg": "2.0.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/rspack": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "2.0.1", + "@module-federation/dts-plugin": "2.0.1", + "@module-federation/inject-external-runtime-core-plugin": "2.0.1", + "@module-federation/managers": "2.0.1", + "@module-federation/manifest": "2.0.1", + "@module-federation/runtime-tools": "2.0.1", + "@module-federation/sdk": "2.0.1", + "btoa": "1.2.1" + }, + "peerDependencies": { + "@rspack/core": "^0.7.0 || ^1.0.0 || ^2.0.0-0", + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/runtime-tools": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "2.0.1", + "@module-federation/webpack-bundler-runtime": "2.0.1" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/sdk": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/node/node_modules/@module-federation/third-party-dts-extractor": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "find-pkg": "2.0.0", + "fs-extra": "9.1.0", + "resolve": "1.22.8" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/webpack-bundler-runtime": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "2.0.1", + "@module-federation/sdk": "2.0.1" + } + }, + "node_modules/@module-federation/node/node_modules/chalk": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/node/node_modules/resolve": { + "version": "1.22.8", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@module-federation/node/node_modules/semver": { + "version": "7.6.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@module-federation/node/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/rspack": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.21.6", + "@module-federation/dts-plugin": "0.21.6", + "@module-federation/inject-external-runtime-core-plugin": "0.21.6", + "@module-federation/managers": "0.21.6", + "@module-federation/manifest": "0.21.6", + "@module-federation/runtime-tools": "0.21.6", + "@module-federation/sdk": "0.21.6", + "btoa": "1.2.1" + }, + "peerDependencies": { + "@rspack/core": ">=0.7", + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/runtime": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "2.0.1", + "@module-federation/runtime-core": "2.0.1", + "@module-federation/sdk": "2.0.1" + } + }, + "node_modules/@module-federation/runtime-core": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "2.0.1", + "@module-federation/sdk": "2.0.1" + } + }, + "node_modules/@module-federation/runtime-core/node_modules/@module-federation/error-codes": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/runtime-core/node_modules/@module-federation/sdk": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.21.6", + "@module-federation/webpack-bundler-runtime": "0.21.6" + } + }, + "node_modules/@module-federation/runtime-tools/node_modules/@module-federation/runtime": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.21.6", + "@module-federation/runtime-core": "0.21.6", + "@module-federation/sdk": "0.21.6" + } + }, + "node_modules/@module-federation/runtime-tools/node_modules/@module-federation/runtime-core": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.21.6", + "@module-federation/sdk": "0.21.6" + } + }, + "node_modules/@module-federation/runtime/node_modules/@module-federation/error-codes": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/runtime/node_modules/@module-federation/sdk": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/sdk": { + "version": "0.21.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/third-party-dts-extractor": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "find-pkg": "2.0.0", + "fs-extra": "9.1.0", + "resolve": "1.22.8" + } + }, + "node_modules/@module-federation/third-party-dts-extractor/node_modules/resolve": { + "version": "1.22.8", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.21.6", + "@module-federation/sdk": "0.21.6" + } + }, + "node_modules/@module-federation/webpack-bundler-runtime/node_modules/@module-federation/runtime": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.21.6", + "@module-federation/runtime-core": "0.21.6", + "@module-federation/sdk": "0.21.6" + } + }, + "node_modules/@module-federation/webpack-bundler-runtime/node_modules/@module-federation/runtime-core": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.21.6", + "@module-federation/sdk": "0.21.6" + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "9.0.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "9.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^9.0.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "9.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/core-downloads-tracker": "^9.0.0", + "@mui/system": "^9.0.0", + "@mui/types": "^9.0.0", + "@mui/utils": "^9.0.0", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "csstype": "^3.2.3", + "prop-types": "^15.8.1", + "react-is": "^19.2.4", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^9.0.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "19.2.5", + "license": "MIT" + }, + "node_modules/@mui/private-theming": { + "version": "9.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/utils": "^9.0.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "9.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.2.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "9.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/private-theming": "^9.0.0", + "@mui/styled-engine": "^9.0.0", + "@mui/types": "^9.0.0", + "@mui/utils": "^9.0.0", + "clsx": "^2.1.1", + "csstype": "^3.2.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "9.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "9.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/types": "^9.0.0", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.2.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "19.2.5", + "license": "MIT" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nx/devkit": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "10.1.1", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/devkit/node_modules/minimatch": { + "version": "10.1.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/docker": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.0.1", + "enquirer": "~2.3.6", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/docker/node_modules/@nx/devkit": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/docker/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/eslint": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.0.1", + "@nx/js": "22.0.1", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "typescript": "~5.9.2" + }, + "peerDependencies": { + "@zkochan/js-yaml": "0.0.7", + "eslint": "^8.0.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "@zkochan/js-yaml": { + "optional": true + } + } + }, + "node_modules/@nx/eslint-plugin": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@nx/js": "22.5.1", + "@phenomnomnominal/tsquery": "~6.1.4", + "@typescript-eslint/type-utils": "^8.0.0", + "@typescript-eslint/utils": "^8.0.0", + "chalk": "^4.1.0", + "confusing-browser-globals": "^1.0.9", + "globals": "^15.9.0", + "jsonc-eslint-parser": "^2.1.0", + "semver": "^7.6.3", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.13.2 || ^7.0.0 || ^8.0.0", + "eslint-config-prettier": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/@nx/eslint-plugin/node_modules/@nx/js": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "22.5.1", + "@nx/workspace": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/eslint-plugin/node_modules/@nx/workspace": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "22.5.1", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/eslint-plugin/node_modules/globals": { + "version": "15.15.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/eslint-plugin/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/eslint-plugin/node_modules/source-map-support": { + "version": "0.5.19", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/eslint/node_modules/@nx/devkit": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/eslint/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/jest": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/reporters": "^30.0.2", + "@jest/test-result": "^30.0.2", + "@nx/devkit": "22.0.1", + "@nx/js": "22.0.1", + "@phenomnomnominal/tsquery": "~5.0.1", + "identity-obj-proxy": "3.0.0", + "jest-config": "^30.0.2", + "jest-resolve": "^30.0.2", + "jest-util": "^30.0.2", + "minimatch": "9.0.3", + "picocolors": "^1.1.0", + "resolve.exports": "2.0.3", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/jest/node_modules/@jest/console": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/environment": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/expect": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "30.2.0", + "jest-snapshot": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/expect-utils": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/fake-timers": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/globals": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/source-map": { + "version": "30.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/test-result": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/test-sequencer": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/transform": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "micromatch": "^4.0.8", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@nx/devkit": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/jest/node_modules/@phenomnomnominal/tsquery": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "esquery": "^1.4.0" + }, + "peerDependencies": { + "typescript": "^3 || ^4 || ^5" + } + }, + "node_modules/@nx/jest/node_modules/@sinclair/typebox": { + "version": "0.34.48", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/jest/node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@nx/jest/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@nx/jest/node_modules/@types/node/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@nx/jest/node_modules/babel-jest": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "30.2.0", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-0" + } + }, + "node_modules/@nx/jest/node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@nx/jest/node_modules/babel-plugin-jest-hoist": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/babel__core": "^7.20.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/babel-preset-jest": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" + } + }, + "node_modules/@nx/jest/node_modules/ci-info": { + "version": "4.4.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/jest/node_modules/cjs-module-lexer": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/jest/node_modules/expect": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/glob": { + "version": "10.5.0", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/jest/node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/jest/node_modules/jest-circus": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "p-limit": "^3.1.0", + "pretty-format": "30.2.0", + "pure-rand": "^7.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-config": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.2.0", + "@jest/types": "30.2.0", + "babel-jest": "30.2.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-circus": "30.2.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-runner": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "micromatch": "^4.0.8", + "parse-json": "^5.2.0", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "esbuild-register": ">=3.4.0", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild-register": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/@nx/jest/node_modules/jest-each": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "jest-util": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-environment-node": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-haste-map": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/@nx/jest/node_modules/jest-leak-detector": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-matcher-utils": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-message-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-regex-util": { + "version": "30.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-runner": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/environment": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-leak-detector": "30.2.0", + "jest-message-util": "30.2.0", + "jest-resolve": "30.2.0", + "jest-runtime": "30.2.0", + "jest-util": "30.2.0", + "jest-watcher": "30.2.0", + "jest-worker": "30.2.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-runtime": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/globals": "30.2.0", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-snapshot": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-validate": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-watcher": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.2.0", + "string-length": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-worker": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/jest/node_modules/pretty-format": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/pure-rand": { + "version": "7.0.1", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/@nx/jest/node_modules/react-is": { + "version": "18.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/jest/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/jest/node_modules/strip-bom": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/jest/node_modules/write-file-atomic": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nx/js": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "22.0.1", + "@nx/workspace": "22.0.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.5.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/js/node_modules/@nx/devkit": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/js/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/js/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/js/node_modules/source-map-support": { + "version": "0.5.19", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/module-federation": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/enhanced": "^0.21.2", + "@module-federation/node": "^2.7.21", + "@module-federation/sdk": "^0.21.2", + "@nx/devkit": "22.5.1", + "@nx/js": "22.5.1", + "@nx/web": "22.5.1", + "@rspack/core": "1.6.8", + "express": "^4.21.2", + "http-proxy-middleware": "^3.0.5", + "picocolors": "^1.1.0", + "tslib": "^2.3.0", + "webpack": "^5.101.3" + } + }, + "node_modules/@nx/module-federation/node_modules/@nx/js": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "22.5.1", + "@nx/workspace": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/module-federation/node_modules/@nx/workspace": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "22.5.1", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/module-federation/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/module-federation/node_modules/source-map-support": { + "version": "0.5.19", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/node": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.0.1", + "@nx/docker": "22.0.1", + "@nx/eslint": "22.0.1", + "@nx/jest": "22.0.1", + "@nx/js": "22.0.1", + "kill-port": "^1.6.1", + "tcp-port-used": "^1.0.2", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/node/node_modules/@nx/devkit": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/node/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "22.5.1", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@nx/nx-darwin-x64": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-22.5.1.tgz", + "integrity": "sha512-81Lb7+rp3Qltpgy33Kc1qxk+8IWqZLhqvdLdRFSVV1FN1pPSJDFKyPjCn9oMpRryNPSJ8DgZDpfIaVVyP85rUw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-22.5.1.tgz", + "integrity": "sha512-Ig8yQN3lSz9R+Zf3NQWcvEnIzwDX4NSeaFtEliPnC3OHlQXGNXbOUfkExa0U0UUgyxa4rgnCgefmwuc12H9q2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-22.5.1.tgz", + "integrity": "sha512-C7tGoLnR9MjKLJsLMF2VsKcDChPiygAsw6dSVgU4B650H7sBWmkEHM/QjvyRvkcZuoQBDamS/eVs/UaJu9wNhA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-22.5.1.tgz", + "integrity": "sha512-GNxei+lwhzhrO9m+nNkibgxLhbkYKyFXPSRpOKLwv9VavNzJn5UmLfKJyhjNQPBOSYuNhiVPbU1Ja/qOBcozYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-22.5.1.tgz", + "integrity": "sha512-VDJtdJP2nCgS8ommbfWFAKjoZCE51VH7tZyIfh8RFI5fxwoB3Pk6d6f6cmNHI/1t98YI3V7Onuf3Y9KBkYtyfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-22.5.1.tgz", + "integrity": "sha512-BZ/i+KTplEJmE8ZHKgPGD513Zl86DuSGyRAvbDZ7Qf19Tei7Of6vxW+ypvVDIwmDbyXfe13u54M5gDt8iiqFGQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-22.5.1.tgz", + "integrity": "sha512-e0VdiV6fe88Dbhill2gUjYAD9jMhHjYsafGOPR+/uaGMAYPoI1jKur6uPGY+ik6fvwvDFFl0VT2+HACKVn7RoA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-22.5.1.tgz", + "integrity": "sha512-3vWZO9y7uHKeyepcU55pE8VQTKGome3mLdicvx1TCoKKl0cA3bTR341Jdo2Zl4Waa2ENk7pGQbLWRQ3ZkaA92A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-22.5.1.tgz", + "integrity": "sha512-4e5LduuhpBx96JgD1J3fHUGCwC+/lL+tvXp3UVtjh/AOdINGsyI+scinT3uaI9vcB5GKBcybTxbBZzwcH50w9g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@nx/react": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@nx/eslint": "22.5.1", + "@nx/js": "22.5.1", + "@nx/module-federation": "22.5.1", + "@nx/rollup": "22.5.1", + "@nx/web": "22.5.1", + "@phenomnomnominal/tsquery": "~6.1.4", + "@svgr/webpack": "^8.0.1", + "express": "^4.21.2", + "http-proxy-middleware": "^3.0.5", + "minimatch": "10.1.1", + "picocolors": "^1.1.0", + "semver": "^7.6.3", + "tslib": "^2.3.0" + }, + "optionalDependencies": { + "@nx/vite": "22.5.1" + } + }, + "node_modules/@nx/react/node_modules/@nx/eslint": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@nx/js": "22.5.1", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "typescript": "~5.9.2" + }, + "peerDependencies": { + "@zkochan/js-yaml": "0.0.7", + "eslint": "^8.0.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "@zkochan/js-yaml": { + "optional": true + } + } + }, + "node_modules/@nx/react/node_modules/@nx/js": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "22.5.1", + "@nx/workspace": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/react/node_modules/@nx/workspace": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "22.5.1", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/react/node_modules/minimatch": { + "version": "10.1.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/react/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/react/node_modules/source-map-support": { + "version": "0.5.19", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/rollup": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@nx/js": "22.5.1", + "@rollup/plugin-babel": "^6.0.4", + "@rollup/plugin-commonjs": "^25.0.7", + "@rollup/plugin-image": "^3.0.3", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-typescript": "^12.1.0", + "autoprefixer": "^10.4.9", + "concat-with-sourcemaps": "^1.1.0", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "postcss": "^8.4.38", + "postcss-modules": "^6.0.1", + "rollup": "^4.14.0", + "rollup-plugin-typescript2": "^0.36.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/rollup/node_modules/@nx/js": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "22.5.1", + "@nx/workspace": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/rollup/node_modules/@nx/workspace": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "22.5.1", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/rollup/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/rollup/node_modules/source-map-support": { + "version": "0.5.19", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/vite": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@nx/js": "22.5.1", + "@nx/vitest": "22.5.1", + "@phenomnomnominal/tsquery": "~6.1.4", + "ajv": "^8.0.0", + "enquirer": "~2.3.6", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vitest": "^1.3.1 || ^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/@nx/vite/node_modules/@nx/js": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "22.5.1", + "@nx/workspace": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/vite/node_modules/@nx/workspace": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "22.5.1", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/vite/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/vite/node_modules/source-map-support": { + "version": "0.5.19", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/vitest": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@nx/js": "22.5.1", + "@phenomnomnominal/tsquery": "~6.1.4", + "semver": "^7.6.3", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vitest": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@nx/vitest/node_modules/@nx/js": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "22.5.1", + "@nx/workspace": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/vitest/node_modules/@nx/workspace": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "22.5.1", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/vitest/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/vitest/node_modules/source-map-support": { + "version": "0.5.19", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/web": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@nx/js": "22.5.1", + "detect-port": "^1.5.1", + "http-server": "^14.1.0", + "picocolors": "^1.1.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/web/node_modules/@nx/js": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "22.5.1", + "@nx/workspace": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/web/node_modules/@nx/workspace": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "22.5.1", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/web/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/web/node_modules/source-map-support": { + "version": "0.5.19", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/workspace": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.0.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "22.0.1", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/workspace/node_modules/@nx/devkit": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-darwin-arm64": { + "version": "22.0.1", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-darwin-x64": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-22.0.1.tgz", + "integrity": "sha512-W5MAiesTGSVwYRoQa2WHARiEolqhioMwa8p1/gdQePb4LmM2ZdNOj6emVJYUecql6kt+ptHeO4bYaFc8n+XLEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-freebsd-x64": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-22.0.1.tgz", + "integrity": "sha512-3n7nzFmRtUvfnP5rtJtaSqv9MxRTXe3RnwXF9N1oXE3gYmGJZXCo8cIYNzrt8oTeWxRUDTm/leJQnQ/aC7/v0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-22.0.1.tgz", + "integrity": "sha512-4cTCWWa4yonTE1lrH+1bX3urozJjVr0xjHysBktwc1W8VNg65oA6p29yC1FDZcTBgo9rY/y/1WIL1E61y64BgA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-linux-arm64-gnu": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-22.0.1.tgz", + "integrity": "sha512-cC61gqNy+Z3DBr8FBWysLCnIEPbrSxWU/GtnVWH/4r4fMzDlaQwl51g8nm2KCtQXOgyqyWkXEd5jykr3z2u7QA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-linux-arm64-musl": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-22.0.1.tgz", + "integrity": "sha512-43I82qkAvXUsRySzDkhstg9kpGegZG5EWRMFYtEatgJRXeVRssPwHZHsLP2alj/gopJFq1H2yjWOWTziJxG3pw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-linux-x64-gnu": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-22.0.1.tgz", + "integrity": "sha512-HRtVR9g57gzjikXsUHVcP6UsrHWMzXq+WJz7PzgcRU1RT/AP/4QxV6HegA1O2filcGLxSYwt5JOYwy73OYuYDg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-linux-x64-musl": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-22.0.1.tgz", + "integrity": "sha512-v/ZScgI8fwTMfIZgnLXSq2XB//3uX+qhq/dzzbQQKvOuo/vtrnhxOKcoo4mCGVKuFtT/mr0bv66/5uPpUPct2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-win32-arm64-msvc": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-22.0.1.tgz", + "integrity": "sha512-xajcwSOJUISp+OaL/NU2ulhXvEEo1KwmgEvYpePWS5gvxogu8ps9D9wrtJGFcMSrKyPGurbPUbOCAKMbrk4LqQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-win32-x64-msvc": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-22.0.1.tgz", + "integrity": "sha512-2w78FyjZwBeKxjdv0ZzdHin2UFPk0NBHtb5mcZ7lannBDHahdO4vA9iI8Pg+Y75ybKGrIsCyHK+BDdgH/S6UHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@nx/workspace/node_modules/dotenv": { + "version": "16.4.7", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@nx/workspace/node_modules/ignore": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@nx/workspace/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/workspace/node_modules/nx": { + "version": "22.0.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@napi-rs/wasm-runtime": "0.2.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.2", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.12.0", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "ignore": "^7.0.5", + "jest-diff": "^30.0.2", + "jsonc-parser": "3.2.0", + "lines-and-columns": "2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "resolve.exports": "2.0.3", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tree-kill": "^1.2.2", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yaml": "^2.6.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "22.0.1", + "@nx/nx-darwin-x64": "22.0.1", + "@nx/nx-freebsd-x64": "22.0.1", + "@nx/nx-linux-arm-gnueabihf": "22.0.1", + "@nx/nx-linux-arm64-gnu": "22.0.1", + "@nx/nx-linux-arm64-musl": "22.0.1", + "@nx/nx-linux-x64-gnu": "22.0.1", + "@nx/nx-linux-x64-musl": "22.0.1", + "@nx/nx-win32-arm64-msvc": "22.0.1", + "@nx/nx-win32-x64-msvc": "22.0.1" + }, + "peerDependencies": { + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nx/workspace/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/@phenomnomnominal/tsquery": { + "version": "6.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/esquery": "^1.5.0", + "esquery": "^1.5.0" + }, + "peerDependencies": { + "typescript": "^3 || ^4 || ^5" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@playwright/test": { + "version": "1.46.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.46.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.2", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-babel": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@rollup/pluginutils": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "25.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^8.0.3", + "is-reference": "1.2.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/glob": { + "version": "8.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rollup/plugin-image": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "mini-svg-data-uri": "^1.4.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve/node_modules/@types/resolve": { + "version": "1.20.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-replace": { + "version": "5.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-typescript": { + "version": "12.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0||^3.0.0||^4.0.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "tslib": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding": { + "version": "1.6.8", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.6.8", + "@rspack/binding-darwin-x64": "1.6.8", + "@rspack/binding-linux-arm64-gnu": "1.6.8", + "@rspack/binding-linux-arm64-musl": "1.6.8", + "@rspack/binding-linux-x64-gnu": "1.6.8", + "@rspack/binding-linux-x64-musl": "1.6.8", + "@rspack/binding-wasm32-wasi": "1.6.8", + "@rspack/binding-win32-arm64-msvc": "1.6.8", + "@rspack/binding-win32-ia32-msvc": "1.6.8", + "@rspack/binding-win32-x64-msvc": "1.6.8" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.6.8", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.6.8.tgz", + "integrity": "sha512-ku1XpTEPt6Za11zhpFWhfwrTQogcgi9RJrOUVC4FESiPO9aKyd4hJ+JiPgLY0MZOqsptK6vEAgOip+uDVXrCpg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.6.8.tgz", + "integrity": "sha512-fvZX6xZPvBT8qipSpvkKMX5M7yd2BSpZNCZXcefw6gA3uC7LI3gu+er0LrDXY1PtPzVuHTyDx+abwWpagV3PiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.6.8.tgz", + "integrity": "sha512-++XMKcMNrt59HcFBLnRaJcn70k3X0GwkAegZBVpel8xYIAgvoXT5+L8P1ExId/yTFxqedaz8DbcxQnNmMozviw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.6.8.tgz", + "integrity": "sha512-tv3BWkTE1TndfX+DsE1rSTg8fBevCxujNZ3MlfZ22Wfy9x1FMXTJlWG8VIOXmaaJ1wUHzv8S7cE2YUUJ2LuiCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.6.8.tgz", + "integrity": "sha512-DCGgZ5/in1O3FjHWqXnDsncRy+48cMhfuUAAUyl0yDj1NpsZu9pP+xfGLvGcQTiYrVl7IH9Aojf1eShP/77WGA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-wasm32-wasi": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.6.8.tgz", + "integrity": "sha512-VUwdhl/lI4m6o1OGCZ9JwtMjTV/yLY5VZTQdEPKb40JMTlmZ5MBlr5xk7ByaXXYHr6I+qnqEm73iMKQvg6iknw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "1.0.7" + } + }, + "node_modules/@rspack/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", + "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@tybys/wasm-util": "^0.10.1" + } + }, + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.6.8.tgz", + "integrity": "sha512-23YX7zlOZlub+nPGDBUzktb4D5D6ETUAluKjXEeHIZ9m7fSlEYBnGL66YE+3t1DHXGd0OqsdwlvrNGcyo6EXDQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.6.8.tgz", + "integrity": "sha512-cFgRE3APxrY4AEdooVk2LtipwNNT/9mrnjdC5lVbsIsz+SxvGbZR231bxDJEqP15+RJOaD07FO1sIjINFqXMEg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.6.8.tgz", + "integrity": "sha512-cIuhVsZYd3o3Neo1JSAhJYw6BDvlxaBoqvgwRkG1rs0ExFmEmgYyG7ip9pFKnKNWph/tmW3rDYypmEfjs1is7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/core": { + "version": "1.6.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime-tools": "0.21.6", + "@rspack/binding": "1.6.8", + "@rspack/lite-tapable": "1.1.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@rspack/lite-tapable": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@rushstack/node-core-library": { + "version": "5.19.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "~8.13.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~11.3.0", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/ajv": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/ajv-draft-04": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/ajv-formats": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { + "version": "11.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@rushstack/problem-matcher": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/terminal": { + "version": "0.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rushstack/node-core-library": "5.19.1", + "@rushstack/problem-matcher": "0.1.1", + "supports-color": "~8.1.1" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rushstack/terminal": "0.21.0", + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "string-argv": "~0.3.1" + } + }, + "node_modules/@rushstack/ts-command-line/node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@shikijs/core": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "oniguruma-to-es": "^2.2.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1" + } + }, + "node_modules/@shikijs/langs": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2" + } + }, + "node_modules/@shikijs/themes": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2" + } + }, + "node_modules/@shikijs/types": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.10", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/commons/node_modules/type-detect": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@storybook/builder-vite": { + "version": "10.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf-plugin": "10.3.5", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^10.3.5", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@storybook/csf-plugin": { + "version": "10.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "unplugin": "^2.3.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "esbuild": "*", + "rollup": "*", + "storybook": "^10.3.5", + "vite": "*", + "webpack": "*" + }, + "peerDependenciesMeta": { + "esbuild": { + "optional": true + }, + "rollup": { + "optional": true + }, + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@storybook/global": { + "version": "5.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/icons": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@storybook/react": { + "version": "10.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/react-dom-shim": "10.3.5", + "react-docgen": "^8.0.2", + "react-docgen-typescript": "^2.2.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "storybook": "^10.3.5", + "typescript": ">= 4.9.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/react-dom-shim": { + "version": "10.3.5", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "storybook": "^10.3.5" + } + }, + "node_modules/@storybook/react-vite": { + "version": "10.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@joshwooding/vite-plugin-react-docgen-typescript": "^0.7.0", + "@rollup/pluginutils": "^5.0.2", + "@storybook/builder-vite": "10.3.5", + "@storybook/react": "10.3.5", + "empathic": "^2.0.0", + "magic-string": "^0.30.0", + "react-docgen": "^8.0.0", + "resolve": "^1.22.8", + "tsconfig-paths": "^4.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "storybook": "^10.3.5", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@swc/core": { + "version": "1.15.11", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.25" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.15.11", + "@swc/core-darwin-x64": "1.15.11", + "@swc/core-linux-arm-gnueabihf": "1.15.11", + "@swc/core-linux-arm64-gnu": "1.15.11", + "@swc/core-linux-arm64-musl": "1.15.11", + "@swc/core-linux-x64-gnu": "1.15.11", + "@swc/core-linux-x64-musl": "1.15.11", + "@swc/core-win32-arm64-msvc": "1.15.11", + "@swc/core-win32-ia32-msvc": "1.15.11", + "@swc/core-win32-x64-msvc": "1.15.11" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.15.11", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.11.tgz", + "integrity": "sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.11.tgz", + "integrity": "sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.11.tgz", + "integrity": "sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.11.tgz", + "integrity": "sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.11.tgz", + "integrity": "sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.11.tgz", + "integrity": "sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.11.tgz", + "integrity": "sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.11.tgz", + "integrity": "sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.11.tgz", + "integrity": "sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.25", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/node/node_modules/jiti": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.18", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "tailwindcss": "4.1.18" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.99.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.99.0", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.99.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/@testing-library/dom/node_modules/pretty-format": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@testing-library/dom/node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@trpc/client": { + "version": "11.11.0", + "funding": [ + "https://trpc.io/sponsor" + ], + "license": "MIT", + "peerDependencies": { + "@trpc/server": "11.11.0", + "typescript": ">=5.7.2" + } + }, + "node_modules/@trpc/server": { + "version": "11.11.0", + "funding": [ + "https://trpc.io/sponsor" + ], + "license": "MIT", + "peerDependencies": { + "typescript": ">=5.7.2" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/body-parser/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/body-parser/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/connect/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/cors/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/doctrine": { + "version": "0.0.9", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/esquery": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express-serve-static-core/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/express-serve-static-core/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/graceful-fs/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-proxy/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/http-proxy/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, + "node_modules/@types/jsonwebtoken/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/jsonwebtoken/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.23", + "license": "MIT" + }, + "node_modules/@types/lodash.omit": { + "version": "4.5.9", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/methods": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.9", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/node-fetch/node_modules/@types/node": { + "version": "25.2.3", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/node-fetch/node_modules/undici-types": { + "version": "7.16.0", + "license": "MIT" + }, + "node_modules/@types/opentok": { + "version": "2.14.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "license": "MIT" + }, + "node_modules/@types/prismjs": { + "version": "1.26.6", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.14", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/react-syntax-highlighter": { + "version": "15.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/resolve": { + "version": "1.20.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/send/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/send/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/superagent": { + "version": "8.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/superagent/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/superagent/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/supertest": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "license": "MIT", + "optional": true + }, + "node_modules/@types/ua-parser-js": { + "version": "0.7.39", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/type-utils": "8.55.0", + "@typescript-eslint/utils": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.55.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.55.0", + "@typescript-eslint/types": "^8.55.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/utils": "8.55.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.55.0", + "@typescript-eslint/tsconfig-utils": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.55.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@videojs/http-streaming": { + "version": "3.17.4", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.1.1", + "aes-decrypter": "^4.0.2", + "global": "^4.4.0", + "m3u8-parser": "^7.2.0", + "mpd-parser": "^1.3.1", + "mux.js": "7.1.0", + "video.js": "^7 || ^8" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "video.js": "^8.19.0" + } + }, + "node_modules/@videojs/vhs-utils": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/@videojs/xhr": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "global": "~4.4.0", + "is-function": "^1.0.1" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.2", + "@swc/core": "^1.15.11" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/@vitejs/plugin-react/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/coverage-v8": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.4", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.4", + "istanbul-reports": "^3.1.6", + "magic-string": "^0.30.5", + "magicast": "^0.3.3", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "test-exclude": "^6.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.6.1" + } + }, + "node_modules/@vitest/expect": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "1.6.1", + "@vitest/utils": "1.6.1", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.6.1", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/ui": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.6.1", + "fast-glob": "^3.3.2", + "fflate": "^0.8.1", + "flatted": "^3.2.9", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "sirv": "^2.0.4" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.6.1" + } + }, + "node_modules/@vitest/utils": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils/node_modules/estree-walker": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vonage/accounts": { + "version": "1.18.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/server-client": "1.18.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/applications": { + "version": "1.18.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/server-client": "1.18.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/auth": { + "version": "1.14.0", + "license": "Apache-2.0", + "dependencies": { + "@vonage/jwt": "1.13.0", + "debug": "4.4.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/auth/node_modules/@vonage/jwt": { + "version": "1.13.0", + "license": "Apache-2.0", + "dependencies": { + "debug": "4.4.3", + "jsonwebtoken": "9.0.3", + "uuid": "13.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/auth/node_modules/uuid": { + "version": "13.0.0", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/@vonage/client-sdk-video": { + "version": "2.34.0", + "license": "https://www.vonage.com/legal/communications-apis/terms-of-use/" + }, + "node_modules/@vonage/conversations": { + "version": "1.12.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/messages": "1.22.1", + "@vonage/server-client": "1.18.1", + "@vonage/users": "1.12.1", + "@vonage/voice": "1.19.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/jwt": { + "version": "1.12.1", + "license": "Apache-2.0", + "dependencies": { + "debug": "4.3.4", + "jsonwebtoken": "9.0.2", + "uuid": "9.0.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/jwt/node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/jwt/node_modules/jsonwebtoken": { + "version": "9.0.2", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/@vonage/jwt/node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/@vonage/jwt/node_modules/jwa": { + "version": "1.4.2", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/@vonage/jwt/node_modules/jws": { + "version": "3.2.3", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.2", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/@vonage/jwt/node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/@vonage/messages": { + "version": "1.22.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/server-client": "1.18.1", + "@vonage/vetch": "1.9.1", + "debug": "4.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/messages/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/number-insights": { + "version": "1.18.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/auth": "1.13.1", + "@vonage/server-client": "1.18.1", + "@vonage/vetch": "1.9.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/number-insights/node_modules/@vonage/auth": { + "version": "1.13.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/jwt": "1.12.1", + "debug": "4.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/number-insights/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/numbers": { + "version": "1.20.1", + "license": "Apache-2.0", + "dependencies": { + "@types/lodash.omit": "4.5.9", + "@vonage/auth": "1.13.1", + "@vonage/server-client": "1.18.1", + "@vonage/vetch": "1.9.1", + "lodash.omit": "4.5.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/numbers/node_modules/@vonage/auth": { + "version": "1.13.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/jwt": "1.12.1", + "debug": "4.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/numbers/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/pricing": { + "version": "1.18.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/auth": "1.13.1", + "@vonage/server-client": "1.18.1", + "@vonage/vetch": "1.9.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/pricing/node_modules/@vonage/auth": { + "version": "1.13.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/jwt": "1.12.1", + "debug": "4.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/pricing/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/redact": { + "version": "1.17.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/server-client": "1.18.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/server-client": { + "version": "1.18.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/auth": "1.13.1", + "@vonage/vetch": "1.9.1", + "debug": "4.4.1", + "lodash.camelcase": "4.3.0", + "lodash.isobject": "3.0.2", + "lodash.kebabcase": "4.1.1", + "lodash.snakecase": "4.1.1", + "node-fetch": "2.7.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/server-client/node_modules/@vonage/auth": { + "version": "1.13.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/jwt": "1.12.1", + "debug": "4.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/server-client/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/server-sdk": { + "version": "3.25.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/accounts": "1.18.1", + "@vonage/applications": "1.18.1", + "@vonage/auth": "1.13.1", + "@vonage/conversations": "1.12.1", + "@vonage/messages": "1.22.1", + "@vonage/number-insights": "1.18.1", + "@vonage/numbers": "1.20.1", + "@vonage/pricing": "1.18.1", + "@vonage/redact": "1.17.1", + "@vonage/server-client": "1.18.1", + "@vonage/sms": "1.19.1", + "@vonage/users": "1.12.1", + "@vonage/verify": "1.18.1", + "@vonage/verify2": "1.17.1", + "@vonage/video": "1.26.1", + "@vonage/voice": "1.19.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/server-sdk/node_modules/@vonage/auth": { + "version": "1.13.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/jwt": "1.12.1", + "debug": "4.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/server-sdk/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/sms": { + "version": "1.19.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/auth": "1.13.1", + "@vonage/server-client": "1.18.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/sms/node_modules/@vonage/auth": { + "version": "1.13.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/jwt": "1.12.1", + "debug": "4.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/sms/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/users": { + "version": "1.12.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/server-client": "1.18.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/vcr-sdk": { + "version": "1.3.0", + "dependencies": { + "agentkeepalive": "^4.2.1", + "axios": "^1.2.1", + "express": "^4.17.2", + "form-data": "^4.0.0", + "glob": "^10.3.3", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.2" + } + }, + "node_modules/@vonage/vcr-sdk/node_modules/glob": { + "version": "10.5.0", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vonage/vcr-sdk/node_modules/minimatch": { + "version": "9.0.5", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vonage/vcr-sdk/node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@vonage/verify": { + "version": "1.18.1", + "license": "Apache-2.0", + "dependencies": { + "@types/lodash.omit": "4.5.9", + "@vonage/auth": "1.13.1", + "@vonage/server-client": "1.18.1", + "@vonage/vetch": "1.9.1", + "lodash.omit": "4.5.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/verify/node_modules/@vonage/auth": { + "version": "1.13.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/jwt": "1.12.1", + "debug": "4.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/verify/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/verify2": { + "version": "1.17.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/server-client": "1.18.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/vetch": { + "version": "1.9.1", + "license": "Apache-2.0", + "dependencies": { + "@types/node-fetch": "2.6.11", + "node-fetch": "2.7.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/video": { + "version": "1.26.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/auth": "1.13.1", + "@vonage/jwt": "1.12.1", + "@vonage/server-client": "1.18.1", + "@vonage/vetch": "1.9.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/video-client-network-test": { + "version": "5.0.0", + "license": "Apache-2.0", + "dependencies": { + "axios": "^1.8.3", + "opentok-solutions-logging": "^1.1.1", + "promise": "^8.0.1" + } + }, + "node_modules/@vonage/video/node_modules/@vonage/auth": { + "version": "1.13.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/jwt": "1.12.1", + "debug": "4.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/video/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/vivid": { + "version": "5.15.1", + "license": "Apache-2.0", + "dependencies": { + "@floating-ui/dom": "^1.7.6", + "@microsoft/fast-element": "2.8.3", + "@microsoft/fast-web-utilities": "^6.0.0", + "date-fns": "^3.0.0", + "dompurify": "^3.3.1", + "prosemirror-commands": "^1.7.1", + "prosemirror-dropcursor": "^1.8.2", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.4.1", + "prosemirror-inputrules": "^1.4.0", + "prosemirror-keymap": "^1.2.3", + "prosemirror-model": "^1.25.4", + "prosemirror-schema-basic": "^1.2.3", + "prosemirror-state": "^1.4.4", + "prosemirror-transform": "^1.11.0", + "prosemirror-view": "^1.41.6", + "ramda": "^0.32.0", + "uuid": "^11.1.0", + "vanilla-colorful": "^0.7.2", + "video.js": "^8.23.7" + } + }, + "node_modules/@vonage/vivid/node_modules/prosemirror-view": { + "version": "1.41.7", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/@vonage/vivid/node_modules/uuid": { + "version": "11.1.0", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/@vonage/voice": { + "version": "1.19.1", + "license": "Apache-2.0", + "dependencies": { + "@types/debug": "4.1.12", + "@vonage/server-client": "1.18.1", + "@vonage/vetch": "1.9.1", + "debug": "4.4.1", + "ts-xor": "1.3.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/voice/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.28", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.28", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "7.0.1", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.28", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.28", + "@vue/shared": "3.5.28" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "~2.4.11", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^0.4.9", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.28", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webcontainer/env": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@webpack-cli/configtest": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/abab": { + "version": "2.0.6", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/accepts": { + "version": "1.3.8", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adm-zip": { + "version": "0.5.16", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/aes-decrypter": { + "version": "4.0.2", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.1.1", + "global": "^4.4.0", + "pkcs7": "^1.0.4" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/ajv": { + "version": "8.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/alien-signals": { + "version": "0.4.14", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-timsort": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-types": { + "version": "0.16.1", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autolinker": { + "version": "4.1.5", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + }, + "engines": { + "pnpm": ">=10.10.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.24", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001766", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.1", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.16.0", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-const-enum": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-typescript": "^7.3.3", + "@babel/traverse": "^7.16.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/babel-plugin-macros/node_modules/yaml": { + "version": "1.10.2", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.6", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.6" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-transform-typescript-metadata": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.4", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/btoa": { + "version": "1.2.1", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001770", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chai": { + "version": "4.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai/node_modules/assertion-error": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/chokidar/node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/classnames": { + "version": "2.5.1", + "license": "MIT" + }, + "node_modules/clear-module": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^2.0.0", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clear-module/node_modules/parent-module": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "dev": true, + "license": "MIT" + }, + "node_modules/columnify": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/comment-json": { + "version": "4.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "array-timsort": "^1.0.3", + "core-util-is": "^1.0.3", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/compare-versions": { + "version": "6.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-with-sourcemaps": { + "version": "1.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/concurrently": { + "version": "9.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/confbox": { + "version": "0.1.8", + "dev": true, + "license": "MIT" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/cookies": { + "version": "0.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "13.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-parent": "^6.0.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2", + "tinyglobby": "^0.2.12" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.48.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.6", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/corser": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cron-parser": { + "version": "4.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "luxon": "^3.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cspell-config-lib": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-types": "9.6.4", + "comment-json": "^4.5.1", + "smol-toml": "^1.6.0", + "yaml": "^2.8.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-dictionary": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-performance-monitor": "9.6.4", + "@cspell/cspell-pipe": "9.6.4", + "@cspell/cspell-types": "9.6.4", + "cspell-trie-lib": "9.6.4", + "fast-equals": "^6.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-glob": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/url": "9.6.4", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-grammar": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-pipe": "9.6.4", + "@cspell/cspell-types": "9.6.4" + }, + "bin": { + "cspell-grammar": "bin.mjs" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-io": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-service-bus": "9.6.4", + "@cspell/url": "9.6.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-lib": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-bundled-dicts": "9.6.4", + "@cspell/cspell-performance-monitor": "9.6.4", + "@cspell/cspell-pipe": "9.6.4", + "@cspell/cspell-resolver": "9.6.4", + "@cspell/cspell-types": "9.6.4", + "@cspell/dynamic-import": "9.6.4", + "@cspell/filetypes": "9.6.4", + "@cspell/rpc": "9.6.4", + "@cspell/strong-weak-map": "9.6.4", + "@cspell/url": "9.6.4", + "clear-module": "^4.1.2", + "cspell-config-lib": "9.6.4", + "cspell-dictionary": "9.6.4", + "cspell-glob": "9.6.4", + "cspell-grammar": "9.6.4", + "cspell-io": "9.6.4", + "cspell-trie-lib": "9.6.4", + "env-paths": "^4.0.0", + "gensequence": "^8.0.8", + "import-fresh": "^3.3.1", + "resolve-from": "^5.0.0", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-uri": "^3.1.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-trie-lib": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@cspell/cspell-types": "9.6.4" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "dev": true, + "license": "MIT" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/cssstyle": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-urls": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "3.6.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/date-format": { + "version": "4.0.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/de-indent": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debuglog": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dedent": { + "version": "1.7.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-port": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "8.0.3", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2" + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "3.3.3", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/easy-cancelable-promise": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.286", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/empathic": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.19.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-safe-filename": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/envinfo": { + "version": "7.21.0", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.1", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.27.3", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-context": { + "version": "0.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "get-tsconfig": "^4.10.1", + "stable-hash-x": "^0.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-context" + }, + "peerDependencies": { + "unrs-resolver": "^1.0.0" + }, + "peerDependenciesMeta": { + "unrs-resolver": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "4.4.4", + "dev": true, + "license": "ISC", + "dependencies": { + "debug": "^4.4.1", + "eslint-import-context": "^0.1.8", + "get-tsconfig": "^4.10.1", + "is-bun-module": "^2.0.0", + "stable-hash-x": "^0.2.0", + "tinyglobby": "^0.2.14", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^16.17.0 || >=18.6.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-filename-rules": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { + "version": "3.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.1", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.1.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.5", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.11.12" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-tailwindcss": { + "version": "4.0.0-beta.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.5", + "postcss": "^8.4.4", + "synckit": "^0.11.4", + "tailwind-api-utils": "^1.0.3" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "tailwindcss": "^3.4.0 || ^4.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/@eslint/js": { + "version": "8.57.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/mimic-fn": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/npm-run-path": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/onetime": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/exenv-es6": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/exit": { + "version": "0.1.2", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/exit-x": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.22.1", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/cookie-signature": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/exsolve": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-equals": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fflate": { + "version": "0.8.2", + "dev": true, + "license": "MIT" + }, + "node_modules/figures": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/find-file-up": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-pkg": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-file-up": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/format": { + "version": "0.2.2", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/formidable": { + "version": "3.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/framer-motion": { + "version": "12.38.0", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.38.0", + "motion-utils": "^12.36.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/front-matter": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/generic-names": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^3.2.0" + } + }, + "node_modules/gensequence": { + "version": "8.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-them-args": { + "version": "1.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/get-tsconfig": { + "version": "4.13.6", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global": { + "version": "4.4.0", + "license": "MIT", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/global-directory": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "dev": true, + "license": "(Apache-2.0 OR MPL-1.1)" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/highlightjs-vue": { + "version": "1.0.0", + "license": "CC0-1.0" + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "dev": true, + "license": "ISC" + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/http-assert": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-assert/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/http-errors": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/statuses": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.15", + "debug": "^4.3.6", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.3", + "is-plain-object": "^5.0.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/http-server": { + "version": "14.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/i18next": { + "version": "25.8.8", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4" + }, + "peerDependencies": { + "typescript": "^5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/i18next-browser-languagedetector": { + "version": "8.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "4.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ip-regex": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-reference": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-safe-filename": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-url": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is2": { + "version": "2.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" + }, + "engines": { + "node": ">=v0.10.0" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/jest-changed-files/node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-circus/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/jest-resolve": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-diff/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-diff/node_modules/@sinclair/typebox": { + "version": "0.34.48", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/pretty-format": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-diff/node_modules/react-is": { + "version": "18.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-docblock": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-environment-node/node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-haste-map/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-haste-map/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/jest-diff": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock/node_modules/@sinclair/typebox": { + "version": "0.34.48", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-mock/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-mock/node_modules/ci-info": { + "version": "4.4.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@sinclair/typebox": { + "version": "0.34.48", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-resolve/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/ci-info": { + "version": "4.4.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/jest-haste-map": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/jest-resolve/node_modules/jest-regex-util": { + "version": "30.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/jest-validate": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/jest-worker": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/pretty-format": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/react-is": { + "version": "18.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-resolve/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-runner/node_modules/jest-docblock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-resolve": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-resolve": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-diff": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-util/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-watcher/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-worker/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jiti": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js-yaml/node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/jsdom": { + "version": "22.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "cssstyle": "^3.0.0", + "data-urls": "^4.0.0", + "decimal.js": "^10.4.3", + "domexception": "^4.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.4", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.1", + "ws": "^8.13.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "8.19.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-storage-formatter": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keygrip": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kill-port": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-them-args": "1.3.2", + "shell-exec": "1.0.2" + }, + "bin": { + "kill-port": "cli.js" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/koa": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^1.3.8", + "content-disposition": "~0.5.4", + "content-type": "^1.0.5", + "cookies": "~0.9.1", + "delegates": "^1.0.0", + "destroy": "^1.2.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.5.0", + "http-errors": "^2.0.0", + "koa-compose": "^4.1.0", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/koa-compose": { + "version": "4.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/koa/node_modules/media-typer": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/koa/node_modules/mime-db": { + "version": "1.54.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/mime-types": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/koa/node_modules/type-is": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/license-checker": { + "version": "25.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "chalk": "^2.4.1", + "debug": "^3.1.0", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "read-installed": "~4.0.3", + "semver": "^5.5.0", + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0", + "spdx-satisfies": "^4.0.0", + "treeify": "^1.1.0" + }, + "bin": { + "license-checker": "bin/license-checker" + } + }, + "node_modules/license-checker/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/license-checker/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/license-checker/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/license-checker/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/license-checker/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/license-checker/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/license-checker/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/license-checker/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/loader-utils": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/local-pkg/node_modules/confbox": { + "version": "0.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg/node_modules/pathe": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg/node_modules/pkg-types": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "license": "MIT" + }, + "node_modules/lodash.clonedeepwith": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/lodash.isobject": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "license": "MIT" + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.omit": { + "version": "4.5.0", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "license": "MIT" + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/long-timeout": { + "version": "0.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowlight": { + "version": "1.20.0", + "license": "MIT", + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "license": "ISC" + }, + "node_modules/lunr": { + "version": "2.3.9", + "dev": true, + "license": "MIT" + }, + "node_modules/luxon": { + "version": "3.7.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/m3u8-parser": { + "version": "7.2.0", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.1.1", + "global": "^4.4.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/markdown-it": { + "version": "14.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-document": { + "version": "2.19.2", + "license": "MIT", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "dev": true, + "license": "MIT", + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/minimatch": { + "version": "10.2.0", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimatch/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/minimatch/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mlly": { + "version": "1.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/pathe": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/motion": { + "version": "12.38.0", + "license": "MIT", + "dependencies": { + "framer-motion": "^12.38.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/motion-dom": { + "version": "12.38.0", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.36.0" + } + }, + "node_modules/motion-utils": { + "version": "12.36.0", + "license": "MIT" + }, + "node_modules/mpd-parser": { + "version": "1.3.1", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.0.0", + "@xmldom/xmldom": "^0.8.3", + "global": "^4.4.0" + }, + "bin": { + "mpd-to-m3u8-json": "bin/parse.js" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/mux.js": { + "version": "7.1.0", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.11.2", + "global": "^4.4.0" + }, + "bin": { + "muxjs-transmux": "bin/transmux.js" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-machine-id": { + "version": "1.1.12", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "dev": true, + "license": "MIT" + }, + "node_modules/node-schedule": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cron-parser": "^4.2.0", + "long-timeout": "0.1.1", + "sorted-array-functions": "^1.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nodemon": { + "version": "3.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nonce": { + "version": "1.0.4", + "license": "Free as in Hugs", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/nopt": { + "version": "4.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.23", + "dev": true, + "license": "MIT" + }, + "node_modules/nx": { + "version": "22.5.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@napi-rs/wasm-runtime": "0.2.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.2", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.12.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "ignore": "^7.0.5", + "jest-diff": "^30.0.2", + "jsonc-parser": "3.2.0", + "lines-and-columns": "2.0.3", + "minimatch": "10.1.1", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "picocolors": "^1.1.0", + "resolve.exports": "2.0.3", + "semver": "^7.6.3", + "string-width": "^4.2.3", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tree-kill": "^1.2.2", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yaml": "^2.6.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "22.5.1", + "@nx/nx-darwin-x64": "22.5.1", + "@nx/nx-freebsd-x64": "22.5.1", + "@nx/nx-linux-arm-gnueabihf": "22.5.1", + "@nx/nx-linux-arm64-gnu": "22.5.1", + "@nx/nx-linux-arm64-musl": "22.5.1", + "@nx/nx-linux-x64-gnu": "22.5.1", + "@nx/nx-linux-x64-musl": "22.5.1", + "@nx/nx-win32-arm64-msvc": "22.5.1", + "@nx/nx-win32-x64-msvc": "22.5.1" + }, + "peerDependencies": { + "@swc-node/register": "1.11.1", + "@swc/core": "1.15.8" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/nx/node_modules/dotenv": { + "version": "16.4.7", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/nx/node_modules/ignore": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/nx/node_modules/minimatch": { + "version": "10.1.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oniguruma-to-es": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^5.1.1", + "regex-recursion": "^5.1.1" + } + }, + "node_modules/open": { + "version": "8.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/opentok": { + "version": "2.22.0", + "license": "MIT", + "dependencies": { + "@vonage/jwt": "1.11.0", + "debug": "4.4.0", + "jsonwebtoken": "9.0.2", + "lodash": "4.17.21", + "node-fetch": "2.7.0", + "opentok-token": "1.1.1", + "uuid": "11.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opentok-jwt": { + "version": "0.1.5", + "license": "MIT", + "dependencies": { + "jsonwebtoken": "^9.0.0" + } + }, + "node_modules/opentok-layout-js": { + "version": "5.5.0", + "license": "MIT" + }, + "node_modules/opentok-solutions-logging": { + "version": "1.1.5", + "license": "MIT", + "dependencies": { + "axios": "^1.6.3" + } + }, + "node_modules/opentok-token": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.11", + "nonce": "^1.0.3", + "unix-timestamp": "^0.1.2" + } + }, + "node_modules/opentok/node_modules/@vonage/jwt": { + "version": "1.11.0", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.3.4", + "jsonwebtoken": "^9.0.2", + "uuid": "^9.0.1" + } + }, + "node_modules/opentok/node_modules/@vonage/jwt/node_modules/debug": { + "version": "4.4.3", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/opentok/node_modules/@vonage/jwt/node_modules/jsonwebtoken": { + "version": "9.0.3", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/opentok/node_modules/@vonage/jwt/node_modules/jwa": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/opentok/node_modules/@vonage/jwt/node_modules/jws": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/opentok/node_modules/@vonage/jwt/node_modules/uuid": { + "version": "9.0.1", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/opentok/node_modules/debug": { + "version": "4.4.0", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/opentok/node_modules/jsonwebtoken": { + "version": "9.0.2", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/opentok/node_modules/jwa": { + "version": "1.4.2", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/opentok/node_modules/jws": { + "version": "3.2.3", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.2", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/opentok/node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/opentok/node_modules/uuid": { + "version": "11.0.5", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/cli-spinners": { + "version": "2.9.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/orderedmap": { + "version": "2.1.1", + "license": "MIT" + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "dev": true, + "license": "ISC", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkcs7": { + "version": "1.0.4", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.5.5" + }, + "bin": { + "pkcs7": "bin/cli.js" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/pkg-types/node_modules/pathe": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/playwright": { + "version": "1.46.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.46.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.46.0", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/portfinder": { + "version": "1.0.38", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.6", + "debug": "^4.3.6" + }, + "engines": { + "node": ">= 10.12" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "generic-names": "^4.0.0", + "icss-utils": "^5.1.0", + "lodash.camelcase": "^4.3.0", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "string-hash": "^1.1.3" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/prismjs": { + "version": "1.30.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/promise": { + "version": "8.3.0", + "license": "MIT", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/prosemirror-commands": { + "version": "1.7.1", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.10.2" + } + }, + "node_modules/prosemirror-dropcursor": { + "version": "1.8.2", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "node_modules/prosemirror-gapcursor": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "node_modules/prosemirror-history": { + "version": "1.5.0", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.31.0", + "rope-sequence": "^1.3.0" + } + }, + "node_modules/prosemirror-inputrules": { + "version": "1.5.1", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-keymap": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "node_modules/prosemirror-model": { + "version": "1.25.4", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-schema-basic": { + "version": "1.2.4", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.25.0" + } + }, + "node_modules/prosemirror-state": { + "version": "1.4.4", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" + } + }, + "node_modules/prosemirror-transform": { + "version": "1.11.0", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.21.0" + } + }, + "node_modules/prosemirror-view": { + "version": "1.41.6", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/psl": { + "version": "1.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.2", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/querystringify": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/rambda": { + "version": "9.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/ramda": { + "version": "0.32.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "19.2.4", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-docgen": { + "version": "8.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@types/babel__core": "^7.20.5", + "@types/babel__traverse": "^7.20.7", + "@types/doctrine": "^0.0.9", + "@types/resolve": "^1.20.2", + "doctrine": "^3.0.0", + "resolve": "^1.22.1", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": "^20.9.0 || >=22" + } + }, + "node_modules/react-docgen-typescript": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": ">= 4.3.x" + } + }, + "node_modules/react-docgen/node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/react-docgen/node_modules/strip-indent": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-global-state-hooks": { + "version": "15.0.15", + "license": "MIT", + "dependencies": { + "json-storage-formatter": "^3.0.2", + "react-hooks-global-states": "^15.0.16" + }, + "peerDependencies": { + "json-storage-formatter": "^3.0.2", + "react": ">=18.0.0" + }, + "peerDependenciesMeta": { + "json-storage-formatter": { + "optional": false + }, + "react": { + "optional": false + } + } + }, + "node_modules/react-hooks-global-states": { + "version": "15.0.16", + "license": "MIT", + "dependencies": { + "json-storage-formatter": "^3.0.2" + }, + "peerDependencies": { + "json-storage-formatter": "^3.0.2", + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + }, + "peerDependenciesMeta": { + "json-storage-formatter": { + "optional": false + }, + "react": { + "optional": false + } + } + }, + "node_modules/react-i18next": { + "version": "15.7.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.27.6", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 23.4.0", + "react": ">= 16.8.0", + "typescript": "^5" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.30.3", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.3", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2", + "react-router": "6.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-syntax-highlighter": { + "version": "16.1.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", + "lowlight": "^1.17.0", + "prismjs": "^1.30.0", + "refractor": "^5.0.0" + }, + "engines": { + "node": ">= 16.20.2" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/read-installed": { + "version": "4.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "debuglog": "^1.0.1", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.2" + } + }, + "node_modules/read-installed/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-package-json": { + "version": "2.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-scoped-modules": { + "version": "1.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/recast": { + "version": "0.23.11", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/refractor": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/prismjs": "^1.0.0", + "hastscript": "^9.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regex": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "regex": "^5.1.1", + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.11", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.57.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-typescript2": { + "version": "0.36.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^4.1.2", + "find-cache-dir": "^3.3.2", + "fs-extra": "^10.0.0", + "semver": "^7.5.4", + "tslib": "^2.6.2" + }, + "peerDependencies": { + "rollup": ">=1.26.3", + "typescript": ">=2.4.0" + } + }, + "node_modules/rollup-plugin-typescript2/node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/rollup-plugin-typescript2/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/rollup-plugin-typescript2/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/rope-sequence": { + "version": "1.3.4", + "license": "MIT" + }, + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/secure-compare": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.2", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.16.3", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-exec": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shiki": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "1.29.2", + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/langs": "1.29.2", + "@shikijs/themes": "1.29.2", + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sirv": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slide": { + "version": "1.1.6", + "dev": true, + "license": "ISC", + "engines": { + "node": "*" + } + }, + "node_modules/smol-toml": { + "version": "1.6.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sorted-array-functions": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdx-compare": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-find-index": "^1.0.2", + "spdx-expression-parse": "^3.0.0", + "spdx-ranges": "^2.0.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/spdx-ranges": { + "version": "2.1.1", + "dev": true, + "license": "(MIT AND CC-BY-3.0)" + }, + "node_modules/spdx-satisfies": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-compare": "^1.0.0", + "spdx-expression-parse": "^3.0.0", + "spdx-ranges": "^2.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stable-hash-x": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/status-code-enum": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.10.0", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/storybook": { + "version": "10.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/icons": "^2.0.1", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/user-event": "^14.6.1", + "@vitest/expect": "3.2.4", + "@vitest/spy": "3.2.4", + "@webcontainer/env": "^1.1.1", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0", + "open": "^10.2.0", + "recast": "^0.23.5", + "semver": "^7.7.3", + "use-sync-external-store": "^1.5.0", + "ws": "^8.18.0" + }, + "bin": { + "storybook": "dist/bin/dispatcher.js" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "prettier": "^2 || ^3" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/storybook/node_modules/@vitest/expect": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/storybook/node_modules/@vitest/spy": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/storybook/node_modules/@vitest/utils": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/storybook/node_modules/chai": { + "version": "5.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/storybook/node_modules/check-error": { + "version": "2.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/storybook/node_modules/deep-eql": { + "version": "5.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/storybook/node_modules/define-lazy-prop": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/storybook/node_modules/loupe": { + "version": "3.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/storybook/node_modules/open": { + "version": "10.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/storybook/node_modules/pathval": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/storybook/node_modules/tinyspy": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/storybook/node_modules/ws": { + "version": "8.19.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/streamroller/node_modules/fs-extra": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/streamroller/node_modules/jsonfile": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/streamroller/node_modules/universalify": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-hash": { + "version": "1.1.3", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/string-length": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/stylis": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/superagent": { + "version": "10.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.1", + "cookiejar": "^2.1.4", + "debug": "^4.3.7", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.5", + "formidable": "^3.5.4", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.14.1" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/qs": { + "version": "6.15.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/supertest": { + "version": "7.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cookie-signature": "^1.2.2", + "methods": "^1.1.2", + "superagent": "^10.3.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/synckit": { + "version": "0.11.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/tailwind-api-utils": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "local-pkg": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/hyoban" + }, + "peerDependencies": { + "tailwindcss": "^3.3.0 || ^4.0.0 || ^4.0.0-beta" + } + }, + "node_modules/tailwind-api-utils/node_modules/jiti": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/tailwind-merge": { + "version": "3.4.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwind-variants": { + "version": "3.2.2", + "license": "MIT", + "engines": { + "node": ">=16.x", + "pnpm": ">=7.x" + }, + "peerDependencies": { + "tailwind-merge": ">=3.0.0", + "tailwindcss": "*" + }, + "peerDependenciesMeta": { + "tailwind-merge": { + "optional": true + } + } + }, + "node_modules/tailwindcss": { + "version": "4.1.18", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tcp-port-used": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4.3.1", + "is2": "^2.0.6" + } + }, + "node_modules/tcp-port-used/node_modules/debug": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/tcp-port-used/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/terser": { + "version": "5.46.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.16", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "0.8.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/treeify": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/ts-jest": { + "version": "29.4.6", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.3", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ts-loader": { + "version": "9.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.6", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ts-xor": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "license": "0BSD" + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.x" + } + }, + "node_modules/tsx": { + "version": "4.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedoc": { + "version": "0.26.11", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "shiki": "^1.16.2", + "yaml": "^2.5.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.55.0", + "@typescript-eslint/parser": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/utils": "8.55.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.41", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.6.3", + "dev": true, + "license": "MIT" + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.21.0", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/union": { + "version": "0.5.0", + "dev": true, + "dependencies": { + "qs": "^6.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/union/node_modules/qs": { + "version": "6.15.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unix-timestamp": { + "version": "0.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unplugin": { + "version": "2.3.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/upath": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/url-parse": { + "version": "1.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/util-extend": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vanilla-colorful": { + "version": "0.7.2", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/video.js": { + "version": "8.23.7", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@videojs/http-streaming": "^3.17.3", + "@videojs/vhs-utils": "^4.1.1", + "@videojs/xhr": "2.7.0", + "aes-decrypter": "^4.0.2", + "global": "4.4.0", + "m3u8-parser": "^7.2.0", + "mpd-parser": "^1.3.1", + "mux.js": "^7.0.1", + "videojs-contrib-quality-levels": "4.1.0", + "videojs-font": "4.2.0", + "videojs-vtt.js": "0.15.5" + } + }, + "node_modules/videojs-contrib-quality-levels": { + "version": "4.1.0", + "license": "Apache-2.0", + "dependencies": { + "global": "^4.4.0" + }, + "engines": { + "node": ">=16", + "npm": ">=8" + }, + "peerDependencies": { + "video.js": "^8" + } + }, + "node_modules/videojs-font": { + "version": "4.2.0", + "license": "Apache-2.0" + }, + "node_modules/videojs-vtt.js": { + "version": "0.15.5", + "license": "Apache-2.0", + "dependencies": { + "global": "^4.3.1" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-plugin-checker": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "chokidar": "^4.0.3", + "npm-run-path": "^6.0.0", + "picocolors": "^1.1.1", + "picomatch": "^4.0.3", + "tiny-invariant": "^1.3.3", + "tinyglobby": "^0.2.14", + "vscode-uri": "^3.1.0" + }, + "engines": { + "node": ">=16.11" + }, + "peerDependencies": { + "@biomejs/biome": ">=1.7", + "eslint": ">=7", + "meow": "^13.2.0", + "optionator": "^0.9.4", + "oxlint": ">=1", + "stylelint": ">=16", + "typescript": "*", + "vite": ">=5.4.20", + "vls": "*", + "vti": "*", + "vue-tsc": "~2.2.10 || ^3.0.0" + }, + "peerDependenciesMeta": { + "@biomejs/biome": { + "optional": true + }, + "eslint": { + "optional": true + }, + "meow": { + "optional": true + }, + "optionator": { + "optional": true + }, + "oxlint": { + "optional": true + }, + "stylelint": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vls": { + "optional": true + }, + "vti": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/vite-plugin-checker/node_modules/chokidar": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/vite-plugin-checker/node_modules/npm-run-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-checker/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-dts": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor": "^7.50.1", + "@rollup/pluginutils": "^5.1.4", + "@volar/typescript": "^2.4.11", + "@vue/language-core": "2.2.0", + "compare-versions": "^6.1.1", + "debug": "^4.4.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17" + }, + "peerDependencies": { + "typescript": "*", + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitest": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "1.6.1", + "@vitest/runner": "1.6.1", + "@vitest/snapshot": "1.6.1", + "@vitest/spy": "1.6.1", + "@vitest/utils": "1.6.1", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.3", + "vite": "^5.0.0", + "vite-node": "1.6.1", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.6.1", + "@vitest/ui": "1.6.1", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/local-pkg": { + "version": "0.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.3", + "pkg-types": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "license": "MIT" + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/webpack": { + "version": "5.105.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.19.0", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.6.1", + "@webpack-cli/configtest": "^3.0.1", + "@webpack-cli/info": "^3.0.1", + "@webpack-cli/serve": "^3.0.1", + "colorette": "^2.0.14", + "commander": "^12.1.0", + "cross-spawn": "^7.0.3", + "envinfo": "^7.14.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^6.0.1" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.82.0" + }, + "peerDependenciesMeta": { + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "12.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "12.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/package.json b/tutorials/vonage_video_react_app-feature-config/project/package.json index a0612056..6e78b87c 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/package.json +++ b/tutorials/vonage_video_react_app-feature-config/project/package.json @@ -10,7 +10,7 @@ "scripts": { "prepare": "husky", "postinstall": "nx postinstall integration-tests", - "generate:tokens": "npx tsx scripts/generateTokens.ts", + "sync:theme-tokens": "npx tsx scripts/generateTokens.ts", "quality-check": "npx tsx scripts/qualityCheck.ts", "build": "npx tsx scripts/build.ts", "dev": "npx tsx scripts/dev.ts", @@ -28,19 +28,21 @@ "test:core": "npx tsx scripts/testLibs.ts core", "test:ui": "npx tsx scripts/testLibs.ts ui", "test:common": "npx tsx scripts/testLibs.ts common", - "ts-check": "nx run-many --target=ts-check", + "ts-check": "npx tsx scripts/tsCheck.ts", "vcr:dev": "npx tsx scripts/vcrDev.ts" }, "scriptsInfo": { - "build": "Build projects. Usage: 'yarn build' (frontend+backend), 'yarn build frontend', 'yarn build backend', 'yarn build room' (VeraRoom web component)", - "dev": "Run dev servers. Usage: 'yarn dev' (frontend+backend), 'yarn dev frontend', 'yarn dev backend', 'yarn dev room' (Storybook for VeraRoom)", + "build": "Build projects. Usage: 'yarn build' (frontend+backend), 'yarn build frontend', 'yarn build backend', 'yarn build room' (VeraRoom artifact), 'yarn build room zip' (zip VeraRoom artifact)", + "dev": "Run dev servers. Usage: 'yarn dev' (frontend+backend), 'yarn dev frontend', 'yarn dev backend', 'yarn dev debug' (--inspect), 'yarn dev debug wait' (--inspect-brk), 'yarn dev room' (VeraRoom example), 'yarn dev studio' (Vera Studio + backend + Storybook)", + "sync:theme-tokens": "Sync theme token artifacts. Usage: 'yarn sync:theme-tokens'. Always regenerates designTokens.example.json, uses root designTokens.json as source of truth when present, bootstraps root designTokens.json from defaults when missing, rebuilds veraUI.cjs, and runs Prettier on the generated plugin file.", "lint:fix": "Format and lint fix (workspace-wide by default). Optionally scope to a single Nx project: 'yarn lint:fix '", - "quality-check": "Run ts-check + lint + prettier check (workspace-wide by default). Optionally scope to a single Nx project: 'yarn quality-check '", - "start": "Start production build. Usage: 'yarn start' (build frontend + start backend), 'yarn start room' (build and serve VeraRoom example)", + "quality-check": "Run ts-check + lint + prettier check (workspace-wide by default). Optionally scope to a single project alias: 'yarn quality-check frontend', 'yarn quality-check studio'", + "ts-check": "Run TypeScript checks (workspace-wide by default). Optionally scope to a single project alias: 'yarn ts-check frontend', 'yarn ts-check studio'", + "start": "Start production build. Usage: 'yarn start' (build frontend + start backend), 'yarn start room' (build VeraRoom artifact + example and serve example)", "start:backend": "Run backend server. Usage: 'yarn start:backend' (dev mode), 'yarn start:backend debug' (debug mode), 'yarn start:backend bundled' (bundled dev mode)", "test:backend": "Run backend tests. Usage: 'yarn test:backend' (all), 'yarn test:backend ' (specific), 'yarn test:backend watch ' (watch mode), 'yarn test:backend debug ' (debug mode)", "test:frontend": "Run frontend tests. Usage: 'yarn test:frontend' (all), 'yarn test:frontend ' (specific), 'yarn test:frontend watch ' (watch mode), 'yarn test:frontend debug ' (debug mode)", - "test:integration": "Run Playwright tests. Usage: 'yarn test:integration' (all browsers), 'yarn test:integration ' (headed), 'yarn test:integration debug|inspect|canon [name]', 'yarn test:integration update [name]' (screenshots)", + "test:integration": "Run integration tests. Usage: 'yarn test:integration' (all), 'yarn test:integration api' (API/Jest only), 'yarn test:integration playwright' (Playwright only), 'yarn test:integration ' (headed), 'yarn test:integration debug|inspect|canon [name]', 'yarn test:integration update [name]' (screenshots)", "vcr:dev": "Manage VCR dev instance. Usage: 'yarn vcr:dev' (deploy), 'yarn vcr:dev rm' or 'yarn vcr:dev --rm' (remove instance). Note: Copy vcr.yml.example as vcr-dev.yml and add your application ID before deploying" }, "repository": { @@ -48,152 +50,159 @@ "url": "git+https://github.com/Vonage/vonage-video-react-app.git" }, "author": "", + "contributors": [ + "Hossein Movahed ", + "Johnny Esteban Quesada ", + "Oscar Fava " + ], "license": "MIT", "bugs": { "url": "https://github.com/Vonage/vonage-video-react-app/issues" }, "homepage": "https://github.com/Vonage/vonage-video-react-app#readme", "devDependencies": { - "@cspell/eslint-plugin": "^9.3.0", - "@eslint/js": "^9.39.1", - "@jest/globals": "^29.7.0", + "@cspell/eslint-plugin": "9.6.4", + "@eslint/js": "9.39.2", + "@jest/globals": "29.7.0", "@nx/eslint": "22.0.1", - "@nx/eslint-plugin": "^22.1.3", + "@nx/eslint-plugin": "22.5.1", "@nx/jest": "22.0.1", "@nx/js": "22.0.1", "@nx/node": "22.0.1", - "@nx/react": "^22.2.0", - "@nx/vite": "^22.0.1", + "@nx/react": "22.5.1", + "@nx/vite": "22.5.1", "@playwright/test": "1.46.0", - "@rollup/plugin-replace": "^5.0.7", - "@storybook/react": "^10.1.11", - "@storybook/react-vite": "^10.1.11", - "@tailwindcss/vite": "^4.1.18", + "@rollup/plugin-replace": "5.0.7", + "@storybook/react": "10.3.5", + "@storybook/react-vite": "10.3.5", + "@tailwindcss/vite": "4.1.18", "@testing-library/dom": "10.4.0", - "@testing-library/jest-dom": "^6.6.3", + "@testing-library/jest-dom": "6.9.1", "@testing-library/react": "16.3.0", - "@testing-library/user-event": "^14.6.1", - "@types/body-parser": "^1.19.2", - "@types/cors": "^2.8.13", - "@types/express": "^4.17.17", - "@types/jest": "^29.5.12", - "@types/lodash": "^4.17.1", + "@testing-library/user-event": "14.6.1", + "@types/body-parser": "1.19.6", + "@types/cors": "2.8.19", + "@types/express": "4.17.25", + "@types/jest": "29.5.14", + "@types/jsonwebtoken": "9.0.10", "@types/node": "20.19.9", - "@types/opentok": "^2.14.0", - "@types/react": "^19.2.7", - "@types/react-dom": "^19.2.3", - "@types/supertest": "^6.0.2", - "@types/ua-parser-js": "^0.7.39", - "@types/validator": "^13.15.2", - "@typescript-eslint/eslint-plugin": "^8.30.1", - "@typescript-eslint/parser": "^8.30.1", - "@vitejs/plugin-react": "^5.1.2", - "@vitejs/plugin-react-swc": "^4.2.2", - "@vitest/coverage-v8": "^1.0.4", - "@vitest/ui": "^1.3.1", - "concurrently": "^9.1.2", - "copy-webpack-plugin": "^13.0.1", - "eslint": "^8", - "eslint-config-prettier": "^10.1.8", - "eslint-import-resolver-node": "^0.3.9", - "eslint-import-resolver-typescript": "^4.4.4", - "eslint-plugin-filename-rules": "^1.3.1", - "eslint-plugin-import": "^2.32.0", + "@types/opentok": "2.14.4", + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3", + "@types/react-syntax-highlighter": "15.5.13", + "@types/supertest": "6.0.3", + "@types/ua-parser-js": "0.7.39", + "@typescript-eslint/eslint-plugin": "8.55.0", + "@typescript-eslint/parser": "8.55.0", + "@vitejs/plugin-react": "5.1.4", + "@vitejs/plugin-react-swc": "4.2.3", + "@vitest/coverage-v8": "1.6.1", + "@vitest/ui": "1.6.1", + "concurrently": "9.2.1", + "copy-webpack-plugin": "13.0.1", + "eslint": "8.57.1", + "eslint-config-prettier": "10.1.8", + "eslint-import-resolver-node": "0.3.9", + "eslint-import-resolver-typescript": "4.4.4", + "eslint-plugin-filename-rules": "1.3.1", + "eslint-plugin-import": "2.32.0", "eslint-plugin-jsx-a11y": "6.10.1", - "eslint-plugin-prettier": "^5.5.4", - "eslint-plugin-react": "^7.37.5", - "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-refresh": "^0.4.6", + "eslint-plugin-prettier": "5.5.5", + "eslint-plugin-react": "7.37.5", + "eslint-plugin-react-hooks": "7.0.1", + "eslint-plugin-react-refresh": "0.4.26", "eslint-plugin-tailwindcss": "4.0.0-beta.0", - "husky": "^9.0.11", - "jest": "^29.7.0", + "husky": "9.1.7", + "jest": "29.7.0", "jiti": "2.4.2", - "jsdom": "~22.1.0", - "license-checker": "^25.0.1", - "minimatch": "^10.1.1", - "nodemon": "^3.1.10", - "nx": "^22.0.3", - "prettier": "^3.6.2", - "storybook": "^10.1.11", - "supertest": "^7.0.0", - "tailwindcss": "^4.1.18", - "terser": "^5.46.0", - "ts-jest": "^29.2.5", - "ts-loader": "^9.5.4", - "tslib": "^2.3.0", - "tsx": "^4.10.5", - "typedoc": "^0.26.10", - "typescript": "^5.8.3", - "typescript-eslint": "^8.46.4", - "vite": "^5.4.19", - "vite-plugin-checker": "^0.11.0", - "vite-plugin-dts": "~4.5.0", - "vitest": "^1.6", - "webpack": "^5.104.0", - "webpack-cli": "^6.0.1" + "jsdom": "22.1.0", + "license-checker": "25.0.1", + "minimatch": "10.2.0", + "nodemon": "3.1.11", + "nx": "22.5.1", + "prettier": "3.8.1", + "storybook": "10.3.5", + "supertest": "7.2.2", + "tailwindcss": "4.1.18", + "terser": "5.46.0", + "ts-jest": "29.4.6", + "ts-loader": "9.5.4", + "tslib": "2.8.1", + "tsx": "4.21.0", + "typedoc": "0.26.11", + "typescript": "5.9.3", + "typescript-eslint": "8.55.0", + "vite": "5.4.21", + "vite-plugin-checker": "0.11.0", + "vite-plugin-dts": "4.5.4", + "vitest": "1.6.1", + "webpack": "5.105.2", + "webpack-cli": "6.0.1" }, "resolutions": { "wrap-ansi": "7.0.0", - "path-to-regexp": "^0.1.12", - "express": "^4.21.2", - "axios": "^1.13.5", - "cross-spawn": "^7.0.5", - "rollup": "^4.22.4", - "vite": "^5.4.19", - "nanoid": "^3.3.8", - "micromatch": "^4.0.8", - "@babel/helpers": "^7.27.0", - "@babel/runtime": "^7.26.10", + "path-to-regexp": "0.1.12", + "express": "4.22.1", + "axios": "1.16.0", + "cross-spawn": "7.0.6", + "rollup": "4.57.1", + "vite": "5.4.21", + "nanoid": "3.3.11", + "micromatch": "4.0.8", + "@babel/helpers": "7.28.6", + "@babel/runtime": "7.28.6", "brace-expansion": "2.0.2", - "form-data": "^4.0.4" + "form-data": "4.0.5" }, - "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e", "dependencies": { - "@emotion/css": "^11.11.2", - "@emotion/react": "^11.11.4", - "@emotion/styled": "^11.11.5", - "@mui/icons-material": "^5.17.1", - "@mui/joy": "^5.0.0-beta.36", - "@mui/material": "^5.17.1", - "@vonage/auth": "^1.13.1", - "@vonage/client-sdk-video": "2.32.1", + "@emotion/css": "11.13.5", + "@emotion/react": "11.14.0", + "@emotion/styled": "11.14.1", + "@mui/icons-material": "9.0.0", + "@mui/material": "9.0.0", + "@trpc/client": "11.11.0", + "@trpc/server": "11.11.0", + "@tanstack/react-query": "5.99.0", + "@vonage/auth": "1.14.0", + "@vonage/client-sdk-video": "2.34.0", "@vonage/server-sdk": "3.25.1", "@vonage/vcr-sdk": "1.3.0", "@vonage/video": "1.26.1", - "@vonage/video-client-network-test": "^5.0.0", - "@vonage/vivid": "^5.15.1", - "autolinker": "^4.0.0", - "axios": "^1.13.5", - "body-parser": "^1.20.3", - "classnames": "^2.5.1", - "cors": "^2.8.5", - "dotenv": "^16.0.3", - "easy-cancelable-promise": "^2.0.0", - "events": "^3.3.0", - "express": "^4.21.2", - "form-data": "^4.0.4", - "i18next": "^25.3.2", - "i18next-browser-languagedetector": "^8.2.0", - "json-storage-formatter": "^3.0.2", - "lodash": "^4.17.21", - "normalize-range": "^0.1.2", + "@vonage/video-client-network-test": "5.0.0", + "@vonage/vivid": "5.15.1", + "autolinker": "4.1.5", + "axios": "1.16.0", + "body-parser": "1.20.4", + "classnames": "2.5.1", + "cors": "2.8.6", + "dotenv": "16.6.1", + "easy-cancelable-promise": "2.0.1", + "events": "3.3.0", + "express": "4.22.1", + "form-data": "4.0.5", + "i18next": "25.8.8", + "i18next-browser-languagedetector": "8.2.1", + "json-storage-formatter": "3.0.2", + "jsonwebtoken": "9.0.3", + "motion": "12.38.0", + "normalize-range": "0.1.2", "opentok": "2.22.0", - "opentok-jwt": "^0.1.5", - "opentok-layout-js": "^5.5.0", - "opentok-solutions-logging": "^1.1.5", - "react": "^19.2.1", - "react-dom": "^19.2.1", - "react-global-state-hooks": "^15.0.6", - "react-i18next": "^15.6.1", - "react-router-dom": "6.30.2", - "resize-observer-polyfill": "^1.5.1", - "status-code-enum": "^1.0.0", - "tailwind-merge": "^3.4.0", - "tailwind-variants": "^3.2.2", - "ua-parser-js": "^1.0.41", - "uuid": "^9.0.1", - "validator": "13.15.15", - "zod": "^4.3.5" + "opentok-jwt": "0.1.5", + "opentok-layout-js": "5.5.0", + "opentok-solutions-logging": "1.1.5", + "react": "19.2.4", + "react-dom": "19.2.4", + "react-global-state-hooks": "15.0.15", + "react-i18next": "15.7.4", + "react-router-dom": "6.30.3", + "react-syntax-highlighter": "16.1.1", + "resize-observer-polyfill": "1.5.1", + "status-code-enum": "1.0.0", + "tailwind-merge": "3.4.1", + "tailwind-variants": "3.2.2", + "ua-parser-js": "1.0.41", + "uuid": "9.0.1", + "zod": "4.3.6" }, "nx": { "includedScripts": [], diff --git a/tutorials/vonage_video_react_app-feature-config/project/scripts/build.ts b/tutorials/vonage_video_react_app-feature-config/project/scripts/build.ts index 0d0af836..548c70bd 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/scripts/build.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/scripts/build.ts @@ -1,6 +1,7 @@ #!/usr/bin/env npx tsx import { execSync } from 'child_process'; +import { writeFileSync } from 'node:fs'; const args = process.argv.slice(2); @@ -16,7 +17,37 @@ const runCommand = (command: string) => { * Builds both frontend and backend projects. */ const buildAll = () => { - runCommand('nx run-many -t build -p frontend backend'); + // webpack does not clean its output dir - delete it manually before building. + // frontend/dist and frontend/distRoom are cleaned by Vite's emptyOutDir: true. + runCommand('rm -rf ./backend/dist'); + + // Build frontend, backend and room in parallel + runCommand(` + bash -c ' + nx run frontend:build & pid1=$! + nx run backend:build & pid2=$! + nx run frontend:build-room & pid3=$! + + status=0 + + wait "$pid1" || status=1 + wait "$pid2" || status=1 + wait "$pid3" || status=1 + + exit "$status" + ' + `); + + // Copy frontend assets to backend dist for serving + runCommand( + 'mkdir -p backend/dist/dist/assets && cp -R frontend/dist/assets/. backend/dist/dist/assets/' + ); + + // Copy room.js to backend dist for serving + runCommand('cp frontend/distRoom/room.js backend/dist/dist/assets/room.js'); + + // Write a manifest file with a timestamp to force cache busting of the VeraRoom web component + writeFileSync('backend/dist/dist/assets/room-manifest.json', JSON.stringify({ v: Date.now() })); }; /** @@ -30,6 +61,8 @@ const buildFrontend = () => { * Builds only the backend project. */ const buildBackend = () => { + // webpack does not clean its output dir - delete it manually before building. + runCommand('rm -rf ./backend/dist'); runCommand('nx run backend:build'); }; @@ -37,7 +70,15 @@ const buildBackend = () => { * Builds the VeraRoom web component. */ const buildRoom = () => { - runCommand('nx run frontend:build-room'); + runCommand('nx run frontend:build-room:standalone'); +}; + +/** + * Builds and packages the VeraRoom artifact into a zip file. + */ +const buildRoomZip = () => { + runCommand('nx run frontend:build-room:standalone'); + runCommand('rm -f room.zip && cd frontend/distRoom && zip -rq ../../room.zip .'); }; /** @@ -48,15 +89,17 @@ const buildRoom = () => { * - frontend: Build only frontend * - backend: Build only backend * - room: Build VeraRoom web component + * - room zip: Build and zip VeraRoom artifact * * Usage: * - yarn build (build frontend and backend) * - yarn build frontend (build only frontend) * - yarn build backend (build only backend) * - yarn build room (build VeraRoom web component) + * - yarn build room zip (build and zip VeraRoom artifact) */ const main = () => { - const [target] = args; + const [target, subTarget] = args; switch (target) { case 'frontend': @@ -66,6 +109,11 @@ const main = () => { buildBackend(); return; case 'room': + if (subTarget === 'zip') { + buildRoomZip(); + return; + } + buildRoom(); return; default: diff --git a/tutorials/vonage_video_react_app-feature-config/project/scripts/dev.ts b/tutorials/vonage_video_react_app-feature-config/project/scripts/dev.ts index 1fe9fd57..bd436cef 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/scripts/dev.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/scripts/dev.ts @@ -34,7 +34,35 @@ function devBackend(): void { } /** - * Runs Storybook focused on VeraRoom component. + * Runs only the backend in debug mode (node --inspect on port 9229). + */ +function devBackendDebug(): void { + runCommand('nx run backend:debug'); +} + +/** + * Runs only the backend in debug mode with --inspect-brk (waits for debugger). + */ +function devBackendDebugWait(): void { + runCommand('nx run backend:debug:wait'); +} + +/** + * Runs frontend in dev mode and backend in debug mode (node --inspect on port 9229). + */ +function devDebug(): void { + runCommand("concurrently 'nx run frontend:dev' 'nx run backend:debug'"); +} + +/** + * Runs frontend in dev mode and backend in debug mode with --inspect-brk (waits for debugger). + */ +function devDebugWait(): void { + runCommand("concurrently 'nx run frontend:dev' 'nx run backend:debug:wait'"); +} + +/** + * Runs VeraRoom Storybook and backend in dev mode. */ function devRoom(): void { const storyPath = '/story/veraroom-veraroomelement--default'; @@ -42,7 +70,9 @@ function devRoom(): void { console.log('\n📚 Starting Storybook for VeraRoom...\n'); console.log(`🌐 Opening: http://localhost:6006/?path=${storyPath}\n`); - runCommand(`nx run frontend:storybook -- --initial-path="${storyPath}"`); + runCommand( + `concurrently "nx run frontend:storybook -- --initial-path='${storyPath}'" "nx run backend:dev"` + ); } /** @@ -52,24 +82,49 @@ function devRoom(): void { * - No args: Run both frontend and backend in dev mode * - frontend: Run only frontend dev server * - backend: Run only backend dev server - * - room: Run Storybook focused on VeraRoom component + * - room: Run Storybook focused on VeraRoom component and backend dev server * * Usage: * - yarn dev (run frontend and backend) * - yarn dev frontend (run only frontend) - * - yarn dev backend (run only backend) - * - yarn dev room (run Storybook for VeraRoom) + * - yarn dev backend (run only backend) + * - yarn dev backend debug (run only backend with --inspect on port 9229) + * - yarn dev backend debug wait (run only backend with --inspect-brk, waits for debugger) + * - yarn dev debug (run frontend + backend with --inspect on port 9229) + * - yarn dev debug wait (run frontend + backend with --inspect-brk, waits for debugger) + * - yarn dev room (run VeraRoom Storybook and backend) + * - yarn dev studio (run Vera Studio + backend + frontend Storybook) */ function main(): void { - const [target] = args; + const [target, subTarget] = args; switch (target) { case 'frontend': devFrontend(); return; case 'backend': + if (subTarget === 'debug') { + const backendSubTarget = args[2]; + + if (backendSubTarget === 'wait') { + devBackendDebugWait(); + return; + } + + devBackendDebug(); + return; + } + devBackend(); return; + case 'debug': + if (subTarget === 'wait') { + devDebugWait(); + return; + } + + devDebug(); + return; case 'room': devRoom(); return; diff --git a/tutorials/vonage_video_react_app-feature-config/project/scripts/generateTokens.ts b/tutorials/vonage_video_react_app-feature-config/project/scripts/generateTokens.ts index bd5e940c..a75b57da 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/scripts/generateTokens.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/scripts/generateTokens.ts @@ -1,30 +1,87 @@ #!/usr/bin/env tsx /** - * Generates all JSON files from design tokens - * Run: npm run generate:tokens - * Run with watch: npm run generate:tokens watch + * Syncs generated theme token artifacts. + * Run: yarn sync:theme-tokens */ -import { watch } from 'fs'; +import * as fs from 'fs'; import { execSync } from 'child_process'; import * as path from 'path'; +// eslint-disable-next-line @nx/enforce-module-boundaries +import tokensToJson from '../libs/ui/src/theme/helpers/designTokens/helpers/tokensToJson'; -const scriptsToRun = [ - 'libs/ui/src/theme/helpers/designTokens/helpers/tokensToJson.ts', - 'libs/ui/src/theme/helpers/tailwind/generateTailwindPlugin.ts', -]; +const scriptsToRun = ['libs/ui/src/theme/helpers/tailwind/generateTailwindPlugin.ts']; +const commandName = 'sync:theme-tokens'; + +const rootDesignTokensFilePath = path.resolve('designTokens.json'); +const pluginDesignTokensFilePath = path.resolve( + 'libs/ui/src/theme/helpers/designTokens/designTokens.json' +); +const generatedPluginFilePath = path.resolve('libs/ui/src/theme/helpers/tailwind/veraUI.cjs'); + +function syncPluginTokensFromRootOrDefaults(): void { + console.log('\x1b[36m→ Syncing plugin token source\x1b[0m'); + + if (!fs.existsSync(rootDesignTokensFilePath)) { + console.log( + '\x1b[36m→ Root designTokens.json not found. Bootstrapping from TS defaults\x1b[0m' + ); + + tokensToJson('.', 'designTokens.json'); + const generatedRootTokens = fs.readFileSync(rootDesignTokensFilePath, 'utf-8'); + + fs.writeFileSync(pluginDesignTokensFilePath, generatedRootTokens, 'utf-8'); + + console.log( + `\x1b[32m✔ Root designTokens.json created from defaults at ${rootDesignTokensFilePath}\x1b[0m` + ); + + console.log( + `\x1b[32m✔ Plugin design tokens synced from root at ${pluginDesignTokensFilePath}\x1b[0m` + ); + + return; + } + + console.log('\x1b[36m→ Root designTokens.json found. Using it as source of truth\x1b[0m'); + const rootTokens = fs.readFileSync(rootDesignTokensFilePath, 'utf-8'); + + fs.writeFileSync( + pluginDesignTokensFilePath, + rootTokens.endsWith('\n') ? rootTokens : `${rootTokens}\n`, + 'utf-8' + ); + + console.log( + `\x1b[32m✔ Plugin design tokens synced from root at ${pluginDesignTokensFilePath}\x1b[0m` + ); +} /** - * Generates all design token JSON files and Tailwind plugin. - * Runs tokensToJson.ts and generateTailwindPlugin.ts in sequence. + * Syncs design token JSON files and Tailwind plugin. + * - Always regenerates designTokens.example.json from TS defaults. + * - Uses root designTokens.json as source of truth when it exists. + * - Bootstraps root designTokens.json from defaults when it does not exist. + * - Always rebuilds and formats veraUI.cjs. * Exits with error code 1 if any script fails. */ const generateTokens = () => { - console.log('\x1b[36m🔄 Generating design tokens...\x1b[0m\n'); + console.log(`\x1b[36m🔄 [${commandName}] Starting token sync\x1b[0m\n`); + + try { + console.log('\x1b[36m→ Generating root example token artifact\x1b[0m'); + tokensToJson('.', 'designTokens.example.json'); + + syncPluginTokensFromRootOrDefaults(); + } catch (error) { + console.error('\x1b[31m✖ Failed to generate design token JSON files\x1b[0m', error); + process.exit(1); + } for (const script of scriptsToRun) { const scriptPath = path.resolve(script); try { + console.log(`\x1b[36m→ Rebuilding Tailwind plugin via ${script}\x1b[0m`); execSync(`tsx ${scriptPath}`, { stdio: 'inherit' }); } catch (error) { console.error(`\x1b[31m✖ Failed to run ${script}\x1b[0m`, error); @@ -32,54 +89,25 @@ const generateTokens = () => { } } - console.log('\n\x1b[32m✔ All design tokens generated successfully!\x1b[0m'); -}; - -/** - * Watches the design tokens directory for changes and regenerates on change. - * Runs generation once on start, then watches for .ts file changes (excluding tokensToJson.ts). - */ -const runWatch = () => { - const tokensDir = path.resolve('libs/ui/src/theme/helpers/designTokens'); - - console.log('\x1b[36m👀 Watching design tokens for changes...\x1b[0m\n'); - - // Run once on start - generateTokens(); + try { + console.log(`\x1b[36m→ Formatting generated plugin file: ${generatedPluginFilePath}\x1b[0m`); + execSync(`npx prettier --write "${generatedPluginFilePath}"`, { stdio: 'inherit' }); + } catch (error) { + console.error('\x1b[31m✖ Failed to format generated plugin file\x1b[0m', error); + process.exit(1); + } - // Watch for changes - watch(tokensDir, { recursive: true }, (eventType, filename) => { - if (filename && filename.endsWith('.ts') && !filename.includes('helpers/tokensToJson')) { - console.log(`\n\x1b[33m📝 Detected change in ${filename}\x1b[0m`); - try { - generateTokens(); - } catch (error) { - console.error('\x1b[31m✖ Generation failed\x1b[0m', error); - } - } - }); + console.log(`\n\x1b[32m✔ [${commandName}] Token sync completed successfully\x1b[0m`); }; /** * Main entry point for design token generation. - * - * Modes: - * - No args: Generate tokens once - * - watch/--watch: Watch for changes and regenerate - * - * Usage: - * - yarn generate:tokens (generate once) - * - yarn generate:tokens watch (watch mode) */ const main = () => { - const args = process.argv.slice(2); - const [firstArg] = args; - - const isWatchMode = firstArg === 'watch' || firstArg === '--watch'; - - if (isWatchMode) { - runWatch(); - return; + if (process.argv.length > 2) { + console.log( + `\x1b[33m⚠ [${commandName}] This command no longer accepts modes/arguments. Running default sync flow.\x1b[0m` + ); } generateTokens(); diff --git a/tutorials/vonage_video_react_app-feature-config/project/scripts/lintFix.ts b/tutorials/vonage_video_react_app-feature-config/project/scripts/lintFix.ts index 47061c8d..0dd3b737 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/scripts/lintFix.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/scripts/lintFix.ts @@ -24,6 +24,7 @@ import { execSync } from 'child_process'; const PROJECT_ROOTS: Record = { frontend: 'frontend', backend: 'backend', + api: 'libs/api', core: 'libs/core', ui: 'libs/ui', common: 'libs/common', diff --git a/tutorials/vonage_video_react_app-feature-config/project/scripts/qualityCheck.ts b/tutorials/vonage_video_react_app-feature-config/project/scripts/qualityCheck.ts index 8862b4a3..283c39ed 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/scripts/qualityCheck.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/scripts/qualityCheck.ts @@ -74,14 +74,16 @@ function main() { process.exit(1); } + const resolvedProjectName = projectName ? PROJECT_ROOTS[projectName] : null; + const taskRunnerCommand = (() => { if (!projectName) return 'yarn nx run-many -t ts-check,lint --parallel'; - return `yarn nx run-many -t ts-check,lint -p ${projectName} --parallel`; + return `yarn nx run-many -t ts-check,lint -p ${resolvedProjectName} --parallel`; })(); runCommand(taskRunnerCommand); - const prettierTarget = projectName ? PROJECT_ROOTS[projectName] : '.'; + const prettierTarget = resolvedProjectName ?? '.'; runCommand(`yarn prettier ${prettierTarget} --check --log-level warn`); } diff --git a/tutorials/vonage_video_react_app-feature-config/project/scripts/start.ts b/tutorials/vonage_video_react_app-feature-config/project/scripts/start.ts index a539720b..347080a2 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/scripts/start.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/scripts/start.ts @@ -24,33 +24,45 @@ function startAll(): void { * Builds VeraRoom and serves the example page with http-server. */ function startRoom(): void { + const roomPort = 3350; + // Build console.log('\n📦 Building VeraRoom...\n'); - runCommand('nx run frontend:build-room'); + runCommand('nx run frontend:build-room:standalone'); + runCommand('nx run frontend:build-room-example'); const distRoomPath = path.resolve(__dirname, '../frontend/distRoom'); - // Start http-server on port 3345 - const server = spawn('npx', ['http-server', distRoomPath, '-c-1', '-p', '3345'], { - stdio: ['inherit', 'pipe', 'inherit'], + // Start backend on default port 3345 + const backend = spawn('npx', ['nx', 'run', 'backend:start'], { + stdio: 'inherit', + shell: true, + env: { ...process.env, FRONTEND_TARGET: `http://localhost:${roomPort}/example.html` }, + }); + + // Start room example on separate port + const roomServer = spawn('npx', ['http-server', distRoomPath, '-c-1', '-p', String(roomPort)], { + stdio: 'inherit', shell: true, }); - server.stdout?.on('data', (data: Buffer) => { - const output = data.toString(); - process.stdout.write(output); - - // Print URL once server is ready - if (output.includes('Available on')) { - console.log('\n' + '='.repeat(50)); - console.log('🌐 VeraRoom Example:'); - console.log(' http://localhost:3345/example.html'); - console.log('='.repeat(50) + '\n'); - } + const shutdown = () => { + backend.kill('SIGTERM'); + roomServer.kill('SIGTERM'); + }; + + process.on('SIGINT', shutdown); + process.on('SIGTERM', shutdown); + + backend.on('error', (err) => { + console.error('Failed to start backend:', err); + shutdown(); + process.exit(1); }); - server.on('error', (err) => { + roomServer.on('error', (err) => { console.error('Failed to start http-server:', err); + shutdown(); process.exit(1); }); } diff --git a/tutorials/vonage_video_react_app-feature-config/project/scripts/testBackend.ts b/tutorials/vonage_video_react_app-feature-config/project/scripts/testBackend.ts index 99e79c04..6335c2dc 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/scripts/testBackend.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/scripts/testBackend.ts @@ -69,17 +69,23 @@ function runDebug(testFilePath?: string) { * Generates coverage reports for code quality analysis. * Optionally runs coverage for a specific test file. */ -function runCoverage(testFilePath?: string) { +function runCoverage(testFilePath?: string, html = false) { const target = testFilePath ? `file: ${testFilePath}` : 'all tests'; console.log(`\n📊 Coverage mode activated for ${target}\n`); + + const htmlReporter = html ? ' --coverageReporters=html' : ''; + if (testFilePath) { - execSync(`yarn nx test backend --configuration=coverage --testPathPattern="${testFilePath}"`, { - stdio: 'inherit', - }); + execSync( + `yarn nx test backend --configuration=coverage --testPathPattern="${testFilePath}"${htmlReporter}`, + { + stdio: 'inherit', + } + ); return; } - execSync('yarn nx test backend --configuration=coverage', { + execSync(`yarn nx test backend --configuration=coverage${htmlReporter}`, { stdio: 'inherit', }); } @@ -92,11 +98,12 @@ function runCoverage(testFilePath?: string) { * Defaults to running a specific test file if the first argument doesn't match a mode. * * @modes - * - (no args) - Run all backend tests - * - watch [file-path] - Watch mode (re-run on changes with coverage) - * - debug [file-path] - Debug mode (attach Node debugger, run serially) - * - coverage [file-path]- Run with coverage reports - * - - Run specific test file + * - (no args) - Run all backend tests + * - watch [file-path] - Watch mode (re-run on changes with coverage) + * - debug [file-path] - Debug mode (attach Node debugger, run serially) + * - coverage [file-path] - Run with coverage reports + * - coverage html [file-path]- Run with HTML coverage report + * - - Run specific test file * * @example * yarn test:backend @@ -106,10 +113,12 @@ function runCoverage(testFilePath?: string) { * yarn test:backend debug services/feedbackService.test.ts * yarn test:backend coverage * yarn test:backend coverage videoService + * yarn test:backend coverage html + * yarn test:backend coverage html routes/session.test.ts */ function main() { const args = process.argv.slice(2); - const [firstArg, secondArg] = args; + const [firstArg, secondArg, thirdArg] = args; const noArgs = args.length === 0; const isDebugMode = firstArg === 'debug'; @@ -149,7 +158,10 @@ function main() { } if (isCoverageMode) { - runCoverage(secondArg); + const isHtmlCoverage = secondArg === 'html'; + const testFilePath = isHtmlCoverage ? thirdArg : secondArg; + + runCoverage(testFilePath, isHtmlCoverage); return; } diff --git a/tutorials/vonage_video_react_app-feature-config/project/scripts/testIntegration.ts b/tutorials/vonage_video_react_app-feature-config/project/scripts/testIntegration.ts index 97b14a60..8a050980 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/scripts/testIntegration.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/scripts/testIntegration.ts @@ -4,7 +4,15 @@ import { execSync } from 'child_process'; const args = process.argv.slice(2); -const VALID_MODES = ['debug', 'inspect', 'canon', 'update', 'updateScreenshots'] as const; +const VALID_MODES = [ + 'api', + 'debug', + 'inspect', + 'canon', + 'update', + 'updateScreenshots', + 'playwright', +] as const; type ValidMode = (typeof VALID_MODES)[number]; @@ -30,15 +38,49 @@ const runCommand = (command: string, { preserveNodeOptions = false } = {}) => { }; /** - * Runs all integration tests across all browsers. + * Checks if the given path points to an API integration test inside tests/api/. + */ +const isApiTestPath = (testPath: string): boolean => { + return testPath === 'api' || testPath.includes('test-api/') || testPath.includes('apiIntegrity'); +}; + +/** + * Runs API integration tests (Jest-based tests in tests/api/). + * Optionally filters by a specific test file path. + */ +const runApiTests = (testFilePath?: string) => { + const target = testFilePath ? `file: ${testFilePath}` : 'all API tests'; + console.log(`\n🤖 Running API integration tests: ${target}\n`); + const testPattern = testFilePath ? ` --testPathPattern="${testFilePath}"` : ''; + const command = `bash -c 'source ../../vcrBuild.env.sh && jest --maxWorkers=1${testPattern}'`; + console.log(`\n🚀 Running: ${command}\n`); + execSync(command, { + stdio: 'inherit', + cwd: 'integration-tests/test-api', + env: { ...process.env, NODE_OPTIONS: '--experimental-vm-modules' }, + }); +}; + +/** + * Runs all Playwright integration tests across all browsers. * Uses Playwright's default configuration (Chrome, Firefox, Mobile Chrome). * Uses nx target for caching benefits. */ -const runAllTests = () => { - console.log('\n🤖 Running all integration tests (Chrome, Firefox, Mobile Chrome)...\n'); +const runAllPlaywrightTests = () => { + console.log( + '\n🤖 Running all Playwright integration tests (Chrome, Firefox, Mobile Chrome)...\n' + ); runCommand('nx run integration-tests:test'); }; +/** + * Runs all integration tests: API tests (Jest) + Playwright tests. + */ +const runAllTests = () => { + runApiTests(); + runAllPlaywrightTests(); +}; + /** * Runs a specific test in headed Chrome mode. * Test runs in headed mode (browser window visible) for debugging. @@ -115,6 +157,8 @@ const updateScreenshots = (testNameOrPath?: string) => { * * @modes * - (no args) - Run all tests in all browsers (headless) + * - api - Run only API integration tests (Jest) + * - playwright - Run only Playwright tests (skip API tests) * - debug [test-name] - Debug mode (Playwright Inspector + Chrome DevTools, timeout disabled) * - inspect [test-name] - Inspect mode (Chrome DevTools, headed mode) * - canon [test-name] - Generate canonical screenshots (baseline for visual regression) @@ -123,6 +167,8 @@ const updateScreenshots = (testNameOrPath?: string) => { * * @example * yarn test:integration + * yarn test:integration api + * yarn test:integration playwright * yarn test:integration callQuality * yarn test:integration debug * yarn test:integration debug callQuality @@ -139,6 +185,7 @@ const main = () => { const isInspectMode = firstArg === 'inspect'; const isCanonMode = firstArg === 'canon'; const isUpdateMode = firstArg === 'update' || firstArg === 'updateScreenshots'; + const isPlaywrightMode = firstArg === 'playwright'; const isKnownMode = VALID_MODES.includes(firstArg as ValidMode); if (noArgs) { @@ -153,6 +200,7 @@ const main = () => { if (firstArg.startsWith('-') || firstArg.startsWith('--')) { console.error(`\n❌ Error: Unknown mode '${firstArg}'\n`); console.error('Valid modes:'); + console.error(' • playwright - Run only Playwright tests (skip API tests)'); console.error(' • debug - Debug mode (Playwright Inspector, no timeout)'); console.error(' • inspect - Inspect mode (Chrome DevTools, headed)'); console.error(' • canon - Generate canonical screenshots'); @@ -167,6 +215,11 @@ const main = () => { } } + if (isPlaywrightMode) { + runAllPlaywrightTests(); + return; + } + if (isDebugMode) { runDebug(secondArg); return; @@ -187,6 +240,11 @@ const main = () => { return; } + if (isApiTestPath(firstArg)) { + runApiTests(firstArg === 'api' ? undefined : firstArg); + return; + } + runHeadedTest(firstArg); }; diff --git a/tutorials/vonage_video_react_app-feature-config/project/scripts/tsCheck.ts b/tutorials/vonage_video_react_app-feature-config/project/scripts/tsCheck.ts new file mode 100644 index 00000000..680a08be --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/scripts/tsCheck.ts @@ -0,0 +1,67 @@ +#!/usr/bin/env node +import { execSync } from 'child_process'; + +const PROJECT_ALIASES: Record = { + frontend: 'frontend', + backend: 'backend', + api: 'api', + core: 'core', + ui: 'ui', + common: 'common', + 'integration-tests': 'integration-tests', +}; + +function runCommand(command: string) { + execSync(command, { stdio: 'inherit' }); +} + +function printHelp() { + console.log('Usage:'); + console.log(' yarn ts-check'); + console.log(' yarn ts-check '); + console.log(''); + console.log('Projects:'); + console.log(` ${Object.keys(PROJECT_ALIASES).join(', ')}`); + console.log(''); + console.log('Examples:'); + console.log(' yarn ts-check'); + console.log(' yarn ts-check frontend'); + console.log(' yarn ts-check studio'); +} + +function main() { + const commandLineArguments = process.argv.slice(2); + const [firstArgument, secondArgument] = commandLineArguments; + + const isHelpFlag = (value?: string) => value === '-h' || value === '--help'; + + if (isHelpFlag(firstArgument) || isHelpFlag(secondArgument)) { + printHelp(); + return; + } + + if (secondArgument) { + console.error('\nError: Only one project name is supported.\n'); + printHelp(); + process.exit(1); + } + + const projectName = firstArgument; + + if (!projectName) { + runCommand('yarn nx run-many -t ts-check --parallel'); + return; + } + + const resolvedProjectName = PROJECT_ALIASES[projectName]; + + if (!resolvedProjectName) { + console.error(`\nError: Unknown project '${projectName}'.\n`); + printHelp(); + process.exit(1); + } + + runCommand(`yarn nx run-many -t ts-check -p ${resolvedProjectName}`); +} + +main(); diff --git a/tutorials/vonage_video_react_app-feature-config/project/sonar-project.properties b/tutorials/vonage_video_react_app-feature-config/project/sonar-project.properties index c2cb70d4..96543df4 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/sonar-project.properties +++ b/tutorials/vonage_video_react_app-feature-config/project/sonar-project.properties @@ -35,7 +35,6 @@ customWordList.mjs,\ libs/ui/src/theme/helpers/designTokens/**,\ libs/ui/src/theme/helpers/tailwind/**,\ frontend/src/test/mocks/vonageVideo.ts,\ -# Exclude all Storybook files **/.storybook/**,\ **/*.stories.tsx,\ **/*.stories.ts,\ @@ -43,6 +42,8 @@ frontend/src/test/mocks/vonageVideo.ts,\ **/*.story.ts,\ libs/common/test/**/*,\ libs/common/testBrowser/**,\ +libs/common/testNode/**,\ +backend/jest/setEnvVars.js,\ **/index.ts,\ **/index.tsx, \ **/example/** diff --git a/tutorials/vonage_video_react_app-feature-config/project/vcr-gha.yml b/tutorials/vonage_video_react_app-feature-config/project/vcr-gha.yml index 70483a46..e3df97e1 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/vcr-gha.yml +++ b/tutorials/vonage_video_react_app-feature-config/project/vcr-gha.yml @@ -40,5 +40,9 @@ instance: secret: JIRA_EPIC_LINK - name: JIRA_EPIC_URL secret: JIRA_EPIC_URL + - name: JIRA_SEVERITY_ID + secret: JIRA_SEVERITY_ID + - name: SESSION_KEY_SECRET + secret: SESSION_KEY_SECRET debug: entrypoint: [node, bundle.cjs] diff --git a/tutorials/vonage_video_react_app-feature-config/project/vcrBuild.env.sh b/tutorials/vonage_video_react_app-feature-config/project/vcrBuild.env.sh index 2446134b..7e023aec 100755 --- a/tutorials/vonage_video_react_app-feature-config/project/vcrBuild.env.sh +++ b/tutorials/vonage_video_react_app-feature-config/project/vcrBuild.env.sh @@ -7,6 +7,11 @@ export ALLOW_BACKGROUND_EFFECTS=true export ALLOW_CAMERA_CONTROL=true export ALLOW_VIDEO_ON_JOIN=true export DEFAULT_RESOLUTION='1280x720' +export PUBLISHER_MAX_RESOLUTION='1920x1080' +export NOTIFICATION_DURATION_MS=4000 +export MIN_CUSTOM_VIDEO_BITRATE_BPS=5000 +export MAX_CUSTOM_VIDEO_BITRATE_BPS=10000000 +export SUPPORTED_FRAME_RATES='30|15|7|1' export ALLOW_ADVANCED_NOISE_SUPPRESSION=true export ALLOW_AUDIO_ON_JOIN=true export ALLOW_MICROPHONE_CONTROL=true @@ -20,3 +25,5 @@ export ALLOW_EMOJIS=true export ALLOW_SCREEN_SHARE=true export DEFAULT_LAYOUT_MODE='active-speaker' export SHOW_PARTICIPANT_LIST=true +export MEETING_ROOM_ALLOW_ADVANCED_SETTINGS=true +export WAITING_ROOM_ALLOW_ADVANCED_SETTINGS=true \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/yarn.lock b/tutorials/vonage_video_react_app-feature-config/project/yarn.lock deleted file mode 100644 index b49b5b2e..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/yarn.lock +++ /dev/null @@ -1,14602 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@adobe/css-tools@^4.4.0": - version "4.4.4" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.4.tgz#2856c55443d3d461693f32d2b96fb6ea92e1ffa9" - integrity sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg== - -"@ampproject/remapping@^2.2.1": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.27.1", "@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" - integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== - dependencies: - "@babel/helper-validator-identifier" "^7.28.5" - js-tokens "^4.0.0" - picocolors "^1.1.1" - -"@babel/compat-data@^7.28.6", "@babel/compat-data@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.0.tgz#00d03e8c0ac24dd9be942c5370990cbe1f17d88d" - integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.21.3", "@babel/core@^7.23.2", "@babel/core@^7.23.9", "@babel/core@^7.24.4", "@babel/core@^7.27.4", "@babel/core@^7.28.0", "@babel/core@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.0.tgz#5286ad785df7f79d656e88ce86e650d16ca5f322" - integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== - dependencies: - "@babel/code-frame" "^7.29.0" - "@babel/generator" "^7.29.0" - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-module-transforms" "^7.28.6" - "@babel/helpers" "^7.28.6" - "@babel/parser" "^7.29.0" - "@babel/template" "^7.28.6" - "@babel/traverse" "^7.29.0" - "@babel/types" "^7.29.0" - "@jridgewell/remapping" "^2.3.5" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.27.5", "@babel/generator@^7.29.0", "@babel/generator@^7.7.2": - version "7.29.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" - integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== - dependencies: - "@babel/parser" "^7.29.0" - "@babel/types" "^7.29.0" - "@jridgewell/gen-mapping" "^0.3.12" - "@jridgewell/trace-mapping" "^0.3.28" - jsesc "^3.0.2" - -"@babel/helper-annotate-as-pure@^7.27.1", "@babel/helper-annotate-as-pure@^7.27.3": - version "7.27.3" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5" - integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== - dependencies: - "@babel/types" "^7.27.3" - -"@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz#32c4a3f41f12ed1532179b108a4d746e105c2b25" - integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA== - dependencies: - "@babel/compat-data" "^7.28.6" - "@babel/helper-validator-option" "^7.27.1" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-create-class-features-plugin@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz#611ff5482da9ef0db6291bcd24303400bca170fb" - integrity sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-member-expression-to-functions" "^7.28.5" - "@babel/helper-optimise-call-expression" "^7.27.1" - "@babel/helper-replace-supers" "^7.28.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/traverse" "^7.28.6" - semver "^6.3.1" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.27.1", "@babel/helper-create-regexp-features-plugin@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz#7c1ddd64b2065c7f78034b25b43346a7e19ed997" - integrity sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - regexpu-core "^6.3.1" - semver "^6.3.1" - -"@babel/helper-define-polyfill-provider@^0.6.5", "@babel/helper-define-polyfill-provider@^0.6.6": - version "0.6.6" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz#714dfe33d8bd710f556df59953720f6eeb6c1a14" - integrity sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA== - dependencies: - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - debug "^4.4.3" - lodash.debounce "^4.0.8" - resolve "^1.22.11" - -"@babel/helper-globals@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" - integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== - -"@babel/helper-member-expression-to-functions@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz#f3e07a10be37ed7a63461c63e6929575945a6150" - integrity sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg== - dependencies: - "@babel/traverse" "^7.28.5" - "@babel/types" "^7.28.5" - -"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz#60632cbd6ffb70b22823187201116762a03e2d5c" - integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw== - dependencies: - "@babel/traverse" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz#9312d9d9e56edc35aeb6e95c25d4106b50b9eb1e" - integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA== - dependencies: - "@babel/helper-module-imports" "^7.28.6" - "@babel/helper-validator-identifier" "^7.28.5" - "@babel/traverse" "^7.28.6" - -"@babel/helper-optimise-call-expression@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz#c65221b61a643f3e62705e5dd2b5f115e35f9200" - integrity sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw== - dependencies: - "@babel/types" "^7.27.1" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.28.6", "@babel/helper-plugin-utils@^7.8.0": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz#6f13ea251b68c8532e985fd532f28741a8af9ac8" - integrity sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug== - -"@babel/helper-remap-async-to-generator@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz#4601d5c7ce2eb2aea58328d43725523fcd362ce6" - integrity sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-wrap-function" "^7.27.1" - "@babel/traverse" "^7.27.1" - -"@babel/helper-replace-supers@^7.27.1", "@babel/helper-replace-supers@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz#94aa9a1d7423a00aead3f204f78834ce7d53fe44" - integrity sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.28.5" - "@babel/helper-optimise-call-expression" "^7.27.1" - "@babel/traverse" "^7.28.6" - -"@babel/helper-skip-transparent-expression-wrappers@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz#62bb91b3abba8c7f1fec0252d9dbea11b3ee7a56" - integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg== - dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" - -"@babel/helper-string-parser@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" - integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== - -"@babel/helper-validator-identifier@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" - integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== - -"@babel/helper-validator-option@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" - integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== - -"@babel/helper-wrap-function@^7.27.1": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz#4e349ff9222dab69a93a019cc296cdd8442e279a" - integrity sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ== - dependencies: - "@babel/template" "^7.28.6" - "@babel/traverse" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/helpers@^7.27.0", "@babel/helpers@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.6.tgz#fca903a313ae675617936e8998b814c415cbf5d7" - integrity sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw== - dependencies: - "@babel/template" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.4", "@babel/parser@^7.25.4", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.0.tgz#669ef345add7d057e92b7ed15f0bac07611831b6" - integrity sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww== - dependencies: - "@babel/types" "^7.29.0" - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz#fbde57974707bbfa0376d34d425ff4fa6c732421" - integrity sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.28.5" - -"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz#43f70a6d7efd52370eefbdf55ae03d91b293856d" - integrity sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz#beb623bd573b8b6f3047bd04c32506adc3e58a72" - integrity sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz#e134a5479eb2ba9c02714e8c1ebf1ec9076124fd" - integrity sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/plugin-transform-optional-chaining" "^7.27.1" - -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz#0e8289cec28baaf05d54fd08d81ae3676065f69f" - integrity sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/traverse" "^7.28.6" - -"@babel/plugin-proposal-decorators@^7.22.7": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz#d159f26f78740e47bf3ef075882b155b2d54ca81" - integrity sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/plugin-syntax-decorators" "^7.28.6" - -"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": - version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" - integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-decorators@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz#8c3293a0fef033e4c786b35ce1e159fc1d676153" - integrity sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-syntax-import-assertions@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz#ae9bc1923a6ba527b70104dd2191b0cd872c8507" - integrity sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz#b71d5914665f60124e133696f17cd7669062c503" - integrity sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-syntax-import-meta@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.27.1", "@babel/plugin-syntax-jsx@^7.28.6", "@babel/plugin-syntax-jsx@^7.7.2": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz#f8ca28bbd84883b5fea0e447c635b81ba73997ee" - integrity sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.27.1", "@babel/plugin-syntax-typescript@^7.28.6", "@babel/plugin-syntax-typescript@^7.3.3", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz#c7b2ddf1d0a811145b1de800d1abd146af92e3a2" - integrity sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" - integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-arrow-functions@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz#6e2061067ba3ab0266d834a9f94811196f2aba9a" - integrity sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-async-generator-functions@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz#63ed829820298f0bf143d5a4a68fb8c06ffd742f" - integrity sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-remap-async-to-generator" "^7.27.1" - "@babel/traverse" "^7.29.0" - -"@babel/plugin-transform-async-to-generator@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz#bd97b42237b2d1bc90d74bcb486c39be5b4d7e77" - integrity sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g== - dependencies: - "@babel/helper-module-imports" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-remap-async-to-generator" "^7.27.1" - -"@babel/plugin-transform-block-scoped-functions@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz#558a9d6e24cf72802dd3b62a4b51e0d62c0f57f9" - integrity sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-block-scoping@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz#e1ef5633448c24e76346125c2534eeb359699a99" - integrity sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-class-properties@^7.22.5", "@babel/plugin-transform-class-properties@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz#d274a4478b6e782d9ea987fda09bdb6d28d66b72" - integrity sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-class-static-block@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz#1257491e8259c6d125ac4d9a6f39f9d2bf3dba70" - integrity sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-classes@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz#8f6fb79ba3703978e701ce2a97e373aae7dda4b7" - integrity sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-globals" "^7.28.0" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-replace-supers" "^7.28.6" - "@babel/traverse" "^7.28.6" - -"@babel/plugin-transform-computed-properties@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz#936824fc71c26cb5c433485776d79c8e7b0202d2" - integrity sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/template" "^7.28.6" - -"@babel/plugin-transform-destructuring@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz#b8402764df96179a2070bb7b501a1586cf8ad7a7" - integrity sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.28.5" - -"@babel/plugin-transform-dotall-regex@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz#def31ed84e0fb6e25c71e53c124e7b76a4ab8e61" - integrity sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-duplicate-keys@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz#f1fbf628ece18e12e7b32b175940e68358f546d1" - integrity sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz#8014b8a6cfd0e7b92762724443bf0d2400f26df1" - integrity sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-dynamic-import@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz#4c78f35552ac0e06aa1f6e3c573d67695e8af5a4" - integrity sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-explicit-resource-management@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz#dd6788f982c8b77e86779d1d029591e39d9d8be7" - integrity sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/plugin-transform-destructuring" "^7.28.5" - -"@babel/plugin-transform-exponentiation-operator@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz#5e477eb7eafaf2ab5537a04aaafcf37e2d7f1091" - integrity sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-export-namespace-from@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz#71ca69d3471edd6daa711cf4dfc3400415df9c23" - integrity sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-for-of@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz#bc24f7080e9ff721b63a70ac7b2564ca15b6c40a" - integrity sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - -"@babel/plugin-transform-function-name@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz#4d0bf307720e4dce6d7c30fcb1fd6ca77bdeb3a7" - integrity sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ== - dependencies: - "@babel/helper-compilation-targets" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.27.1" - -"@babel/plugin-transform-json-strings@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz#4c8c15b2dc49e285d110a4cf3dac52fd2dfc3038" - integrity sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz#baaefa4d10a1d4206f9dcdda50d7d5827bb70b24" - integrity sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-logical-assignment-operators@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz#53028a3d77e33c50ef30a8fce5ca17065936e605" - integrity sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-member-expression-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz#37b88ba594d852418e99536f5612f795f23aeaf9" - integrity sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-modules-amd@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz#a4145f9d87c2291fe2d05f994b65dba4e3e7196f" - integrity sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA== - dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-modules-commonjs@^7.27.1", "@babel/plugin-transform-modules-commonjs@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz#c0232e0dfe66a734cc4ad0d5e75fc3321b6fdef1" - integrity sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA== - dependencies: - "@babel/helper-module-transforms" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-modules-systemjs@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz#e458a95a17807c415924106a3ff188a3b8dee964" - integrity sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ== - dependencies: - "@babel/helper-module-transforms" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-validator-identifier" "^7.28.5" - "@babel/traverse" "^7.29.0" - -"@babel/plugin-transform-modules-umd@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz#63f2cf4f6dc15debc12f694e44714863d34cd334" - integrity sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w== - dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz#a26cd51e09c4718588fc4cce1c5d1c0152102d6a" - integrity sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-new-target@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz#259c43939728cad1706ac17351b7e6a7bea1abeb" - integrity sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-nullish-coalescing-operator@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz#9bc62096e90ab7a887f3ca9c469f6adec5679757" - integrity sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-numeric-separator@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz#1310b0292762e7a4a335df5f580c3320ee7d9e9f" - integrity sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-object-rest-spread@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz#fdd4bc2d72480db6ca42aed5c051f148d7b067f7" - integrity sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA== - dependencies: - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/plugin-transform-destructuring" "^7.28.5" - "@babel/plugin-transform-parameters" "^7.27.7" - "@babel/traverse" "^7.28.6" - -"@babel/plugin-transform-object-super@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz#1c932cd27bf3874c43a5cac4f43ebf970c9871b5" - integrity sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-replace-supers" "^7.27.1" - -"@babel/plugin-transform-optional-catch-binding@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz#75107be14c78385978201a49c86414a150a20b4c" - integrity sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-optional-chaining@^7.27.1", "@babel/plugin-transform-optional-chaining@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz#926cf150bd421fc8362753e911b4a1b1ce4356cd" - integrity sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - -"@babel/plugin-transform-parameters@^7.27.7": - version "7.27.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz#1fd2febb7c74e7d21cf3b05f7aebc907940af53a" - integrity sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-private-methods@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz#c76fbfef3b86c775db7f7c106fff544610bdb411" - integrity sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-private-property-in-object@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz#4fafef1e13129d79f1d75ac180c52aafefdb2811" - integrity sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-property-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz#07eafd618800591e88073a0af1b940d9a42c6424" - integrity sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-react-constant-elements@^7.21.3": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz#6c6b50424e749a6e48afd14cf7b92f98cb9383f9" - integrity sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-react-display-name@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz#6f20a7295fea7df42eb42fed8f896813f5b934de" - integrity sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-react-jsx-development@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz#47ff95940e20a3a70e68ad3d4fcb657b647f6c98" - integrity sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.27.1" - -"@babel/plugin-transform-react-jsx-self@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz#af678d8506acf52c577cac73ff7fe6615c85fc92" - integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-react-jsx-source@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz#dcfe2c24094bb757bf73960374e7c55e434f19f0" - integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-react-jsx@^7.27.1": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz#f51cb70a90b9529fbb71ee1f75ea27b7078eed62" - integrity sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-module-imports" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/plugin-syntax-jsx" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/plugin-transform-react-pure-annotations@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz#339f1ce355eae242e0649f232b1c68907c02e879" - integrity sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-regenerator@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz#dec237cec1b93330876d6da9992c4abd42c9d18b" - integrity sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-regexp-modifiers@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz#7ef0163bd8b4a610481b2509c58cf217f065290b" - integrity sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-reserved-words@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz#40fba4878ccbd1c56605a4479a3a891ac0274bb4" - integrity sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-runtime@^7.23.2": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz#a5fded13cc656700804bfd6e5ebd7fffd5266803" - integrity sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w== - dependencies: - "@babel/helper-module-imports" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - babel-plugin-polyfill-corejs2 "^0.4.14" - babel-plugin-polyfill-corejs3 "^0.13.0" - babel-plugin-polyfill-regenerator "^0.6.5" - semver "^6.3.1" - -"@babel/plugin-transform-shorthand-properties@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz#532abdacdec87bfee1e0ef8e2fcdee543fe32b90" - integrity sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-spread@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz#40a2b423f6db7b70f043ad027a58bcb44a9757b6" - integrity sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - -"@babel/plugin-transform-sticky-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz#18984935d9d2296843a491d78a014939f7dcd280" - integrity sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-template-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz#1a0eb35d8bb3e6efc06c9fd40eb0bcef548328b8" - integrity sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-typeof-symbol@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz#70e966bb492e03509cf37eafa6dcc3051f844369" - integrity sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-typescript@^7.28.5": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz#1e93d96da8adbefdfdade1d4956f73afa201a158" - integrity sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/plugin-syntax-typescript" "^7.28.6" - -"@babel/plugin-transform-unicode-escapes@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz#3e3143f8438aef842de28816ece58780190cf806" - integrity sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-unicode-property-regex@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz#63a7a6c21a0e75dae9b1861454111ea5caa22821" - integrity sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-unicode-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz#25948f5c395db15f609028e370667ed8bae9af97" - integrity sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-unicode-sets-regex@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz#924912914e5df9fe615ec472f88ff4788ce04d4e" - integrity sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/preset-env@^7.20.2", "@babel/preset-env@^7.23.2": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.29.0.tgz#c55db400c515a303662faaefd2d87e796efa08d0" - integrity sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w== - dependencies: - "@babel/compat-data" "^7.29.0" - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.28.5" - "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.27.1" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.27.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.27.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.28.6" - "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions" "^7.28.6" - "@babel/plugin-syntax-import-attributes" "^7.28.6" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.27.1" - "@babel/plugin-transform-async-generator-functions" "^7.29.0" - "@babel/plugin-transform-async-to-generator" "^7.28.6" - "@babel/plugin-transform-block-scoped-functions" "^7.27.1" - "@babel/plugin-transform-block-scoping" "^7.28.6" - "@babel/plugin-transform-class-properties" "^7.28.6" - "@babel/plugin-transform-class-static-block" "^7.28.6" - "@babel/plugin-transform-classes" "^7.28.6" - "@babel/plugin-transform-computed-properties" "^7.28.6" - "@babel/plugin-transform-destructuring" "^7.28.5" - "@babel/plugin-transform-dotall-regex" "^7.28.6" - "@babel/plugin-transform-duplicate-keys" "^7.27.1" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.29.0" - "@babel/plugin-transform-dynamic-import" "^7.27.1" - "@babel/plugin-transform-explicit-resource-management" "^7.28.6" - "@babel/plugin-transform-exponentiation-operator" "^7.28.6" - "@babel/plugin-transform-export-namespace-from" "^7.27.1" - "@babel/plugin-transform-for-of" "^7.27.1" - "@babel/plugin-transform-function-name" "^7.27.1" - "@babel/plugin-transform-json-strings" "^7.28.6" - "@babel/plugin-transform-literals" "^7.27.1" - "@babel/plugin-transform-logical-assignment-operators" "^7.28.6" - "@babel/plugin-transform-member-expression-literals" "^7.27.1" - "@babel/plugin-transform-modules-amd" "^7.27.1" - "@babel/plugin-transform-modules-commonjs" "^7.28.6" - "@babel/plugin-transform-modules-systemjs" "^7.29.0" - "@babel/plugin-transform-modules-umd" "^7.27.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.29.0" - "@babel/plugin-transform-new-target" "^7.27.1" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.28.6" - "@babel/plugin-transform-numeric-separator" "^7.28.6" - "@babel/plugin-transform-object-rest-spread" "^7.28.6" - "@babel/plugin-transform-object-super" "^7.27.1" - "@babel/plugin-transform-optional-catch-binding" "^7.28.6" - "@babel/plugin-transform-optional-chaining" "^7.28.6" - "@babel/plugin-transform-parameters" "^7.27.7" - "@babel/plugin-transform-private-methods" "^7.28.6" - "@babel/plugin-transform-private-property-in-object" "^7.28.6" - "@babel/plugin-transform-property-literals" "^7.27.1" - "@babel/plugin-transform-regenerator" "^7.29.0" - "@babel/plugin-transform-regexp-modifiers" "^7.28.6" - "@babel/plugin-transform-reserved-words" "^7.27.1" - "@babel/plugin-transform-shorthand-properties" "^7.27.1" - "@babel/plugin-transform-spread" "^7.28.6" - "@babel/plugin-transform-sticky-regex" "^7.27.1" - "@babel/plugin-transform-template-literals" "^7.27.1" - "@babel/plugin-transform-typeof-symbol" "^7.27.1" - "@babel/plugin-transform-unicode-escapes" "^7.27.1" - "@babel/plugin-transform-unicode-property-regex" "^7.28.6" - "@babel/plugin-transform-unicode-regex" "^7.27.1" - "@babel/plugin-transform-unicode-sets-regex" "^7.28.6" - "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.15" - babel-plugin-polyfill-corejs3 "^0.14.0" - babel-plugin-polyfill-regenerator "^0.6.6" - core-js-compat "^3.48.0" - semver "^6.3.1" - -"@babel/preset-modules@0.1.6-no-external-plugins": - version "0.1.6-no-external-plugins" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" - integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-react@^7.18.6": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.28.5.tgz#6fcc0400fa79698433d653092c3919bb4b0878d9" - integrity sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-transform-react-display-name" "^7.28.0" - "@babel/plugin-transform-react-jsx" "^7.27.1" - "@babel/plugin-transform-react-jsx-development" "^7.27.1" - "@babel/plugin-transform-react-pure-annotations" "^7.27.1" - -"@babel/preset-typescript@^7.21.0", "@babel/preset-typescript@^7.22.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz#540359efa3028236958466342967522fd8f2a60c" - integrity sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-syntax-jsx" "^7.27.1" - "@babel/plugin-transform-modules-commonjs" "^7.27.1" - "@babel/plugin-transform-typescript" "^7.28.5" - -"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.22.6", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.26.10", "@babel/runtime@^7.27.6", "@babel/runtime@^7.28.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.6.tgz#d267a43cb1836dc4d182cce93ae75ba954ef6d2b" - integrity sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA== - -"@babel/template@^7.28.6", "@babel/template@^7.3.3": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" - integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== - dependencies: - "@babel/code-frame" "^7.28.6" - "@babel/parser" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/traverse@^7.16.0", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.5", "@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" - integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== - dependencies: - "@babel/code-frame" "^7.29.0" - "@babel/generator" "^7.29.0" - "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.29.0" - "@babel/template" "^7.28.6" - "@babel/types" "^7.29.0" - debug "^4.3.1" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.25.4", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.5", "@babel/types@^7.28.6", "@babel/types@^7.29.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" - integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== - dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.28.5" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@cspell/cspell-bundled-dicts@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-9.6.4.tgz#e0ee7d45053e0f8f675e1b655146ea09b416f323" - integrity sha512-OIiPQuB7XQ6rnUv4KaCwHr9vNwbh6VZ4GfgQjcThT0oz0hkL6E5Ar3tq54K9jyqE9ylcHqpRuXUgnKgio6Hlig== - dependencies: - "@cspell/dict-ada" "^4.1.1" - "@cspell/dict-al" "^1.1.1" - "@cspell/dict-aws" "^4.0.17" - "@cspell/dict-bash" "^4.2.2" - "@cspell/dict-companies" "^3.2.10" - "@cspell/dict-cpp" "^7.0.2" - "@cspell/dict-cryptocurrencies" "^5.0.5" - "@cspell/dict-csharp" "^4.0.8" - "@cspell/dict-css" "^4.0.19" - "@cspell/dict-dart" "^2.3.2" - "@cspell/dict-data-science" "^2.0.13" - "@cspell/dict-django" "^4.1.6" - "@cspell/dict-docker" "^1.1.17" - "@cspell/dict-dotnet" "^5.0.11" - "@cspell/dict-elixir" "^4.0.8" - "@cspell/dict-en-common-misspellings" "^2.1.12" - "@cspell/dict-en-gb-mit" "^3.1.17" - "@cspell/dict-en_us" "^4.4.28" - "@cspell/dict-filetypes" "^3.0.15" - "@cspell/dict-flutter" "^1.1.1" - "@cspell/dict-fonts" "^4.0.5" - "@cspell/dict-fsharp" "^1.1.1" - "@cspell/dict-fullstack" "^3.2.8" - "@cspell/dict-gaming-terms" "^1.1.2" - "@cspell/dict-git" "^3.1.0" - "@cspell/dict-golang" "^6.0.26" - "@cspell/dict-google" "^1.0.9" - "@cspell/dict-haskell" "^4.0.6" - "@cspell/dict-html" "^4.0.14" - "@cspell/dict-html-symbol-entities" "^4.0.5" - "@cspell/dict-java" "^5.0.12" - "@cspell/dict-julia" "^1.1.1" - "@cspell/dict-k8s" "^1.0.12" - "@cspell/dict-kotlin" "^1.1.1" - "@cspell/dict-latex" "^5.0.0" - "@cspell/dict-lorem-ipsum" "^4.0.5" - "@cspell/dict-lua" "^4.0.8" - "@cspell/dict-makefile" "^1.0.5" - "@cspell/dict-markdown" "^2.0.14" - "@cspell/dict-monkeyc" "^1.0.12" - "@cspell/dict-node" "^5.0.9" - "@cspell/dict-npm" "^5.2.32" - "@cspell/dict-php" "^4.1.1" - "@cspell/dict-powershell" "^5.0.15" - "@cspell/dict-public-licenses" "^2.0.15" - "@cspell/dict-python" "^4.2.25" - "@cspell/dict-r" "^2.1.1" - "@cspell/dict-ruby" "^5.1.0" - "@cspell/dict-rust" "^4.1.2" - "@cspell/dict-scala" "^5.0.9" - "@cspell/dict-shell" "^1.1.2" - "@cspell/dict-software-terms" "^5.1.20" - "@cspell/dict-sql" "^2.2.1" - "@cspell/dict-svelte" "^1.0.7" - "@cspell/dict-swift" "^2.0.6" - "@cspell/dict-terraform" "^1.1.3" - "@cspell/dict-typescript" "^3.2.3" - "@cspell/dict-vue" "^3.0.5" - "@cspell/dict-zig" "^1.0.0" - -"@cspell/cspell-performance-monitor@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/cspell-performance-monitor/-/cspell-performance-monitor-9.6.4.tgz#17719196e9c242b09bb804972f2f4dc0076c74c7" - integrity sha512-exuqxV1IVfZkasg57ZjUbaHeZDd6Mdbsbe5FBT3+XaVnRij+wpY2oEW9+kIOL5MOQE3bgQKgu37iMtA1NlCrGA== - -"@cspell/cspell-pipe@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/cspell-pipe/-/cspell-pipe-9.6.4.tgz#521b542ef0759460c25366b392943625c507e1a1" - integrity sha512-vVxajTG9Ko01oHk8HPsMLajcLrd9AfkOk6vdgFI4FD7ZPq1CY0hfTmfmJ8bzZ4/QkqXglTvePdSgHQVJeltwWw== - -"@cspell/cspell-resolver@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/cspell-resolver/-/cspell-resolver-9.6.4.tgz#0c527ebbee041aada1276bf122557c7b8b39d066" - integrity sha512-3xsgZEqqH9Uj8ZYLBnWbnsHz8wphgaeuWKcNDqgwoMjvwTMQLGoXjHht8Jx5yxd2e080lB7fJax8TaBdCzmFFA== - dependencies: - global-directory "^4.0.1" - -"@cspell/cspell-service-bus@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/cspell-service-bus/-/cspell-service-bus-9.6.4.tgz#54308fef3e27e6cedc8d6a381f31957bc766bf37" - integrity sha512-oGNEzP1gJ43rLklJQjOk5PsfX0mZkLjV19djGptb9xZQeC2qAUxnaAbZtWt5CE8ni2iiTaRmgNRbUqAhRCnjew== - -"@cspell/cspell-types@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/cspell-types/-/cspell-types-9.6.4.tgz#78a60dddb76c0283425cfea2b305b3076817067b" - integrity sha512-lf6d+BdMkJIFCxx2FpajLpqVGGyaGUNFU6jhEM6QUPeGuoA5et2kJXrL0NSY2uWLOVyYYc/FPjzlbe8trA9tBQ== - -"@cspell/dict-ada@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-ada/-/dict-ada-4.1.1.tgz#78c0c9916e8c96cd38908c02b0c4979f9622c650" - integrity sha512-E+0YW9RhZod/9Qy2gxfNZiHJjCYFlCdI69br1eviQQWB8yOTJX0JHXLs79kOYhSW0kINPVUdvddEBe6Lu6CjGQ== - -"@cspell/dict-al@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-al/-/dict-al-1.1.1.tgz#d6581e7801daa0f4e7512d3431e7f00c1e7d53e1" - integrity sha512-sD8GCaZetgQL4+MaJLXqbzWcRjfKVp8x+px3HuCaaiATAAtvjwUQ5/Iubiqwfd1boIh2Y1/3EgM3TLQ7Q8e0wQ== - -"@cspell/dict-aws@^4.0.17": - version "4.0.17" - resolved "https://registry.yarnpkg.com/@cspell/dict-aws/-/dict-aws-4.0.17.tgz#73dba92ce69868babe114d6e436a5e4dd45b6c6c" - integrity sha512-ORcblTWcdlGjIbWrgKF+8CNEBQiLVKdUOFoTn0KPNkAYnFcdPP0muT4892h7H4Xafh3j72wqB4/loQ6Nti9E/w== - -"@cspell/dict-bash@^4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@cspell/dict-bash/-/dict-bash-4.2.2.tgz#44250d9f64067cf20a8d76dc885963c6902c6e21" - integrity sha512-kyWbwtX3TsCf5l49gGQIZkRLaB/P8g73GDRm41Zu8Mv51kjl2H7Au0TsEvHv7jzcsRLS6aUYaZv6Zsvk1fOz+Q== - dependencies: - "@cspell/dict-shell" "1.1.2" - -"@cspell/dict-companies@^3.2.10": - version "3.2.10" - resolved "https://registry.yarnpkg.com/@cspell/dict-companies/-/dict-companies-3.2.10.tgz#0c6f5ad5e55319ff04b5b8a3a4e53c34042fcdf3" - integrity sha512-bJ1qnO1DkTn7JYGXvxp8FRQc4yq6tRXnrII+jbP8hHmq5TX5o1Wu+rdfpoUQaMWTl6balRvcMYiINDesnpR9Bw== - -"@cspell/dict-cpp@^7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@cspell/dict-cpp/-/dict-cpp-7.0.2.tgz#bbedeb669e56956f2da7e0977a3a1ad4dc660f83" - integrity sha512-dfbeERiVNeqmo/npivdR6rDiBCqZi3QtjH2Z0HFcXwpdj6i97dX1xaKyK2GUsO/p4u1TOv63Dmj5Vm48haDpuA== - -"@cspell/dict-cryptocurrencies@^5.0.5": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-5.0.5.tgz#843a6ac45216227f5436c442a8683c1571e57160" - integrity sha512-R68hYYF/rtlE6T/dsObStzN5QZw+0aQBinAXuWCVqwdS7YZo0X33vGMfChkHaiCo3Z2+bkegqHlqxZF4TD3rUA== - -"@cspell/dict-csharp@^4.0.8": - version "4.0.8" - resolved "https://registry.yarnpkg.com/@cspell/dict-csharp/-/dict-csharp-4.0.8.tgz#27f6d5873f4dde77c03c78bb7d3c51bc8d8d78c1" - integrity sha512-qmk45pKFHSxckl5mSlbHxmDitSsGMlk/XzFgt7emeTJWLNSTUK//MbYAkBNRtfzB4uD7pAFiKgpKgtJrTMRnrQ== - -"@cspell/dict-css@^4.0.19": - version "4.0.19" - resolved "https://registry.yarnpkg.com/@cspell/dict-css/-/dict-css-4.0.19.tgz#0d7c78ff00ee73420ad9f8588d30df00bc290090" - integrity sha512-VYHtPnZt/Zd/ATbW3rtexWpBnHUohUrQOHff/2JBhsVgxOrksAxJnLAO43Q1ayLJBJUUwNVo+RU0sx0aaysZfg== - -"@cspell/dict-dart@^2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@cspell/dict-dart/-/dict-dart-2.3.2.tgz#aae782dcf6c673857945b9bbe03beeaa79649222" - integrity sha512-sUiLW56t9gfZcu8iR/5EUg+KYyRD83Cjl3yjDEA2ApVuJvK1HhX+vn4e4k4YfjpUQMag8XO2AaRhARE09+/rqw== - -"@cspell/dict-data-science@^2.0.13": - version "2.0.13" - resolved "https://registry.yarnpkg.com/@cspell/dict-data-science/-/dict-data-science-2.0.13.tgz#234e399bd7af8cd6c1be6054be7b65aed6974479" - integrity sha512-l1HMEhBJkPmw4I2YGVu2eBSKM89K9pVF+N6qIr5Uo5H3O979jVodtuwP8I7LyPrJnC6nz28oxeGRCLh9xC5CVA== - -"@cspell/dict-django@^4.1.6": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@cspell/dict-django/-/dict-django-4.1.6.tgz#a92408ba8971ca3df3c602b9e3750a14be69a8f6" - integrity sha512-SdbSFDGy9ulETqNz15oWv2+kpWLlk8DJYd573xhIkeRdcXOjskRuxjSZPKfW7O3NxN/KEf3gm3IevVOiNuFS+w== - -"@cspell/dict-docker@^1.1.17": - version "1.1.17" - resolved "https://registry.yarnpkg.com/@cspell/dict-docker/-/dict-docker-1.1.17.tgz#8674b3613dfa9c7d2922f6ec29ff845cb16e6650" - integrity sha512-OcnVTIpHIYYKhztNTyK8ShAnXTfnqs43hVH6p0py0wlcwRIXe5uj4f12n7zPf2CeBI7JAlPjEsV0Rlf4hbz/xQ== - -"@cspell/dict-dotnet@^5.0.11": - version "5.0.12" - resolved "https://registry.yarnpkg.com/@cspell/dict-dotnet/-/dict-dotnet-5.0.12.tgz#c856db0896b6833bde1e727d590d85cec96a1f8d" - integrity sha512-FiV934kNieIjGTkiApu/WKvLYi/KBpvfWB2TSqpDQtmXZlt3uSa5blwblO1ZC8OvjH8RCq/31H5IdEYmTaZS7A== - -"@cspell/dict-elixir@^4.0.8": - version "4.0.8" - resolved "https://registry.yarnpkg.com/@cspell/dict-elixir/-/dict-elixir-4.0.8.tgz#c1b2a30d0fc654a001f718f196beb60c01e0e1f6" - integrity sha512-CyfphrbMyl4Ms55Vzuj+mNmd693HjBFr9hvU+B2YbFEZprE5AG+EXLYTMRWrXbpds4AuZcvN3deM2XVB80BN/Q== - -"@cspell/dict-en-common-misspellings@^2.1.12": - version "2.1.12" - resolved "https://registry.yarnpkg.com/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.1.12.tgz#5e15fdbdd65d6624518cb2812d0cc2c445faada8" - integrity sha512-14Eu6QGqyksqOd4fYPuRb58lK1Va7FQK9XxFsRKnZU8LhL3N+kj7YKDW+7aIaAN/0WGEqslGP6lGbQzNti8Akw== - -"@cspell/dict-en-gb-mit@^3.1.17": - version "3.1.18" - resolved "https://registry.yarnpkg.com/@cspell/dict-en-gb-mit/-/dict-en-gb-mit-3.1.18.tgz#6f93c5339921dc0bb4719f9a11b7721e01ce7890" - integrity sha512-AXaMzbaxhSc32MSzKX0cpwT+Thv1vPfxQz1nTly1VHw3wQcwPqVFSqrLOYwa8VNqAPR45583nnhD6iqJ9YESoQ== - -"@cspell/dict-en_us@^4.4.28": - version "4.4.29" - resolved "https://registry.yarnpkg.com/@cspell/dict-en_us/-/dict-en_us-4.4.29.tgz#b83162051201f35a7c7728678f738b931955ec0e" - integrity sha512-G3B27++9ziRdgbrY/G/QZdFAnMzzx17u8nCb2Xyd4q6luLpzViRM/CW3jA+Mb/cGT5zR/9N+Yz9SrGu1s0bq7g== - -"@cspell/dict-filetypes@^3.0.15": - version "3.0.15" - resolved "https://registry.yarnpkg.com/@cspell/dict-filetypes/-/dict-filetypes-3.0.15.tgz#63e39ffcfd25a4787d88b1ba8b461d20833c514f" - integrity sha512-uDMeqYlLlK476w/muEFQGBy9BdQWS0mQ7BJiy/iQv5XUWZxE2O54ZQd9nW8GyQMzAgoyg5SG4hf9l039Qt66oA== - -"@cspell/dict-flutter@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-flutter/-/dict-flutter-1.1.1.tgz#fab57cf189a8012e870d2e1f21526b18345038d7" - integrity sha512-UlOzRcH2tNbFhZmHJN48Za/2/MEdRHl2BMkCWZBYs+30b91mWvBfzaN4IJQU7dUZtowKayVIF9FzvLZtZokc5A== - -"@cspell/dict-fonts@^4.0.5": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@cspell/dict-fonts/-/dict-fonts-4.0.5.tgz#21ff391df20722c7d370ce79c89665e4b8980200" - integrity sha512-BbpkX10DUX/xzHs6lb7yzDf/LPjwYIBJHJlUXSBXDtK/1HaeS+Wqol4Mlm2+NAgZ7ikIE5DQMViTgBUY3ezNoQ== - -"@cspell/dict-fsharp@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-fsharp/-/dict-fsharp-1.1.1.tgz#46414a8177b1c3373f1edb156df446088147cc22" - integrity sha512-imhs0u87wEA4/cYjgzS0tAyaJpwG7vwtC8UyMFbwpmtw+/bgss+osNfyqhYRyS/ehVCWL17Ewx2UPkexjKyaBA== - -"@cspell/dict-fullstack@^3.2.8": - version "3.2.8" - resolved "https://registry.yarnpkg.com/@cspell/dict-fullstack/-/dict-fullstack-3.2.8.tgz#8ae90638263bc16cfeccac41c97d8a8c65ad2f29" - integrity sha512-J6EeoeThvx/DFrcA2rJiCA6vfqwJMbkG0IcXhlsmRZmasIpanmxgt90OEaUazbZahFiuJT8wrhgQ1QgD1MsqBw== - -"@cspell/dict-gaming-terms@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.1.2.tgz#459aa470b43eacbd3cbf7b32bd5bbb259cb78812" - integrity sha512-9XnOvaoTBscq0xuD6KTEIkk9hhdfBkkvJAIsvw3JMcnp1214OCGW8+kako5RqQ2vTZR3Tnf3pc57o7VgkM0q1Q== - -"@cspell/dict-git@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@cspell/dict-git/-/dict-git-3.1.0.tgz#7ac48114425c74e0a1c00f154138cf81b04f250b" - integrity sha512-KEt9zGkxqGy2q1nwH4CbyqTSv5nadpn8BAlDnzlRcnL0Xb3LX9xTgSGShKvzb0bw35lHoYyLWN2ZKAqbC4pgGQ== - -"@cspell/dict-golang@^6.0.26": - version "6.0.26" - resolved "https://registry.yarnpkg.com/@cspell/dict-golang/-/dict-golang-6.0.26.tgz#8d0a6f09ade1c489a92b594475bba2b6020b6d28" - integrity sha512-YKA7Xm5KeOd14v5SQ4ll6afe9VSy3a2DWM7L9uBq4u3lXToRBQ1W5PRa+/Q9udd+DTURyVVnQ+7b9cnOlNxaRg== - -"@cspell/dict-google@^1.0.9": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@cspell/dict-google/-/dict-google-1.0.9.tgz#5bf72aecf2ae8289bd2427245ca13ee77b39399c" - integrity sha512-biL65POqialY0i4g6crj7pR6JnBkbsPovB2WDYkj3H4TuC/QXv7Pu5pdPxeUJA6TSCHI7T5twsO4VSVyRxD9CA== - -"@cspell/dict-haskell@^4.0.6": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@cspell/dict-haskell/-/dict-haskell-4.0.6.tgz#881436f944a6901cff8fab1af776277ca96f1b8c" - integrity sha512-ib8SA5qgftExpYNjWhpYIgvDsZ/0wvKKxSP+kuSkkak520iPvTJumEpIE+qPcmJQo4NzdKMN8nEfaeci4OcFAQ== - -"@cspell/dict-html-symbol-entities@^4.0.5": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.5.tgz#cbdd8c133c7d649d32e10f48b58bd4a9304b5cb6" - integrity sha512-429alTD4cE0FIwpMucvSN35Ld87HCyuM8mF731KU5Rm4Je2SG6hmVx7nkBsLyrmH3sQukTcr1GaiZsiEg8svPA== - -"@cspell/dict-html@^4.0.14": - version "4.0.14" - resolved "https://registry.yarnpkg.com/@cspell/dict-html/-/dict-html-4.0.14.tgz#bc188c7094ed02be9aef3b7be65c601363026c99" - integrity sha512-2bf7n+kS92g+cMKV0wr9o/Oq9n8JzU7CcrB96gIh2GHgnF+0xDOqO2W/1KeFAqOfqosoOVE48t+4dnEMkkoJ2Q== - -"@cspell/dict-java@^5.0.12": - version "5.0.12" - resolved "https://registry.yarnpkg.com/@cspell/dict-java/-/dict-java-5.0.12.tgz#869ab27a972c7c0854a7a4854b770c4cf941fb8b" - integrity sha512-qPSNhTcl7LGJ5Qp6VN71H8zqvRQK04S08T67knMq9hTA8U7G1sTKzLmBaDOFhq17vNX/+rT+rbRYp+B5Nwza1A== - -"@cspell/dict-julia@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-julia/-/dict-julia-1.1.1.tgz#78601c0e9397c2cba1aecfcc01dcc0654c5d2b9a" - integrity sha512-WylJR9TQ2cgwd5BWEOfdO3zvDB+L7kYFm0I9u0s9jKHWQ6yKmfKeMjU9oXxTBxIufhCXm92SKwwVNAC7gjv+yA== - -"@cspell/dict-k8s@^1.0.12": - version "1.0.12" - resolved "https://registry.yarnpkg.com/@cspell/dict-k8s/-/dict-k8s-1.0.12.tgz#f4dd4e780fd698af8b9e3ac9106d10c35a96df18" - integrity sha512-2LcllTWgaTfYC7DmkMPOn9GsBWsA4DZdlun4po8s2ysTP7CPEnZc1ZfK6pZ2eI4TsZemlUQQ+NZxMe9/QutQxg== - -"@cspell/dict-kotlin@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-kotlin/-/dict-kotlin-1.1.1.tgz#830d7b3d33685c0998ef5b922b0d7779f6669706" - integrity sha512-J3NzzfgmxRvEeOe3qUXnSJQCd38i/dpF9/t3quuWh6gXM+krsAXP75dY1CzDmS8mrJAlBdVBeAW5eAZTD8g86Q== - -"@cspell/dict-latex@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@cspell/dict-latex/-/dict-latex-5.0.0.tgz#3c43e77df6a7abe84176bc5395fdb5dbb417e5f8" - integrity sha512-HUrIqUVohM6P0+5b7BsdAdb0STIv0aaFBvguI7pLcreljlcX3FSPUxea7ticzNlCNeVrEaiEn/ws9m6rYUeuNw== - -"@cspell/dict-lorem-ipsum@^4.0.5": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.5.tgz#0321cef57b09387ea3dbae1ecd52123da9ec810f" - integrity sha512-9a4TJYRcPWPBKkQAJ/whCu4uCAEgv/O2xAaZEI0n4y1/l18Yyx8pBKoIX5QuVXjjmKEkK7hi5SxyIsH7pFEK9Q== - -"@cspell/dict-lua@^4.0.8": - version "4.0.8" - resolved "https://registry.yarnpkg.com/@cspell/dict-lua/-/dict-lua-4.0.8.tgz#0bb1683212cdac2acb60483bd5c8970d62a41972" - integrity sha512-N4PkgNDMu9JVsRu7JBS/3E/dvfItRgk9w5ga2dKq+JupP2Y3lojNaAVFhXISh4Y0a6qXDn2clA6nvnavQ/jjLA== - -"@cspell/dict-makefile@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@cspell/dict-makefile/-/dict-makefile-1.0.5.tgz#fe6e7df2360ff694ef41c90a0d4b422e81f560ef" - integrity sha512-4vrVt7bGiK8Rx98tfRbYo42Xo2IstJkAF4tLLDMNQLkQ86msDlYSKG1ZCk8Abg+EdNcFAjNhXIiNO+w4KflGAQ== - -"@cspell/dict-markdown@^2.0.14": - version "2.0.14" - resolved "https://registry.yarnpkg.com/@cspell/dict-markdown/-/dict-markdown-2.0.14.tgz#9c3f83af1608acf601f396344a15d8844b04b6f2" - integrity sha512-uLKPNJsUcumMQTsZZgAK9RgDLyQhUz/uvbQTEkvF/Q4XfC1i/BnA8XrOrd0+Vp6+tPOKyA+omI5LRWfMu5K/Lw== - -"@cspell/dict-monkeyc@^1.0.12": - version "1.0.12" - resolved "https://registry.yarnpkg.com/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.12.tgz#76d4127d19d861acfb047a24fdc841b781416ef4" - integrity sha512-MN7Vs11TdP5mbdNFQP5x2Ac8zOBm97ARg6zM5Sb53YQt/eMvXOMvrep7+/+8NJXs0jkp70bBzjqU4APcqBFNAw== - -"@cspell/dict-node@^5.0.9": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@cspell/dict-node/-/dict-node-5.0.9.tgz#ca894e62b85deaf2f55e9d9c86fdbb260ba923eb" - integrity sha512-hO+ga+uYZ/WA4OtiMEyKt5rDUlUyu3nXMf8KVEeqq2msYvAPdldKBGH7lGONg6R/rPhv53Rb+0Y1SLdoK1+7wQ== - -"@cspell/dict-npm@^5.2.32": - version "5.2.34" - resolved "https://registry.yarnpkg.com/@cspell/dict-npm/-/dict-npm-5.2.34.tgz#6a37cfb680156e51d96dfcda827e42f61d64ecfb" - integrity sha512-M2MtfmYeHIPBuC8esMU4JQXHKma7Xt7VyBWUk67B62KDu61sxebQ2HeizdqmN2sLEJsTkq3bZT5PGzHpZ0LEWQ== - -"@cspell/dict-php@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-php/-/dict-php-4.1.1.tgz#39117cde87706f843a0476c56b807c16d71a9e4b" - integrity sha512-EXelI+4AftmdIGtA8HL8kr4WlUE11OqCSVlnIgZekmTkEGSZdYnkFdiJ5IANSALtlQ1mghKjz+OFqVs6yowgWA== - -"@cspell/dict-powershell@^5.0.15": - version "5.0.15" - resolved "https://registry.yarnpkg.com/@cspell/dict-powershell/-/dict-powershell-5.0.15.tgz#4ad8b6a741c96508f7b5acbcda2a15978be351c6" - integrity sha512-l4S5PAcvCFcVDMJShrYD0X6Huv9dcsQPlsVsBGbH38wvuN7gS7+GxZFAjTNxDmTY1wrNi1cCatSg6Pu2BW4rgg== - -"@cspell/dict-public-licenses@^2.0.15": - version "2.0.15" - resolved "https://registry.yarnpkg.com/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.15.tgz#e5a627fec1e08a482adef9e2e1a4f27e30740abf" - integrity sha512-cJEOs901H13Pfy0fl4dCD1U+xpWIMaEPq8MeYU83FfDZvellAuSo4GqWCripfIqlhns/L6+UZEIJSOZnjgy7Wg== - -"@cspell/dict-python@^4.2.25": - version "4.2.25" - resolved "https://registry.yarnpkg.com/@cspell/dict-python/-/dict-python-4.2.25.tgz#faa0933aaeb121570f2faa00967b3cf6c298b6a5" - integrity sha512-hDdN0YhKgpbtZVRjQ2c8jk+n0wQdidAKj1Fk8w7KEHb3YlY5uPJ0mAKJk7AJKPNLOlILoUmN+HAVJz+cfSbWYg== - dependencies: - "@cspell/dict-data-science" "^2.0.13" - -"@cspell/dict-r@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-r/-/dict-r-2.1.1.tgz#ace8d66799cae4148411bb6483d9c8a8a3c8a50f" - integrity sha512-71Ka+yKfG4ZHEMEmDxc6+blFkeTTvgKbKAbwiwQAuKl3zpqs1Y0vUtwW2N4b3LgmSPhV3ODVY0y4m5ofqDuKMw== - -"@cspell/dict-ruby@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@cspell/dict-ruby/-/dict-ruby-5.1.0.tgz#daf18ae87ad6dbfa7d7292e46b61f004eb40347f" - integrity sha512-9PJQB3cfkBULrMLp5kSAcFPpzf8oz9vFN+QYZABhQwWkGbuzCIXSorHrmWSASlx4yejt3brjaWS57zZ/YL5ZQQ== - -"@cspell/dict-rust@^4.1.2": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@cspell/dict-rust/-/dict-rust-4.1.2.tgz#6a151e72dc3be916c040111bba7358401ba57e15" - integrity sha512-O1FHrumYcO+HZti3dHfBPUdnDFkI+nbYK3pxYmiM1sr+G0ebOd6qchmswS0Wsc6ZdEVNiPYJY/gZQR6jfW3uOg== - -"@cspell/dict-scala@^5.0.9": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@cspell/dict-scala/-/dict-scala-5.0.9.tgz#181d6b9cad0596bec2f8df198a79576f97112b6e" - integrity sha512-AjVcVAELgllybr1zk93CJ5wSUNu/Zb5kIubymR/GAYkMyBdYFCZ3Zbwn4Zz8GJlFFAbazABGOu0JPVbeY59vGg== - -"@cspell/dict-shell@1.1.2", "@cspell/dict-shell@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@cspell/dict-shell/-/dict-shell-1.1.2.tgz#33634372214d3a3466b409e94392f6aaee6a0e9b" - integrity sha512-WqOUvnwcHK1X61wAfwyXq04cn7KYyskg90j4lLg3sGGKMW9Sq13hs91pqrjC44Q+lQLgCobrTkMDw9Wyl9nRFA== - -"@cspell/dict-software-terms@^5.1.20": - version "5.1.21" - resolved "https://registry.yarnpkg.com/@cspell/dict-software-terms/-/dict-software-terms-5.1.21.tgz#94f1d4a5635124fbbd9a9be2edd0696931d55df0" - integrity sha512-3lAB4OXsf6rs5zbwe4/nKmwyAJAvjs5KTRrPckzHx7q9dYpviW+UxDyhevCCsRfmcu24OhYP7BVQWXxLvYk4xA== - -"@cspell/dict-sql@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-sql/-/dict-sql-2.2.1.tgz#7dd2f1da1c32d3837c98986ab65727bb94332597" - integrity sha512-qDHF8MpAYCf4pWU8NKbnVGzkoxMNrFqBHyG/dgrlic5EQiKANCLELYtGlX5auIMDLmTf1inA0eNtv74tyRJ/vg== - -"@cspell/dict-svelte@^1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@cspell/dict-svelte/-/dict-svelte-1.0.7.tgz#c2d9edabc34052b56f6b19754672d392caa315e0" - integrity sha512-hGZsGqP0WdzKkdpeVLBivRuSNzOTvN036EBmpOwxH+FTY2DuUH7ecW+cSaMwOgmq5JFSdTcbTNFlNC8HN8lhaQ== - -"@cspell/dict-swift@^2.0.6": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@cspell/dict-swift/-/dict-swift-2.0.6.tgz#bd2f7684b6fbf287fe82c4ebc0736bb38170bd2c" - integrity sha512-PnpNbrIbex2aqU1kMgwEKvCzgbkHtj3dlFLPMqW1vSniop7YxaDTtvTUO4zA++ugYAEL+UK8vYrBwDPTjjvSnA== - -"@cspell/dict-terraform@^1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@cspell/dict-terraform/-/dict-terraform-1.1.3.tgz#ccd45bd1e4a4ae69cdf8f8649a881c63b7295c66" - integrity sha512-gr6wxCydwSFyyBKhBA2xkENXtVFToheqYYGFvlMZXWjviynXmh+NK/JTvTCk/VHk3+lzbO9EEQKee6VjrAUSbA== - -"@cspell/dict-typescript@^3.2.3": - version "3.2.3" - resolved "https://registry.yarnpkg.com/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz#cf90e8248d6e5749daaa49bff460060b77d12301" - integrity sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg== - -"@cspell/dict-vue@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@cspell/dict-vue/-/dict-vue-3.0.5.tgz#e915b6a004d0352f5c27a2e4583c42dba62b6ce0" - integrity sha512-Mqutb8jbM+kIcywuPQCCaK5qQHTdaByoEO2J9LKFy3sqAdiBogNkrplqUK0HyyRFgCfbJUgjz3N85iCMcWH0JA== - -"@cspell/dict-zig@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@cspell/dict-zig/-/dict-zig-1.0.0.tgz#f75fef19f2fdad6f5bc4d02b95b8bec824e82ab9" - integrity sha512-XibBIxBlVosU06+M6uHWkFeT0/pW5WajDRYdXG2CgHnq85b0TI/Ks0FuBJykmsgi2CAD3Qtx8UHFEtl/DSFnAQ== - -"@cspell/dynamic-import@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/dynamic-import/-/dynamic-import-9.6.4.tgz#fa7dfb4c0d5489d15461da91627bed4f00913409" - integrity sha512-1VnL9ahT3s17DLWl4MeO1pYg7zcVT3X9cKynI2/U86zNK5xMGS5icvjp7X65tsCAVNcWOtkqVFfrxi7kWxn67g== - dependencies: - "@cspell/url" "9.6.4" - import-meta-resolve "^4.2.0" - -"@cspell/eslint-plugin@^9.3.0": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/eslint-plugin/-/eslint-plugin-9.6.4.tgz#a4f6bc68c1a97efa688095703305edcf45450fea" - integrity sha512-MldCPtfj7XWQY7bnnLS/7A/YfLKWGUQALg2hSNy6AQ28R26o1HesGYY27lzePa2sbgTTy2X1tONCyaOIkmnSmQ== - dependencies: - "@cspell/cspell-types" "9.6.4" - "@cspell/url" "9.6.4" - cspell-lib "9.6.4" - synckit "^0.11.12" - -"@cspell/filetypes@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/filetypes/-/filetypes-9.6.4.tgz#cc4fadb60baf430fccaa8505ace97f2cbe723981" - integrity sha512-a1aZ/8vGnhTknxTukjzo3m8CISyHW2MWnbedywg5SDEl5RMJitmzX90QZiQdSvEcqzqmtoAgSEZNBT2LX2gIKg== - -"@cspell/rpc@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/rpc/-/rpc-9.6.4.tgz#0d035ed105ab548cbd6b79d9d9d1ae13d9357977" - integrity sha512-vGI1788Rx5Yml9N1/pD4zGd8Vrchi2Y01ADf9NiiOaNVVdf4PU1GCssLCsiIzhYQneErpQ8pJi/mS2F/QMZbRA== - -"@cspell/strong-weak-map@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/strong-weak-map/-/strong-weak-map-9.6.4.tgz#4264fa2119cec48ec6a7e546012e452ce50263d8" - integrity sha512-AQrUbA0JUOEQgwItnfUQ6Ydk0hWY/uV3VhLwZWyrnT9eiQynmTnRTHtOCkkSl9+M4P0N4Raa2eGFRLcPAFksaw== - -"@cspell/url@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/url/-/url-9.6.4.tgz#37488bd963ab483647055288f9619bcd7cdb7a82" - integrity sha512-h6VMlb7bDyGJfwLtipxxtHlT+ojzUXZz14AqZ/NEzY3LfOhfJTGpRcWLYFsgG/L0Ma4qjsYbPJt/Sj1C14j0VA== - -"@discoveryjs/json-ext@^0.6.1": - version "0.6.3" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz#f13c7c205915eb91ae54c557f5e92bddd8be0e83" - integrity sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ== - -"@emnapi/core@^1.1.0", "@emnapi/core@^1.4.3", "@emnapi/core@^1.5.0", "@emnapi/core@^1.7.1": - version "1.8.1" - resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.8.1.tgz#fd9efe721a616288345ffee17a1f26ac5dd01349" - integrity sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg== - dependencies: - "@emnapi/wasi-threads" "1.1.0" - tslib "^2.4.0" - -"@emnapi/runtime@^1.1.0", "@emnapi/runtime@^1.4.3", "@emnapi/runtime@^1.5.0", "@emnapi/runtime@^1.7.1": - version "1.8.1" - resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.8.1.tgz#550fa7e3c0d49c5fb175a116e8cd70614f9a22a5" - integrity sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg== - dependencies: - tslib "^2.4.0" - -"@emnapi/wasi-threads@1.1.0", "@emnapi/wasi-threads@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz#60b2102fddc9ccb78607e4a3cf8403ea69be41bf" - integrity sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ== - dependencies: - tslib "^2.4.0" - -"@emotion/babel-plugin@^11.13.5": - version "11.13.5" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz#eab8d65dbded74e0ecfd28dc218e75607c4e7bc0" - integrity sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/runtime" "^7.18.3" - "@emotion/hash" "^0.9.2" - "@emotion/memoize" "^0.9.0" - "@emotion/serialize" "^1.3.3" - babel-plugin-macros "^3.1.0" - convert-source-map "^1.5.0" - escape-string-regexp "^4.0.0" - find-root "^1.1.0" - source-map "^0.5.7" - stylis "4.2.0" - -"@emotion/cache@^11.13.5", "@emotion/cache@^11.14.0": - version "11.14.0" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.14.0.tgz#ee44b26986eeb93c8be82bb92f1f7a9b21b2ed76" - integrity sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA== - dependencies: - "@emotion/memoize" "^0.9.0" - "@emotion/sheet" "^1.4.0" - "@emotion/utils" "^1.4.2" - "@emotion/weak-memoize" "^0.4.0" - stylis "4.2.0" - -"@emotion/css@^11.11.2": - version "11.13.5" - resolved "https://registry.yarnpkg.com/@emotion/css/-/css-11.13.5.tgz#db2d3be6780293640c082848e728a50544b9dfa4" - integrity sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w== - dependencies: - "@emotion/babel-plugin" "^11.13.5" - "@emotion/cache" "^11.13.5" - "@emotion/serialize" "^1.3.3" - "@emotion/sheet" "^1.4.0" - "@emotion/utils" "^1.4.2" - -"@emotion/hash@^0.9.2": - version "0.9.2" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b" - integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== - -"@emotion/is-prop-valid@^1.3.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz#e9ad47adff0b5c94c72db3669ce46de33edf28c0" - integrity sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw== - dependencies: - "@emotion/memoize" "^0.9.0" - -"@emotion/memoize@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz#745969d649977776b43fc7648c556aaa462b4102" - integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ== - -"@emotion/react@^11.11.4": - version "11.14.0" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.14.0.tgz#cfaae35ebc67dd9ef4ea2e9acc6cd29e157dd05d" - integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.13.5" - "@emotion/cache" "^11.14.0" - "@emotion/serialize" "^1.3.3" - "@emotion/use-insertion-effect-with-fallbacks" "^1.2.0" - "@emotion/utils" "^1.4.2" - "@emotion/weak-memoize" "^0.4.0" - hoist-non-react-statics "^3.3.1" - -"@emotion/serialize@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.3.tgz#d291531005f17d704d0463a032fe679f376509e8" - integrity sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA== - dependencies: - "@emotion/hash" "^0.9.2" - "@emotion/memoize" "^0.9.0" - "@emotion/unitless" "^0.10.0" - "@emotion/utils" "^1.4.2" - csstype "^3.0.2" - -"@emotion/sheet@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.4.0.tgz#c9299c34d248bc26e82563735f78953d2efca83c" - integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg== - -"@emotion/styled@^11.11.5": - version "11.14.1" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.14.1.tgz#8c34bed2948e83e1980370305614c20955aacd1c" - integrity sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.13.5" - "@emotion/is-prop-valid" "^1.3.0" - "@emotion/serialize" "^1.3.3" - "@emotion/use-insertion-effect-with-fallbacks" "^1.2.0" - "@emotion/utils" "^1.4.2" - -"@emotion/unitless@^0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.10.0.tgz#2af2f7c7e5150f497bdabd848ce7b218a27cf745" - integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg== - -"@emotion/use-insertion-effect-with-fallbacks@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz#8a8cb77b590e09affb960f4ff1e9a89e532738bf" - integrity sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg== - -"@emotion/utils@^1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.2.tgz#6df6c45881fcb1c412d6688a311a98b7f59c1b52" - integrity sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA== - -"@emotion/weak-memoize@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz#5e13fac887f08c44f76b0ccaf3370eb00fec9bb6" - integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg== - -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/aix-ppc64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz#815b39267f9bffd3407ea6c376ac32946e24f8d2" - integrity sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz#19b882408829ad8e12b10aff2840711b2da361e8" - integrity sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-arm@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.27.3.tgz#90be58de27915efa27b767fcbdb37a4470627d7b" - integrity sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - -"@esbuild/android-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.27.3.tgz#d7dcc976f16e01a9aaa2f9b938fbec7389f895ac" - integrity sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ== - -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@esbuild/darwin-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz#9f6cac72b3a8532298a6a4493ed639a8988e8abd" - integrity sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg== - -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/darwin-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz#ac61d645faa37fd650340f1866b0812e1fb14d6a" - integrity sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz#b8625689d73cf1830fe58c39051acdc12474ea1b" - integrity sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/freebsd-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz#07be7dd3c9d42fe0eccd2ab9f9ded780bc53bead" - integrity sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz#bf31918fe5c798586460d2b3d6c46ed2c01ca0b6" - integrity sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-arm@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz#28493ee46abec1dc3f500223cd9f8d2df08f9d11" - integrity sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-ia32@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz#750752a8b30b43647402561eea764d0a41d0ee29" - integrity sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-loong64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz#a5a92813a04e71198c50f05adfaf18fc1e95b9ed" - integrity sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-mips64el@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz#deb45d7fd2d2161eadf1fbc593637ed766d50bb1" - integrity sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-ppc64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz#6f39ae0b8c4d3d2d61a65b26df79f6e12a1c3d78" - integrity sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-riscv64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz#4c5c19c3916612ec8e3915187030b9df0b955c1d" - integrity sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@esbuild/linux-s390x@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz#9ed17b3198fa08ad5ccaa9e74f6c0aff7ad0156d" - integrity sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw== - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@esbuild/linux-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz#12383dcbf71b7cf6513e58b4b08d95a710bf52a5" - integrity sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA== - -"@esbuild/netbsd-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz#dd0cb2fa543205fcd931df44f4786bfcce6df7d7" - integrity sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA== - -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/netbsd-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz#028ad1807a8e03e155153b2d025b506c3787354b" - integrity sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA== - -"@esbuild/openbsd-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz#e3c16ff3490c9b59b969fffca87f350ffc0e2af5" - integrity sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/openbsd-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz#c5a4693fcb03d1cbecbf8b422422468dfc0d2a8b" - integrity sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ== - -"@esbuild/openharmony-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz#082082444f12db564a0775a41e1991c0e125055e" - integrity sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/sunos-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz#5ab036c53f929e8405c4e96e865a424160a1b537" - integrity sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz#38de700ef4b960a0045370c171794526e589862e" - integrity sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-ia32@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz#451b93dc03ec5d4f38619e6cd64d9f9eff06f55c" - integrity sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - -"@esbuild/win32-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz#0eaf705c941a218a43dba8e09f1df1d6cd2f1f17" - integrity sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA== - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595" - integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== - dependencies: - eslint-visitor-keys "^3.4.3" - -"@eslint-community/regexpp@^4.12.2", "@eslint-community/regexpp@^4.6.1": - version "4.12.2" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" - integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.1": - version "8.57.1" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" - integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== - -"@eslint/js@^9.39.1": - version "9.39.2" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.2.tgz#2d4b8ec4c3ea13c1b3748e0c97ecd766bdd80599" - integrity sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA== - -"@floating-ui/core@^1.7.4": - version "1.7.4" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.4.tgz#4a006a6e01565c0f87ba222c317b056a2cffd2f4" - integrity sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg== - dependencies: - "@floating-ui/utils" "^0.2.10" - -"@floating-ui/core@^1.7.5": - version "1.7.5" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.5.tgz#d4af157a03330af5a60e69da7a4692507ada0622" - integrity sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ== - dependencies: - "@floating-ui/utils" "^0.2.11" - -"@floating-ui/dom@^1.7.5": - version "1.7.5" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.5.tgz#60bfc83a4d1275b2a90db76bf42ca2a5f2c231c2" - integrity sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg== - dependencies: - "@floating-ui/core" "^1.7.4" - "@floating-ui/utils" "^0.2.10" - -"@floating-ui/dom@^1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.6.tgz#f915bba5abbb177e1f227cacee1b4d0634b187bf" - integrity sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ== - dependencies: - "@floating-ui/core" "^1.7.5" - "@floating-ui/utils" "^0.2.11" - -"@floating-ui/react-dom@^2.0.8": - version "2.1.7" - resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.7.tgz#529475cc16ee4976ba3387968117e773d9aa703e" - integrity sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg== - dependencies: - "@floating-ui/dom" "^1.7.5" - -"@floating-ui/utils@^0.2.10": - version "0.2.10" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.10.tgz#a2a1e3812d14525f725d011a73eceb41fef5bc1c" - integrity sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ== - -"@floating-ui/utils@^0.2.11": - version "0.2.11" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.11.tgz#a269e055e40e2f45873bae9d1a2fdccbd314ea3f" - integrity sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg== - -"@humanwhocodes/config-array@^0.13.0": - version "0.13.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" - integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== - dependencies: - "@humanwhocodes/object-schema" "^2.0.3" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@isaacs/balanced-match@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29" - integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ== - -"@isaacs/brace-expansion@^5.0.0", "@isaacs/brace-expansion@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz#0ef5a92d91f2fff2a37646ce54da9e5f599f6eff" - integrity sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ== - dependencies: - "@isaacs/balanced-match" "^4.0.1" - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-30.2.0.tgz#c52fcd5b58fdd2e8eb66b2fd8ae56f2f64d05b28" - integrity sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ== - dependencies: - "@jest/types" "30.2.0" - "@types/node" "*" - chalk "^4.1.2" - jest-message-util "30.2.0" - jest-util "30.2.0" - slash "^3.0.0" - -"@jest/console@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" - integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - -"@jest/core@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" - integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== - dependencies: - "@jest/console" "^29.7.0" - "@jest/reporters" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.7.0" - jest-config "^29.7.0" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-resolve-dependencies "^29.7.0" - jest-runner "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - jest-watcher "^29.7.0" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/diff-sequences@30.0.1": - version "30.0.1" - resolved "https://registry.yarnpkg.com/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz#0ededeae4d071f5c8ffe3678d15f3a1be09156be" - integrity sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw== - -"@jest/environment@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-30.2.0.tgz#1e673cdb8b93ded707cf6631b8353011460831fa" - integrity sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g== - dependencies: - "@jest/fake-timers" "30.2.0" - "@jest/types" "30.2.0" - "@types/node" "*" - jest-mock "30.2.0" - -"@jest/environment@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" - integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== - dependencies: - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - -"@jest/expect-utils@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-30.2.0.tgz#4f95413d4748454fdb17404bf1141827d15e6011" - integrity sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA== - dependencies: - "@jest/get-type" "30.1.0" - -"@jest/expect-utils@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" - integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== - dependencies: - jest-get-type "^29.6.3" - -"@jest/expect@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-30.2.0.tgz#9a5968499bb8add2bbb09136f69f7df5ddbf3185" - integrity sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA== - dependencies: - expect "30.2.0" - jest-snapshot "30.2.0" - -"@jest/expect@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" - integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== - dependencies: - expect "^29.7.0" - jest-snapshot "^29.7.0" - -"@jest/fake-timers@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-30.2.0.tgz#0941ddc28a339b9819542495b5408622dc9e94ec" - integrity sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw== - dependencies: - "@jest/types" "30.2.0" - "@sinonjs/fake-timers" "^13.0.0" - "@types/node" "*" - jest-message-util "30.2.0" - jest-mock "30.2.0" - jest-util "30.2.0" - -"@jest/fake-timers@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" - integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== - dependencies: - "@jest/types" "^29.6.3" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -"@jest/get-type@30.1.0": - version "30.1.0" - resolved "https://registry.yarnpkg.com/@jest/get-type/-/get-type-30.1.0.tgz#4fcb4dc2ebcf0811be1c04fd1cb79c2dba431cbc" - integrity sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA== - -"@jest/globals@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-30.2.0.tgz#2f4b696d5862664b89c4ee2e49ae24d2bb7e0988" - integrity sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw== - dependencies: - "@jest/environment" "30.2.0" - "@jest/expect" "30.2.0" - "@jest/types" "30.2.0" - jest-mock "30.2.0" - -"@jest/globals@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" - integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/types" "^29.6.3" - jest-mock "^29.7.0" - -"@jest/pattern@30.0.1": - version "30.0.1" - resolved "https://registry.yarnpkg.com/@jest/pattern/-/pattern-30.0.1.tgz#d5304147f49a052900b4b853dedb111d080e199f" - integrity sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA== - dependencies: - "@types/node" "*" - jest-regex-util "30.0.1" - -"@jest/reporters@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" - integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^6.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - jest-worker "^29.7.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/reporters@^30.0.2": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-30.2.0.tgz#a36b28fcbaf0c4595250b108e6f20e363348fd91" - integrity sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "30.2.0" - "@jest/test-result" "30.2.0" - "@jest/transform" "30.2.0" - "@jest/types" "30.2.0" - "@jridgewell/trace-mapping" "^0.3.25" - "@types/node" "*" - chalk "^4.1.2" - collect-v8-coverage "^1.0.2" - exit-x "^0.2.2" - glob "^10.3.10" - graceful-fs "^4.2.11" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^6.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^5.0.0" - istanbul-reports "^3.1.3" - jest-message-util "30.2.0" - jest-util "30.2.0" - jest-worker "30.2.0" - slash "^3.0.0" - string-length "^4.0.2" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@30.0.5": - version "30.0.5" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-30.0.5.tgz#7bdf69fc5a368a5abdb49fd91036c55225846473" - integrity sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA== - dependencies: - "@sinclair/typebox" "^0.34.0" - -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jest/snapshot-utils@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz#387858eb90c2f98f67bff327435a532ac5309fbe" - integrity sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug== - dependencies: - "@jest/types" "30.2.0" - chalk "^4.1.2" - graceful-fs "^4.2.11" - natural-compare "^1.4.0" - -"@jest/source-map@30.0.1": - version "30.0.1" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-30.0.1.tgz#305ebec50468f13e658b3d5c26f85107a5620aaa" - integrity sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg== - dependencies: - "@jridgewell/trace-mapping" "^0.3.25" - callsites "^3.1.0" - graceful-fs "^4.2.11" - -"@jest/source-map@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" - integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.18" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@30.2.0", "@jest/test-result@^30.0.2": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-30.2.0.tgz#9c0124377fb7996cdffb86eda3dbc56eacab363d" - integrity sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg== - dependencies: - "@jest/console" "30.2.0" - "@jest/types" "30.2.0" - "@types/istanbul-lib-coverage" "^2.0.6" - collect-v8-coverage "^1.0.2" - -"@jest/test-result@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" - integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== - dependencies: - "@jest/console" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz#bf0066bc72e176d58f5dfa7f212b6e7eee44f221" - integrity sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q== - dependencies: - "@jest/test-result" "30.2.0" - graceful-fs "^4.2.11" - jest-haste-map "30.2.0" - slash "^3.0.0" - -"@jest/test-sequencer@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" - integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== - dependencies: - "@jest/test-result" "^29.7.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - slash "^3.0.0" - -"@jest/transform@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-30.2.0.tgz#54bef1a4510dcbd58d5d4de4fe2980a63077ef2a" - integrity sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA== - dependencies: - "@babel/core" "^7.27.4" - "@jest/types" "30.2.0" - "@jridgewell/trace-mapping" "^0.3.25" - babel-plugin-istanbul "^7.0.1" - chalk "^4.1.2" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.11" - jest-haste-map "30.2.0" - jest-regex-util "30.0.1" - jest-util "30.2.0" - micromatch "^4.0.8" - pirates "^4.0.7" - slash "^3.0.0" - write-file-atomic "^5.0.1" - -"@jest/transform@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" - integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-30.2.0.tgz#1c678a7924b8f59eafd4c77d56b6d0ba976d62b8" - integrity sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg== - dependencies: - "@jest/pattern" "30.0.1" - "@jest/schemas" "30.0.5" - "@types/istanbul-lib-coverage" "^2.0.6" - "@types/istanbul-reports" "^3.0.4" - "@types/node" "*" - "@types/yargs" "^17.0.33" - chalk "^4.1.2" - -"@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@joshwooding/vite-plugin-react-docgen-typescript@^0.6.3": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.6.4.tgz#9cfa58703ae8122329c52a5989244818ee4cdcbe" - integrity sha512-6PyZBYKnnVNqOSB0YFly+62R7dmov8segT27A+RVTBVd4iAE6kbW9QBJGlyR2yG4D4ohzhZSTIu7BK1UTtmFFA== - dependencies: - glob "^13.0.1" - react-docgen-typescript "^2.2.2" - -"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": - version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" - integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/remapping@^2.3.4", "@jridgewell/remapping@^2.3.5": - version "2.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" - integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/source-map@^0.3.3": - version "0.3.11" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.11.tgz#b21835cbd36db656b857c2ad02ebd413cc13a9ba" - integrity sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - -"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" - integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.23", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28": - version "0.3.31" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" - integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@microsoft/api-extractor-model@7.32.2": - version "7.32.2" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.32.2.tgz#2b891b2bad26d6ba19d7cc21c23510c8c6f05476" - integrity sha512-Ussc25rAalc+4JJs9HNQE7TuO9y6jpYQX9nWD1DhqUzYPBr3Lr7O9intf+ZY8kD5HnIqeIRJX7ccCT0QyBy2Ww== - dependencies: - "@microsoft/tsdoc" "~0.16.0" - "@microsoft/tsdoc-config" "~0.18.0" - "@rushstack/node-core-library" "5.19.1" - -"@microsoft/api-extractor@^7.50.1": - version "7.56.3" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.56.3.tgz#77ffac4dba7c192e42dc9aed0535bda5bec75aef" - integrity sha512-fRqok4aRNq5GpgGBv2fKlSSKbirPKTJ75vQefthB5x9dwt4Zz+AezUzdc1p/AG4wUBIgmhjcEwn/Rj+N4Wh4Mw== - dependencies: - "@microsoft/api-extractor-model" "7.32.2" - "@microsoft/tsdoc" "~0.16.0" - "@microsoft/tsdoc-config" "~0.18.0" - "@rushstack/node-core-library" "5.19.1" - "@rushstack/rig-package" "0.6.0" - "@rushstack/terminal" "0.21.0" - "@rushstack/ts-command-line" "5.2.0" - diff "~8.0.2" - lodash "~4.17.23" - minimatch "10.1.2" - resolve "~1.22.1" - semver "~7.5.4" - source-map "~0.6.1" - typescript "5.8.2" - -"@microsoft/fast-element@2.8.3": - version "2.8.3" - resolved "https://registry.yarnpkg.com/@microsoft/fast-element/-/fast-element-2.8.3.tgz#6f98430d17988360e9df4838b383610adb04c929" - integrity sha512-dQPyOoMCJMIMdsIicNcKPvLu3Um8VM5wk/UARFXRYJAdZ7j9cEvEn5trc7y0blnXlPk9tTkah77oWqUSFi0pyg== - -"@microsoft/fast-web-utilities@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@microsoft/fast-web-utilities/-/fast-web-utilities-6.0.0.tgz#7678c2b2cd12aeef785f4e2288da93a4db9e38a6" - integrity sha512-ckCA4Xn91ja1Qz+jhGGL1Q3ZeuRpA5VvYcRA7GzA1NP545sl14bwz3tbHCq8jIk+PL7mkSaIveGMYuJB2L4Izg== - dependencies: - exenv-es6 "^1.1.1" - -"@microsoft/tsdoc-config@~0.18.0": - version "0.18.0" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.18.0.tgz#02fd9924b888053ecbc3c0385a24532bf2106c98" - integrity sha512-8N/vClYyfOH+l4fLkkr9+myAoR6M7akc8ntBJ4DJdWH2b09uVfr71+LTMpNyG19fNqWDg8KEDZhx5wxuqHyGjw== - dependencies: - "@microsoft/tsdoc" "0.16.0" - ajv "~8.12.0" - jju "~1.4.0" - resolve "~1.22.2" - -"@microsoft/tsdoc@0.16.0", "@microsoft/tsdoc@~0.16.0": - version "0.16.0" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz#2249090633e04063176863a050c8f0808d2b6d2b" - integrity sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA== - -"@module-federation/bridge-react-webpack-plugin@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.21.6.tgz#67f543576328bafe022106686f859d01b3496a9f" - integrity sha512-lJMmdhD4VKVkeg8RHb+Jwe6Ou9zKVgjtb1inEURDG/sSS2ksdZA8pVKLYbRPRbdmjr193Y8gJfqFbI2dqoyc/g== - dependencies: - "@module-federation/sdk" "0.21.6" - "@types/semver" "7.5.8" - semver "7.6.3" - -"@module-federation/bridge-react-webpack-plugin@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-2.0.1.tgz#d50b1d63d037c3c599b11616d302e553b3036b30" - integrity sha512-D7LMW5EMAJShOMR1aZDAJ6s+MdsYDHaQyJADLQ3LaY0sne/BkVqkPikUwcO1IwOwKbXjYsDlQVOEvk9wZVRFhA== - dependencies: - "@module-federation/sdk" "2.0.1" - "@types/semver" "7.5.8" - semver "7.6.3" - -"@module-federation/cli@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/cli/-/cli-0.21.6.tgz#a8acd0eca6b1c33a45f2fb5fd7c70d12c38b6aaf" - integrity sha512-qNojnlc8pTyKtK7ww3i/ujLrgWwgXqnD5DcDPsjADVIpu7STaoaVQ0G5GJ7WWS/ajXw6EyIAAGW/AMFh4XUxsQ== - dependencies: - "@module-federation/dts-plugin" "0.21.6" - "@module-federation/sdk" "0.21.6" - chalk "3.0.0" - commander "11.1.0" - jiti "2.4.2" - -"@module-federation/cli@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/cli/-/cli-2.0.1.tgz#56c082adb0f8e7938ca1963a495d2bf500210b46" - integrity sha512-2SL5Y8iODNX10y9T3CBLhHjSXo4afnA1BK82m4sNfZebuVO+o34bxewqwod9xfWq9xhTZmOSFZ+n+lgTKRv+CQ== - dependencies: - "@module-federation/dts-plugin" "2.0.1" - "@module-federation/sdk" "2.0.1" - chalk "3.0.0" - commander "11.1.0" - jiti "2.4.2" - -"@module-federation/data-prefetch@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/data-prefetch/-/data-prefetch-0.21.6.tgz#b79fda013967b4098ea753766094e150654ef999" - integrity sha512-8HD7ZhtWZ9vl6i3wA7M8cEeCRdtvxt09SbMTfqIPm+5eb/V4ijb8zGTYSRhNDb5RCB+BAixaPiZOWKXJ63/rVw== - dependencies: - "@module-federation/runtime" "0.21.6" - "@module-federation/sdk" "0.21.6" - fs-extra "9.1.0" - -"@module-federation/data-prefetch@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/data-prefetch/-/data-prefetch-2.0.1.tgz#79c98752d106b4066ed0359c1f240e669959c8ee" - integrity sha512-Kq0P1OABGt6QAvs6TaE/zY9Ut9Y/oJFrzoSF3eWaCYbUAr2KD2SpTyMsPz4ssBzjeKXTgimugh6tHHd6mpCBIQ== - dependencies: - "@module-federation/runtime" "2.0.1" - "@module-federation/sdk" "2.0.1" - fs-extra "9.1.0" - -"@module-federation/dts-plugin@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/dts-plugin/-/dts-plugin-0.21.6.tgz#a73e5883fbbede846138fff667994a6176837c6a" - integrity sha512-YIsDk8/7QZIWn0I1TAYULniMsbyi2LgKTi9OInzVmZkwMC6644x/ratTWBOUDbdY1Co+feNkoYeot1qIWv2L7w== - dependencies: - "@module-federation/error-codes" "0.21.6" - "@module-federation/managers" "0.21.6" - "@module-federation/sdk" "0.21.6" - "@module-federation/third-party-dts-extractor" "0.21.6" - adm-zip "^0.5.10" - ansi-colors "^4.1.3" - axios "^1.12.0" - chalk "3.0.0" - fs-extra "9.1.0" - isomorphic-ws "5.0.0" - koa "3.0.3" - lodash.clonedeepwith "4.5.0" - log4js "6.9.1" - node-schedule "2.1.1" - rambda "^9.1.0" - ws "8.18.0" - -"@module-federation/dts-plugin@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/dts-plugin/-/dts-plugin-2.0.1.tgz#109bb138c5ba316dea3a12942343e28f6a8c1783" - integrity sha512-PLneTsf1fQS5/RTBedtLAAmCPRdMfIlhfJkOa8QH3WDJaQsqm8Wb3r2cTUBf2aNj/bP3aH/y6Hs9JFB/4x0l5g== - dependencies: - "@module-federation/error-codes" "2.0.1" - "@module-federation/managers" "2.0.1" - "@module-federation/sdk" "2.0.1" - "@module-federation/third-party-dts-extractor" "2.0.1" - adm-zip "^0.5.10" - ansi-colors "^4.1.3" - axios "^1.12.0" - chalk "3.0.0" - fs-extra "9.1.0" - isomorphic-ws "5.0.0" - koa "3.0.3" - lodash.clonedeepwith "4.5.0" - log4js "6.9.1" - node-schedule "2.1.1" - rambda "^9.1.0" - ws "8.18.0" - -"@module-federation/enhanced@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/enhanced/-/enhanced-2.0.1.tgz#b4359685328da17a18fcace5501847b9d2f34ea6" - integrity sha512-EZIARQ/8ScoTP6PV8+E4SsmMYWK4ErrikZJ0G/FX8wvK8mCtdoKatFtvDN9++P6Nl78kN9zHYgAV4AHKdBVjfQ== - dependencies: - "@module-federation/bridge-react-webpack-plugin" "2.0.1" - "@module-federation/cli" "2.0.1" - "@module-federation/data-prefetch" "2.0.1" - "@module-federation/dts-plugin" "2.0.1" - "@module-federation/error-codes" "2.0.1" - "@module-federation/inject-external-runtime-core-plugin" "2.0.1" - "@module-federation/managers" "2.0.1" - "@module-federation/manifest" "2.0.1" - "@module-federation/rspack" "2.0.1" - "@module-federation/runtime-tools" "2.0.1" - "@module-federation/sdk" "2.0.1" - btoa "^1.2.1" - schema-utils "^4.3.0" - upath "2.0.1" - -"@module-federation/enhanced@^0.21.2": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/enhanced/-/enhanced-0.21.6.tgz#c917485505998c854307e7504f24755a3017d583" - integrity sha512-8PFQxtmXc6ukBC4CqGIoc96M2Ly9WVwCPu4Ffvt+K/SB6rGbeFeZoYAwREV1zGNMJ5v5ly6+AHIEOBxNuSnzSg== - dependencies: - "@module-federation/bridge-react-webpack-plugin" "0.21.6" - "@module-federation/cli" "0.21.6" - "@module-federation/data-prefetch" "0.21.6" - "@module-federation/dts-plugin" "0.21.6" - "@module-federation/error-codes" "0.21.6" - "@module-federation/inject-external-runtime-core-plugin" "0.21.6" - "@module-federation/managers" "0.21.6" - "@module-federation/manifest" "0.21.6" - "@module-federation/rspack" "0.21.6" - "@module-federation/runtime-tools" "0.21.6" - "@module-federation/sdk" "0.21.6" - btoa "^1.2.1" - schema-utils "^4.3.0" - upath "2.0.1" - -"@module-federation/error-codes@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/error-codes/-/error-codes-0.21.6.tgz#d0c9fa71f9469b2150165ef4461dfd5be0e7f79b" - integrity sha512-MLJUCQ05KnoVl8xd6xs9a5g2/8U+eWmVxg7xiBMeR0+7OjdWUbHwcwgVFatRIwSZvFgKHfWEiI7wsU1q1XbTRQ== - -"@module-federation/error-codes@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/error-codes/-/error-codes-2.0.1.tgz#a1e70eeeeba1e9ef619a8fa17214e930ea0d91dc" - integrity sha512-2bJF/ft+qL9L6Zvq2t/G9/f/0wFL73cM8/NJ04uyYz9BjIgvx28K5qu8/6+IwgEEKATG7vOhBBVj6wH3S+5ASA== - -"@module-federation/inject-external-runtime-core-plugin@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.21.6.tgz#d87fdfa6df94059c0b3b12f333394989c555e489" - integrity sha512-DJQne7NQ988AVi3QB8byn12FkNb+C2lBeU1NRf8/WbL0gmHsr6kW8hiEJCm8LYaURwtsQqtsEV7i+8+51qjSmQ== - -"@module-federation/inject-external-runtime-core-plugin@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-2.0.1.tgz#e187594715d833bc86095a4a7fec67b697fd7b93" - integrity sha512-oAA7G+4GCHM+WRYfscR/x4GwCyM9CEqfdD9/x2L6y8mtLWK9anRLKTocsI759AvzXsbT1m3EQ5ki1O6wlwDu3g== - -"@module-federation/managers@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/managers/-/managers-0.21.6.tgz#dc854f1ae24508322d71bae91d6c9380b3fc1e5f" - integrity sha512-BeV6m2/7kF5MDVz9JJI5T8h8lMosnXkH2bOxxFewcra7ZjvDOgQu7WIio0mgk5l1zjNPvnEVKhnhrenEdcCiWg== - dependencies: - "@module-federation/sdk" "0.21.6" - find-pkg "2.0.0" - fs-extra "9.1.0" - -"@module-federation/managers@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/managers/-/managers-2.0.1.tgz#ded855100cefcbd168e081f88dcc8bf507037a1a" - integrity sha512-KR01lSlcYRQ9C6hW2a8CQQtAE0LvfTLgtV/6ZNUTagw8sRfeDln+ggrZsYilKu9zl0i8RPDgpv/kS60o4lcxCQ== - dependencies: - "@module-federation/sdk" "2.0.1" - find-pkg "2.0.0" - fs-extra "9.1.0" - -"@module-federation/manifest@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/manifest/-/manifest-0.21.6.tgz#4790467e788e0031e054366a85e2625a98ab6c42" - integrity sha512-yg93+I1qjRs5B5hOSvjbjmIoI2z3th8/yst9sfwvx4UDOG1acsE3HHMyPN0GdoIGwplC/KAnU5NmUz4tREUTGQ== - dependencies: - "@module-federation/dts-plugin" "0.21.6" - "@module-federation/managers" "0.21.6" - "@module-federation/sdk" "0.21.6" - chalk "3.0.0" - find-pkg "2.0.0" - -"@module-federation/manifest@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/manifest/-/manifest-2.0.1.tgz#332742ffa35deea459db0576fa3892bf2d3b6857" - integrity sha512-p8nYGjHWp17MsYdW/Vv0ogBDiTTsI1PHWPQbvVIqLQXDqwiesaRSRR1zziECXQoEL8lV5Bs+uSkcaJGhea9P+A== - dependencies: - "@module-federation/dts-plugin" "2.0.1" - "@module-federation/managers" "2.0.1" - "@module-federation/sdk" "2.0.1" - chalk "3.0.0" - find-pkg "2.0.0" - -"@module-federation/node@^2.7.21": - version "2.7.32" - resolved "https://registry.yarnpkg.com/@module-federation/node/-/node-2.7.32.tgz#098a9ecd958575afc1082fed2c1b899189a1cb22" - integrity sha512-hUj5v2GGwpNzl2gaJS4AyzCYRzJBhN8875A+ucKF9tq3jaQb5zpy3izYMISqqbN2q9a7jz3nEUgwAh3pjri+rQ== - dependencies: - "@module-federation/enhanced" "2.0.1" - "@module-federation/runtime" "2.0.1" - "@module-federation/sdk" "2.0.1" - btoa "1.2.1" - encoding "^0.1.13" - node-fetch "2.7.0" - -"@module-federation/rspack@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/rspack/-/rspack-0.21.6.tgz#7c5f39e870d56c735cf4d12698aed0779ad7482b" - integrity sha512-SB+z1P+Bqe3R6geZje9dp0xpspX6uash+zO77nodmUy8PTTBlkL7800Cq2FMLKUdoTZHJTBVXf0K6CqQWSlItg== - dependencies: - "@module-federation/bridge-react-webpack-plugin" "0.21.6" - "@module-federation/dts-plugin" "0.21.6" - "@module-federation/inject-external-runtime-core-plugin" "0.21.6" - "@module-federation/managers" "0.21.6" - "@module-federation/manifest" "0.21.6" - "@module-federation/runtime-tools" "0.21.6" - "@module-federation/sdk" "0.21.6" - btoa "1.2.1" - -"@module-federation/rspack@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/rspack/-/rspack-2.0.1.tgz#637b836a7445c3eb021f965ccffce7d0cae4cd75" - integrity sha512-SAlNE8iclFmzrKtx3/C2GivXYx6nPzx4MgQV01QG/a4LpnLbwlxzdZu3rqQ2swp4NNWT/t/GT7Y+7gfhyVa7mg== - dependencies: - "@module-federation/bridge-react-webpack-plugin" "2.0.1" - "@module-federation/dts-plugin" "2.0.1" - "@module-federation/inject-external-runtime-core-plugin" "2.0.1" - "@module-federation/managers" "2.0.1" - "@module-federation/manifest" "2.0.1" - "@module-federation/runtime-tools" "2.0.1" - "@module-federation/sdk" "2.0.1" - btoa "1.2.1" - -"@module-federation/runtime-core@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/runtime-core/-/runtime-core-0.21.6.tgz#2bcd24db2192179c96ce49772b09d72820ab9ea3" - integrity sha512-5Hd1Y5qp5lU/aTiK66lidMlM/4ji2gr3EXAtJdreJzkY+bKcI5+21GRcliZ4RAkICmvdxQU5PHPL71XmNc7Lsw== - dependencies: - "@module-federation/error-codes" "0.21.6" - "@module-federation/sdk" "0.21.6" - -"@module-federation/runtime-core@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/runtime-core/-/runtime-core-2.0.1.tgz#17bf9e067c598870b5673c129228a3229b9f4577" - integrity sha512-gOuCPSHoQGUGwlxfSTMInFX+QvLxdEWegGGMiLdU5vqbXuva4E9M+kXBBO7/0MkcBPMmVs0wOJGm0XOLeV2f1Q== - dependencies: - "@module-federation/error-codes" "2.0.1" - "@module-federation/sdk" "2.0.1" - -"@module-federation/runtime-tools@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/runtime-tools/-/runtime-tools-0.21.6.tgz#40cbcc16af4c597169834a2d8b71a9d31779ab0c" - integrity sha512-fnP+ZOZTFeBGiTAnxve+axGmiYn2D60h86nUISXjXClK3LUY1krUfPgf6MaD4YDJ4i51OGXZWPekeMe16pkd8Q== - dependencies: - "@module-federation/runtime" "0.21.6" - "@module-federation/webpack-bundler-runtime" "0.21.6" - -"@module-federation/runtime-tools@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/runtime-tools/-/runtime-tools-2.0.1.tgz#187500d3f63c1708eaa2087f7cdabe40df9b64fd" - integrity sha512-AStdwBtsGB3jIfDg9oP+KyVPsimdaeHsP855gqCxDp1hi2+GKjlZWZx9ThkS8NytVSXSUysxqoUL1ivDoKgcCQ== - dependencies: - "@module-federation/runtime" "2.0.1" - "@module-federation/webpack-bundler-runtime" "2.0.1" - -"@module-federation/runtime@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/runtime/-/runtime-0.21.6.tgz#8d4a29a792ed4a94e5a811fe097d314a6f9dcab7" - integrity sha512-+caXwaQqwTNh+CQqyb4mZmXq7iEemRDrTZQGD+zyeH454JAYnJ3s/3oDFizdH6245pk+NiqDyOOkHzzFQorKhQ== - dependencies: - "@module-federation/error-codes" "0.21.6" - "@module-federation/runtime-core" "0.21.6" - "@module-federation/sdk" "0.21.6" - -"@module-federation/runtime@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/runtime/-/runtime-2.0.1.tgz#dbfc8e5e93a16d0ee40c0320cb8627ad0196e35b" - integrity sha512-UQ72P5Oo40dS6vdhHetwTtIsbGciEr+bjoYvDgh1WLPfFlTYd8zo9cLfqaf3juuPfV3cMVARAVPmh16lQYpUGA== - dependencies: - "@module-federation/error-codes" "2.0.1" - "@module-federation/runtime-core" "2.0.1" - "@module-federation/sdk" "2.0.1" - -"@module-federation/sdk@0.21.6", "@module-federation/sdk@^0.21.2": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/sdk/-/sdk-0.21.6.tgz#8aac1159ff37f418ed72bc79afccbbfb025f847a" - integrity sha512-x6hARETb8iqHVhEsQBysuWpznNZViUh84qV2yE7AD+g7uIzHKiYdoWqj10posbo5XKf/147qgWDzKZoKoEP2dw== - -"@module-federation/sdk@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/sdk/-/sdk-2.0.1.tgz#0b83d13a63887bb1956d27913088945c85ab409a" - integrity sha512-32PwudojGjog51cwpTali7D6ud82oVgsyvOx9JjAzhvXBX96YI4mRsursuWcthDxmigJP9ZvUTXDuRUEDh1OQA== - -"@module-federation/third-party-dts-extractor@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.21.6.tgz#c99b3ae9243893b0064598eb19a13fd542b64a82" - integrity sha512-Il6x4hLsvCgZNk1DFwuMBNeoxD1BsZ5AW2BI/nUgu0k5FiAvfcz1OFawRFEHtaM/kVrCsymMOW7pCao90DaX3A== - dependencies: - find-pkg "2.0.0" - fs-extra "9.1.0" - resolve "1.22.8" - -"@module-federation/third-party-dts-extractor@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-2.0.1.tgz#d09b0bbb63b10f58ef7e82807cf50456e40b61ce" - integrity sha512-neKSr6FNUeGRh+YR57l/QZUzPytJXuJx+babF7j5iGJG3FP+kfizr6QD0hgVis5KEoXMVbQ8yyvG0slERizeyw== - dependencies: - find-pkg "2.0.0" - fs-extra "9.1.0" - resolve "1.22.8" - -"@module-federation/webpack-bundler-runtime@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.21.6.tgz#6831eaf147356fe5b096d24c7a902c323e810bb9" - integrity sha512-7zIp3LrcWbhGuFDTUMLJ2FJvcwjlddqhWGxi/MW3ur1a+HaO8v5tF2nl+vElKmbG1DFLU/52l3PElVcWf/YcsQ== - dependencies: - "@module-federation/runtime" "0.21.6" - "@module-federation/sdk" "0.21.6" - -"@module-federation/webpack-bundler-runtime@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-2.0.1.tgz#bdabe25262c8c6f357da78a4c96df4018d41f3e2" - integrity sha512-u1NId3SF4lHDTmD2CHFEszulmXmIq1TGw9JYvnLx5rKJL7xt3aNxcb1GvkaYbRNVBXhSMjJ75E5LsQlZzyBx9A== - dependencies: - "@module-federation/runtime" "2.0.1" - "@module-federation/sdk" "2.0.1" - -"@mui/base@5.0.0-beta.40-1": - version "5.0.0-beta.40-1" - resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.40-1.tgz#6da6229e5e675e811f319149f6e29d7a77522851" - integrity sha512-agKXuNNy0bHUmeU7pNmoZwNFr7Hiyhojkb9+2PVyDG5+6RafYuyMgbrav8CndsB7KUc/U51JAw9vKNDLYBzaUA== - dependencies: - "@babel/runtime" "^7.23.9" - "@floating-ui/react-dom" "^2.0.8" - "@mui/types" "~7.2.15" - "@mui/utils" "^5.17.1" - "@popperjs/core" "^2.11.8" - clsx "^2.1.0" - prop-types "^15.8.1" - -"@mui/core-downloads-tracker@^5.17.1", "@mui/core-downloads-tracker@^5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.18.0.tgz#85019a8704b0f63305fc5600635ee663810f2b66" - integrity sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA== - -"@mui/icons-material@^5.17.1": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.18.0.tgz#97d87f1b7bee5fa7b9ba844518631de3112c1e57" - integrity sha512-1s0vEZj5XFXDMmz3Arl/R7IncFqJ+WQ95LDp1roHWGDE2oCO3IS4/hmiOv1/8SD9r6B7tv9GLiqVZYHo+6PkTg== - dependencies: - "@babel/runtime" "^7.23.9" - -"@mui/joy@^5.0.0-beta.36": - version "5.0.0-beta.52" - resolved "https://registry.yarnpkg.com/@mui/joy/-/joy-5.0.0-beta.52.tgz#9c7cd9629603089c80e8f8f7b78a41534ef06e91" - integrity sha512-e8jQanA5M1f/X52mJrw0UIW8Er7EAHuLuigmGFw7yIsAgIluhIP4rZ7JcbVrUi6z5Gk0weC9QWUUtjLejAbO8g== - dependencies: - "@babel/runtime" "^7.23.9" - "@mui/base" "5.0.0-beta.40-1" - "@mui/core-downloads-tracker" "^5.17.1" - "@mui/system" "^5.17.1" - "@mui/types" "~7.2.15" - "@mui/utils" "^5.17.1" - clsx "^2.1.0" - prop-types "^15.8.1" - -"@mui/material@^5.17.1": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.18.0.tgz#71e72d52338252edc6f8d9461e04fdf0d61905cd" - integrity sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA== - dependencies: - "@babel/runtime" "^7.23.9" - "@mui/core-downloads-tracker" "^5.18.0" - "@mui/system" "^5.18.0" - "@mui/types" "~7.2.15" - "@mui/utils" "^5.17.1" - "@popperjs/core" "^2.11.8" - "@types/react-transition-group" "^4.4.10" - clsx "^2.1.0" - csstype "^3.1.3" - prop-types "^15.8.1" - react-is "^19.0.0" - react-transition-group "^4.4.5" - -"@mui/private-theming@^5.17.1": - version "5.17.1" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.17.1.tgz#b4b6fbece27830754ef78186e3f1307dca42f295" - integrity sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ== - dependencies: - "@babel/runtime" "^7.23.9" - "@mui/utils" "^5.17.1" - prop-types "^15.8.1" - -"@mui/styled-engine@^5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.18.0.tgz#914cca1385bb33ce0cde31721f529c8bd7fa301c" - integrity sha512-BN/vKV/O6uaQh2z5rXV+MBlVrEkwoS/TK75rFQ2mjxA7+NBo8qtTAOA4UaM0XeJfn7kh2wZ+xQw2HAx0u+TiBg== - dependencies: - "@babel/runtime" "^7.23.9" - "@emotion/cache" "^11.13.5" - "@emotion/serialize" "^1.3.3" - csstype "^3.1.3" - prop-types "^15.8.1" - -"@mui/system@^5.17.1", "@mui/system@^5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.18.0.tgz#e55331203a40584b26c5a855a07949ac8973bfb6" - integrity sha512-ojZGVcRWqWhu557cdO3pWHloIGJdzVtxs3rk0F9L+x55LsUjcMUVkEhiF7E4TMxZoF9MmIHGGs0ZX3FDLAf0Xw== - dependencies: - "@babel/runtime" "^7.23.9" - "@mui/private-theming" "^5.17.1" - "@mui/styled-engine" "^5.18.0" - "@mui/types" "~7.2.15" - "@mui/utils" "^5.17.1" - clsx "^2.1.0" - csstype "^3.1.3" - prop-types "^15.8.1" - -"@mui/types@~7.2.15": - version "7.2.24" - resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.24.tgz#5eff63129d9c29d80bbf2d2e561bd0690314dec2" - integrity sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw== - -"@mui/utils@^5.17.1": - version "5.17.1" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.17.1.tgz#72ba4ffa79f7bdf69d67458139390f18484b6e6b" - integrity sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg== - dependencies: - "@babel/runtime" "^7.23.9" - "@mui/types" "~7.2.15" - "@types/prop-types" "^15.7.12" - clsx "^2.1.1" - prop-types "^15.8.1" - react-is "^19.0.0" - -"@napi-rs/wasm-runtime@0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz#d27788176f250d86e498081e3c5ff48a17606918" - integrity sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ== - dependencies: - "@emnapi/core" "^1.1.0" - "@emnapi/runtime" "^1.1.0" - "@tybys/wasm-util" "^0.9.0" - -"@napi-rs/wasm-runtime@1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz#dcfea99a75f06209a235f3d941e3460a51e9b14c" - integrity sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw== - dependencies: - "@emnapi/core" "^1.5.0" - "@emnapi/runtime" "^1.5.0" - "@tybys/wasm-util" "^0.10.1" - -"@napi-rs/wasm-runtime@^0.2.11": - version "0.2.12" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz#3e78a8b96e6c33a6c517e1894efbd5385a7cb6f2" - integrity sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ== - dependencies: - "@emnapi/core" "^1.4.3" - "@emnapi/runtime" "^1.4.3" - "@tybys/wasm-util" "^0.10.0" - -"@napi-rs/wasm-runtime@^1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz#c3705ab549d176b8dc5172723d6156c3dc426af2" - integrity sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A== - dependencies: - "@emnapi/core" "^1.7.1" - "@emnapi/runtime" "^1.7.1" - "@tybys/wasm-util" "^0.10.1" - -"@noble/hashes@^1.1.5": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" - integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@nx/devkit@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-22.0.1.tgz#3116e3f322cad98ee7232d0ad3c563c0302f1fc6" - integrity sha512-pam3RuHI+1vwg4pKyq4zq4oFuXvqllJvuArsCWYCv6m10NYPu0cXRXaAbZfffcmW6Kvh1cRSb80OCs8ZzN4cXA== - dependencies: - "@zkochan/js-yaml" "0.0.7" - ejs "^3.1.7" - enquirer "~2.3.6" - minimatch "9.0.3" - semver "^7.5.3" - tslib "^2.3.0" - yargs-parser "21.1.1" - -"@nx/devkit@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-22.5.1.tgz#eb6994be392dd2de05d6aecd4ffb96596ccd6793" - integrity sha512-1ZJ8pCB+6EWC8X6q8tfBweg92WzFAwliBhtBkOPP8Li8GQq71ulPWRdY4lDd5pH3Ea1zKqhOtBKWdOlyDPOKYA== - dependencies: - "@zkochan/js-yaml" "0.0.7" - ejs "^3.1.7" - enquirer "~2.3.6" - minimatch "10.1.1" - semver "^7.6.3" - tslib "^2.3.0" - yargs-parser "21.1.1" - -"@nx/docker@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/docker/-/docker-22.0.1.tgz#d5a12e67b359c4e6d91c14c2e93cc59b4d1e083f" - integrity sha512-CQgzBLqQj1CN1qTpFoNUTIJVeTq+dcUCI6/OROjH9y4tob8g5NyKYC8sVMV5Dl+Pc0VUriH5xAv3+MaZAK6zuQ== - dependencies: - "@nx/devkit" "22.0.1" - enquirer "~2.3.6" - tslib "^2.3.0" - -"@nx/eslint-plugin@^22.1.3": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-22.5.1.tgz#ae1d4247ce3208f77400e44d63296e05fc118328" - integrity sha512-TUUsvdfCtr6EoUxmnqp2uQANI3CQb9g0RmJALbGQAOSGeyr7TQc4wEeW0VjFl/1PQB//9TiK9lnPUkOF76SV/Q== - dependencies: - "@nx/devkit" "22.5.1" - "@nx/js" "22.5.1" - "@phenomnomnominal/tsquery" "~6.1.4" - "@typescript-eslint/type-utils" "^8.0.0" - "@typescript-eslint/utils" "^8.0.0" - chalk "^4.1.0" - confusing-browser-globals "^1.0.9" - globals "^15.9.0" - jsonc-eslint-parser "^2.1.0" - semver "^7.6.3" - tslib "^2.3.0" - -"@nx/eslint@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-22.0.1.tgz#bd72d08fbdcae8a11b9bd58212eefb1d644f38e8" - integrity sha512-6FnalNF+l3XXVoelnBc5STXehiAMy4L6afWWYGlpdnxersLoemFLbE/cdelo2pTqyqOTsoe+qdfeGphnao7MaA== - dependencies: - "@nx/devkit" "22.0.1" - "@nx/js" "22.0.1" - semver "^7.5.3" - tslib "^2.3.0" - typescript "~5.9.2" - -"@nx/eslint@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-22.5.1.tgz#6913a7ed5add15d98a2d8cdfd0ac6383c3702fce" - integrity sha512-878xSsfOKtnQBJlRyeeHANVr5+HJMeMfPgpsffRfFDoat7pF/B2KoK2UJx/wQlAHUyVubKNhm7x46fA/shqBow== - dependencies: - "@nx/devkit" "22.5.1" - "@nx/js" "22.5.1" - semver "^7.6.3" - tslib "^2.3.0" - typescript "~5.9.2" - -"@nx/jest@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-22.0.1.tgz#c5848fd325c756e61604fcb5dac49c8cd622544a" - integrity sha512-sOYcLxs4FLSqmrKT16P7LFL62WRtwQ+T7zsEt/t+Vk2swgNAZTljuRfykScfuFxL9xXLTJ4gumlvLvZUWf9ofg== - dependencies: - "@jest/reporters" "^30.0.2" - "@jest/test-result" "^30.0.2" - "@nx/devkit" "22.0.1" - "@nx/js" "22.0.1" - "@phenomnomnominal/tsquery" "~5.0.1" - identity-obj-proxy "3.0.0" - jest-config "^30.0.2" - jest-resolve "^30.0.2" - jest-util "^30.0.2" - minimatch "9.0.3" - picocolors "^1.1.0" - resolve.exports "2.0.3" - semver "^7.5.3" - tslib "^2.3.0" - yargs-parser "21.1.1" - -"@nx/js@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/js/-/js-22.0.1.tgz#3ef038f83baa611439678b58e6080cbe47e0e52a" - integrity sha512-uuvPA0gw7DsH7xfJ5hS2VcSNAZYq1Cm4bZVNUaV8IJkdCnV812dJxU2I2bk5CXWPDRTD1ECcS+LfZ17G0mgDOw== - dependencies: - "@babel/core" "^7.23.2" - "@babel/plugin-proposal-decorators" "^7.22.7" - "@babel/plugin-transform-class-properties" "^7.22.5" - "@babel/plugin-transform-runtime" "^7.23.2" - "@babel/preset-env" "^7.23.2" - "@babel/preset-typescript" "^7.22.5" - "@babel/runtime" "^7.22.6" - "@nx/devkit" "22.0.1" - "@nx/workspace" "22.0.1" - "@zkochan/js-yaml" "0.0.7" - babel-plugin-const-enum "^1.0.1" - babel-plugin-macros "^3.1.0" - babel-plugin-transform-typescript-metadata "^0.3.1" - chalk "^4.1.0" - columnify "^1.6.0" - detect-port "^1.5.1" - ignore "^5.0.4" - js-tokens "^4.0.0" - jsonc-parser "3.2.0" - npm-run-path "^4.0.1" - picocolors "^1.1.0" - picomatch "4.0.2" - semver "^7.5.3" - source-map-support "0.5.19" - tinyglobby "^0.2.12" - tslib "^2.3.0" - -"@nx/js@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/js/-/js-22.5.1.tgz#221316c99392bfc15c1f7617af18bf809504147d" - integrity sha512-g/0x9P7e2KDsY5po9RxvsNR2Z8xPWpWqTs82gll1G/h5Jot2QJ6oIuZTfjdHramVXWd6pi6KoruxThnNv5DmYQ== - dependencies: - "@babel/core" "^7.23.2" - "@babel/plugin-proposal-decorators" "^7.22.7" - "@babel/plugin-transform-class-properties" "^7.22.5" - "@babel/plugin-transform-runtime" "^7.23.2" - "@babel/preset-env" "^7.23.2" - "@babel/preset-typescript" "^7.22.5" - "@babel/runtime" "^7.22.6" - "@nx/devkit" "22.5.1" - "@nx/workspace" "22.5.1" - "@zkochan/js-yaml" "0.0.7" - babel-plugin-const-enum "^1.0.1" - babel-plugin-macros "^3.1.0" - babel-plugin-transform-typescript-metadata "^0.3.1" - chalk "^4.1.0" - columnify "^1.6.0" - detect-port "^1.5.1" - ignore "^5.0.4" - js-tokens "^4.0.0" - jsonc-parser "3.2.0" - npm-run-path "^4.0.1" - picocolors "^1.1.0" - picomatch "4.0.2" - semver "^7.6.3" - source-map-support "0.5.19" - tinyglobby "^0.2.12" - tslib "^2.3.0" - -"@nx/module-federation@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/module-federation/-/module-federation-22.5.1.tgz#06a9ff1f2fc7b3930f967875506bfb9c914486bf" - integrity sha512-LiAN6Vy+5fdMvaKl0lPii0+yQODpf8v8kXVqUsKrXWWGlRI8IksElx8pVtoX9pL04MWGmcAckd0+G3PkvwGAPw== - dependencies: - "@module-federation/enhanced" "^0.21.2" - "@module-federation/node" "^2.7.21" - "@module-federation/sdk" "^0.21.2" - "@nx/devkit" "22.5.1" - "@nx/js" "22.5.1" - "@nx/web" "22.5.1" - "@rspack/core" "1.6.8" - express "^4.21.2" - http-proxy-middleware "^3.0.5" - picocolors "^1.1.0" - tslib "^2.3.0" - webpack "^5.101.3" - -"@nx/node@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/node/-/node-22.0.1.tgz#ee6d150a41efcc6e218ce3727d8ddd7237fe6cf7" - integrity sha512-QdcZ3LDD4niPa8RDW35bRANdzas7xP0IfUHYSiISccTh47h/iOwacxPLy/0w/drmjMpjJgFKAz/bVj4fRKDNIg== - dependencies: - "@nx/devkit" "22.0.1" - "@nx/docker" "22.0.1" - "@nx/eslint" "22.0.1" - "@nx/jest" "22.0.1" - "@nx/js" "22.0.1" - kill-port "^1.6.1" - tcp-port-used "^1.0.2" - tslib "^2.3.0" - -"@nx/nx-darwin-arm64@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-22.0.1.tgz#bbdbaf557d85b23d178e9f458e909509aeae5225" - integrity sha512-kbzgsDXHwpq1+PdKC9R23dvD9XescsxF42mizrt3H615cejJe8PBF93/Cx/sdfT+n5PEmKXRDwTRBDXQbUsX9g== - -"@nx/nx-darwin-arm64@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-22.5.1.tgz#993368d5859ea4c2bbb855c5649e2c4aa9b1b840" - integrity sha512-DuvOwhXPO6l9W7/zM4/BaAbGTIXFyHVcbbCD1c7HfgZ3VfJPmcE7H4+TuQH0cigHHtpg/eGqV100NQbd7N4zwg== - -"@nx/nx-darwin-x64@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-22.0.1.tgz#c77cac89bc16371ca3ccfb65e233235b25cf0bd4" - integrity sha512-W5MAiesTGSVwYRoQa2WHARiEolqhioMwa8p1/gdQePb4LmM2ZdNOj6emVJYUecql6kt+ptHeO4bYaFc8n+XLEw== - -"@nx/nx-darwin-x64@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-22.5.1.tgz#8087825d28c5bab20657e79ca2ce616a46bffa11" - integrity sha512-81Lb7+rp3Qltpgy33Kc1qxk+8IWqZLhqvdLdRFSVV1FN1pPSJDFKyPjCn9oMpRryNPSJ8DgZDpfIaVVyP85rUw== - -"@nx/nx-freebsd-x64@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-22.0.1.tgz#75ff787e74718bcc46ffb087bb8a2c07118459c4" - integrity sha512-3n7nzFmRtUvfnP5rtJtaSqv9MxRTXe3RnwXF9N1oXE3gYmGJZXCo8cIYNzrt8oTeWxRUDTm/leJQnQ/aC7/v0g== - -"@nx/nx-freebsd-x64@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-22.5.1.tgz#48de3848c73c3fedcd4bfa8a27be5e761ab2f34b" - integrity sha512-Ig8yQN3lSz9R+Zf3NQWcvEnIzwDX4NSeaFtEliPnC3OHlQXGNXbOUfkExa0U0UUgyxa4rgnCgefmwuc12H9q2Q== - -"@nx/nx-linux-arm-gnueabihf@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-22.0.1.tgz#a394e4b79d1f8f58406ffa4130fd12a55d0c1e45" - integrity sha512-4cTCWWa4yonTE1lrH+1bX3urozJjVr0xjHysBktwc1W8VNg65oA6p29yC1FDZcTBgo9rY/y/1WIL1E61y64BgA== - -"@nx/nx-linux-arm-gnueabihf@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-22.5.1.tgz#97898f52376cba43ea92b75b896fa42852537911" - integrity sha512-C7tGoLnR9MjKLJsLMF2VsKcDChPiygAsw6dSVgU4B650H7sBWmkEHM/QjvyRvkcZuoQBDamS/eVs/UaJu9wNhA== - -"@nx/nx-linux-arm64-gnu@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-22.0.1.tgz#f607f3746eaa15d17d79adff0a1365840eeba3a0" - integrity sha512-cC61gqNy+Z3DBr8FBWysLCnIEPbrSxWU/GtnVWH/4r4fMzDlaQwl51g8nm2KCtQXOgyqyWkXEd5jykr3z2u7QA== - -"@nx/nx-linux-arm64-gnu@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-22.5.1.tgz#d0f333112216febbbbed6ef72ae4806791276020" - integrity sha512-GNxei+lwhzhrO9m+nNkibgxLhbkYKyFXPSRpOKLwv9VavNzJn5UmLfKJyhjNQPBOSYuNhiVPbU1Ja/qOBcozYw== - -"@nx/nx-linux-arm64-musl@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-22.0.1.tgz#b94f25b1a3dc338dd8ec85f04d167d1876ae83c4" - integrity sha512-43I82qkAvXUsRySzDkhstg9kpGegZG5EWRMFYtEatgJRXeVRssPwHZHsLP2alj/gopJFq1H2yjWOWTziJxG3pw== - -"@nx/nx-linux-arm64-musl@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-22.5.1.tgz#9ee7c3d7d180afc1307b3b92ad5f6d1a4177e182" - integrity sha512-VDJtdJP2nCgS8ommbfWFAKjoZCE51VH7tZyIfh8RFI5fxwoB3Pk6d6f6cmNHI/1t98YI3V7Onuf3Y9KBkYtyfQ== - -"@nx/nx-linux-x64-gnu@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-22.0.1.tgz#bcfdfbfda14a51db43a478db0e99929d3c90e1fd" - integrity sha512-HRtVR9g57gzjikXsUHVcP6UsrHWMzXq+WJz7PzgcRU1RT/AP/4QxV6HegA1O2filcGLxSYwt5JOYwy73OYuYDg== - -"@nx/nx-linux-x64-gnu@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-22.5.1.tgz#7e432d2b1c7ed439e8791f215060d8191edaa05f" - integrity sha512-BZ/i+KTplEJmE8ZHKgPGD513Zl86DuSGyRAvbDZ7Qf19Tei7Of6vxW+ypvVDIwmDbyXfe13u54M5gDt8iiqFGQ== - -"@nx/nx-linux-x64-musl@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-22.0.1.tgz#d59c9d02a99e081c225786f16225a818d5553dad" - integrity sha512-v/ZScgI8fwTMfIZgnLXSq2XB//3uX+qhq/dzzbQQKvOuo/vtrnhxOKcoo4mCGVKuFtT/mr0bv66/5uPpUPct2A== - -"@nx/nx-linux-x64-musl@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-22.5.1.tgz#a3e218c3d3a36ac4b00d705d08d6c4a62b93702d" - integrity sha512-e0VdiV6fe88Dbhill2gUjYAD9jMhHjYsafGOPR+/uaGMAYPoI1jKur6uPGY+ik6fvwvDFFl0VT2+HACKVn7RoA== - -"@nx/nx-win32-arm64-msvc@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-22.0.1.tgz#53381edc0a79d480ba17147560694069dfc7538a" - integrity sha512-xajcwSOJUISp+OaL/NU2ulhXvEEo1KwmgEvYpePWS5gvxogu8ps9D9wrtJGFcMSrKyPGurbPUbOCAKMbrk4LqQ== - -"@nx/nx-win32-arm64-msvc@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-22.5.1.tgz#916775bfa1eacb2d402cbb6fd2c8584a4fe58956" - integrity sha512-3vWZO9y7uHKeyepcU55pE8VQTKGome3mLdicvx1TCoKKl0cA3bTR341Jdo2Zl4Waa2ENk7pGQbLWRQ3ZkaA92A== - -"@nx/nx-win32-x64-msvc@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-22.0.1.tgz#9161d031d0cb9ef37ec8dd638db45d44d8f92a3b" - integrity sha512-2w78FyjZwBeKxjdv0ZzdHin2UFPk0NBHtb5mcZ7lannBDHahdO4vA9iI8Pg+Y75ybKGrIsCyHK+BDdgH/S6UHQ== - -"@nx/nx-win32-x64-msvc@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-22.5.1.tgz#dcd432ab7dfea2fab308fd6410f190da3301cf28" - integrity sha512-4e5LduuhpBx96JgD1J3fHUGCwC+/lL+tvXp3UVtjh/AOdINGsyI+scinT3uaI9vcB5GKBcybTxbBZzwcH50w9g== - -"@nx/react@^22.2.0": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/react/-/react-22.5.1.tgz#5172ea050deafff09d050626df8624751e0fb380" - integrity sha512-KLf9dABJFJb05H8L8YF9aAwsUWsOjnbOq2FEZMJzb0NNsc96fTbe01etPgEoWYaLum7czHWbGEZCvgrl46+Oxw== - dependencies: - "@nx/devkit" "22.5.1" - "@nx/eslint" "22.5.1" - "@nx/js" "22.5.1" - "@nx/module-federation" "22.5.1" - "@nx/rollup" "22.5.1" - "@nx/web" "22.5.1" - "@phenomnomnominal/tsquery" "~6.1.4" - "@svgr/webpack" "^8.0.1" - express "^4.21.2" - http-proxy-middleware "^3.0.5" - minimatch "10.1.1" - picocolors "^1.1.0" - semver "^7.6.3" - tslib "^2.3.0" - optionalDependencies: - "@nx/vite" "22.5.1" - -"@nx/rollup@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/rollup/-/rollup-22.5.1.tgz#3bc1346369e6e8af5753eacf2812cae7501b04ff" - integrity sha512-W6MgEZKRTORUxLeGASBX+WrN+ZZEN+wa2ynUliKeLEvpFJUPGsK6iyYe5MO/9pbxjcATZCnbe4lVQAKLglVH4g== - dependencies: - "@nx/devkit" "22.5.1" - "@nx/js" "22.5.1" - "@rollup/plugin-babel" "^6.0.4" - "@rollup/plugin-commonjs" "^25.0.7" - "@rollup/plugin-image" "^3.0.3" - "@rollup/plugin-json" "^6.1.0" - "@rollup/plugin-node-resolve" "^15.2.3" - "@rollup/plugin-typescript" "^12.1.0" - autoprefixer "^10.4.9" - concat-with-sourcemaps "^1.1.0" - picocolors "^1.1.0" - picomatch "4.0.2" - postcss "^8.4.38" - postcss-modules "^6.0.1" - rollup "^4.14.0" - rollup-plugin-typescript2 "^0.36.0" - tslib "^2.3.0" - -"@nx/vite@22.5.1", "@nx/vite@^22.0.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/vite/-/vite-22.5.1.tgz#30f3548b75c0219a2d4184548b125732804ca1d3" - integrity sha512-Og2q6JRBYBNpMupUn4UpCuBny++Um/MIpQcfv0u0jd0B1TyBtiogYAFVxE0Vv23UezJBkI0IWr9NcjpR5rkUFw== - dependencies: - "@nx/devkit" "22.5.1" - "@nx/js" "22.5.1" - "@nx/vitest" "22.5.1" - "@phenomnomnominal/tsquery" "~6.1.4" - ajv "^8.0.0" - enquirer "~2.3.6" - picomatch "4.0.2" - semver "^7.6.3" - tsconfig-paths "^4.1.2" - tslib "^2.3.0" - -"@nx/vitest@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/vitest/-/vitest-22.5.1.tgz#0519808d3f7159166163d0d151091f251a4ceef1" - integrity sha512-Uu97DJIgqcfqO9CYhlCY+QKgMPFgKDtJjl+9E1QBUMuGRyGMJbtPQpH0ekQJOZso7Ha31QAIOozHP6yO8Qo+hQ== - dependencies: - "@nx/devkit" "22.5.1" - "@nx/js" "22.5.1" - "@phenomnomnominal/tsquery" "~6.1.4" - semver "^7.6.3" - tslib "^2.3.0" - -"@nx/web@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/web/-/web-22.5.1.tgz#f04feca0244893cf35d99ea96be634007245025f" - integrity sha512-kK46sX/nPFjNptqfwwXX29ALVthmbxts9YlqB80gT+sewgBgnRU6HN+d+9lvBJT+9AtHodJPb25HeRRKXspx3w== - dependencies: - "@nx/devkit" "22.5.1" - "@nx/js" "22.5.1" - detect-port "^1.5.1" - http-server "^14.1.0" - picocolors "^1.1.0" - tslib "^2.3.0" - -"@nx/workspace@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-22.0.1.tgz#21fa59a93569a532bb48d40760945788a588ac25" - integrity sha512-isITIOtnzux2IRaIrpRJDra80/RpC6QZ9WOitprDRMXm+eXIZU6wX4vlBSFB9mmvb8eyPayyFszZO6/nObrRPg== - dependencies: - "@nx/devkit" "22.0.1" - "@zkochan/js-yaml" "0.0.7" - chalk "^4.1.0" - enquirer "~2.3.6" - nx "22.0.1" - picomatch "4.0.2" - semver "^7.6.3" - tslib "^2.3.0" - yargs-parser "21.1.1" - -"@nx/workspace@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-22.5.1.tgz#01bfbc0f7a39dbafb633e31e0d32a76d013f6349" - integrity sha512-IZJ440ITiNpswacrTGGpo46adOszLAAZM9RYYvQg5ak8kZDmmrskTm0SWWVgZCuiJazw8s23vqDLQ07TN/t1NQ== - dependencies: - "@nx/devkit" "22.5.1" - "@zkochan/js-yaml" "0.0.7" - chalk "^4.1.0" - enquirer "~2.3.6" - nx "22.5.1" - picomatch "4.0.2" - semver "^7.6.3" - tslib "^2.3.0" - yargs-parser "21.1.1" - -"@paralleldrive/cuid2@^2.2.2": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz#3d62ea9e7be867d3fa94b9897fab5b0ae187d784" - integrity sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw== - dependencies: - "@noble/hashes" "^1.1.5" - -"@phenomnomnominal/tsquery@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@phenomnomnominal/tsquery/-/tsquery-5.0.1.tgz#a2a5abc89f92c01562a32806655817516653a388" - integrity sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA== - dependencies: - esquery "^1.4.0" - -"@phenomnomnominal/tsquery@~6.1.4": - version "6.1.4" - resolved "https://registry.yarnpkg.com/@phenomnomnominal/tsquery/-/tsquery-6.1.4.tgz#091671c961a9ec9a823711317dfc28cf47bb273d" - integrity sha512-3tHlGy/fxjJCHqIV8nelAzbRTNkCUY+k7lqBGKNuQz99H2OKGRt6oU+U2SZs6LYrbOe8mxMFl6kq6gzHapFRkw== - dependencies: - "@types/esquery" "^1.5.0" - esquery "^1.5.0" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@pkgr/core@^0.2.9": - version "0.2.9" - resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.9.tgz#d229a7b7f9dac167a156992ef23c7f023653f53b" - integrity sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA== - -"@playwright/test@1.46.0": - version "1.46.0" - resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.46.0.tgz#ccea6d22c40ee7fa567e4192fafbdf2a907e2714" - integrity sha512-/QYft5VArOrGRP5pgkrfKksqsKA6CEFyGQ/gjNe6q0y4tZ1aaPfq4gIjudr1s3D+pXyrPRdsy4opKDrjBabE5w== - dependencies: - playwright "1.46.0" - -"@polka/url@^1.0.0-next.24": - version "1.0.0-next.29" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.29.tgz#5a40109a1ab5f84d6fd8fc928b19f367cbe7e7b1" - integrity sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww== - -"@popperjs/core@^2.11.8": - version "2.11.8" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" - integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== - -"@remix-run/router@1.23.1": - version "1.23.1" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.23.1.tgz#0ce8857b024e24fc427585316383ad9d295b3a7f" - integrity sha512-vDbaOzF7yT2Qs4vO6XV1MHcJv+3dgR1sT+l3B8xxOVhUC336prMvqrvsLL/9Dnw2xr6Qhz4J0dmS0llNAbnUmQ== - -"@rolldown/pluginutils@1.0.0-rc.2": - version "1.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz#10324e74cb3396cb7b616042ea7e9e6aa7d8d458" - integrity sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw== - -"@rolldown/pluginutils@1.0.0-rc.3": - version "1.0.0-rc.3" - resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz#8a88cc92a0f741befc7bc109cb1a4c6b9408e1c5" - integrity sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q== - -"@rollup/plugin-babel@^6.0.4": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-6.1.0.tgz#5766913722057f28a56365bb6c1ca61306c7e527" - integrity sha512-dFZNuFD2YRcoomP4oYf+DvQNSUA9ih+A3vUqopQx5EdtPGo3WBnQcI/S8pwpz91UsGfL0HsMSOlaMld8HrbubA== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@rollup/pluginutils" "^5.0.1" - -"@rollup/plugin-commonjs@^25.0.7": - version "25.0.8" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz#c77e608ab112a666b7f2a6bea625c73224f7dd34" - integrity sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A== - dependencies: - "@rollup/pluginutils" "^5.0.1" - commondir "^1.0.1" - estree-walker "^2.0.2" - glob "^8.0.3" - is-reference "1.2.1" - magic-string "^0.30.3" - -"@rollup/plugin-image@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@rollup/plugin-image/-/plugin-image-3.0.3.tgz#025b557180bae20f2349ff5130ef2114169feaac" - integrity sha512-qXWQwsXpvD4trSb8PeFPFajp8JLpRtqqOeNYRUKnEQNHm7e5UP7fuSRcbjQAJ7wDZBbnJvSdY5ujNBQd9B1iFg== - dependencies: - "@rollup/pluginutils" "^5.0.1" - mini-svg-data-uri "^1.4.4" - -"@rollup/plugin-json@^6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-6.1.0.tgz#fbe784e29682e9bb6dee28ea75a1a83702e7b805" - integrity sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA== - dependencies: - "@rollup/pluginutils" "^5.1.0" - -"@rollup/plugin-node-resolve@^15.2.3": - version "15.3.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz#66008953c2524be786aa319d49e32f2128296a78" - integrity sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA== - dependencies: - "@rollup/pluginutils" "^5.0.1" - "@types/resolve" "1.20.2" - deepmerge "^4.2.2" - is-module "^1.0.0" - resolve "^1.22.1" - -"@rollup/plugin-replace@^5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-5.0.7.tgz#150c9ee9db8031d9e4580a61a0edeaaed3d37687" - integrity sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ== - dependencies: - "@rollup/pluginutils" "^5.0.1" - magic-string "^0.30.3" - -"@rollup/plugin-typescript@^12.1.0": - version "12.3.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-12.3.0.tgz#cc51b830973bc14c9456fe6532f322f2a40f5f12" - integrity sha512-7DP0/p7y3t67+NabT9f8oTBFE6gGkto4SA6Np2oudYmZE/m1dt8RB0SjL1msMxFpLo631qjRCcBlAbq1ml/Big== - dependencies: - "@rollup/pluginutils" "^5.1.0" - resolve "^1.22.1" - -"@rollup/pluginutils@^4.1.2": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" - integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== - dependencies: - estree-walker "^2.0.1" - picomatch "^2.2.2" - -"@rollup/pluginutils@^5.0.1", "@rollup/pluginutils@^5.0.2", "@rollup/pluginutils@^5.1.0", "@rollup/pluginutils@^5.1.4": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.3.0.tgz#57ba1b0cbda8e7a3c597a4853c807b156e21a7b4" - integrity sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q== - dependencies: - "@types/estree" "^1.0.0" - estree-walker "^2.0.2" - picomatch "^4.0.2" - -"@rollup/rollup-android-arm-eabi@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz#add5e608d4e7be55bc3ca3d962490b8b1890e088" - integrity sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg== - -"@rollup/rollup-android-arm64@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz#10bd0382b73592beee6e9800a69401a29da625c4" - integrity sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w== - -"@rollup/rollup-darwin-arm64@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz#1e99ab04c0b8c619dd7bbde725ba2b87b55bfd81" - integrity sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg== - -"@rollup/rollup-darwin-x64@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz#69e741aeb2839d2e8f0da2ce7a33d8bd23632423" - integrity sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w== - -"@rollup/rollup-freebsd-arm64@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz#3736c232a999c7bef7131355d83ebdf9651a0839" - integrity sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug== - -"@rollup/rollup-freebsd-x64@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz#227dcb8f466684070169942bd3998901c9bfc065" - integrity sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q== - -"@rollup/rollup-linux-arm-gnueabihf@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz#ba004b30df31b724f99ce66e7128248bea17cb0c" - integrity sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw== - -"@rollup/rollup-linux-arm-musleabihf@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz#6929f3e07be6b6da5991f63c6b68b3e473d0a65a" - integrity sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw== - -"@rollup/rollup-linux-arm64-gnu@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz#06e89fd4a25d21fe5575d60b6f913c0e65297bfa" - integrity sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g== - -"@rollup/rollup-linux-arm64-musl@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz#fddabf395b90990d5194038e6cd8c00156ed8ac0" - integrity sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q== - -"@rollup/rollup-linux-loong64-gnu@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz#04c10bb764bbf09a3c1bd90432e92f58d6603c36" - integrity sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA== - -"@rollup/rollup-linux-loong64-musl@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz#f2450361790de80581d8687ea19142d8a4de5c0f" - integrity sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw== - -"@rollup/rollup-linux-ppc64-gnu@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz#0474f4667259e407eee1a6d38e29041b708f6a30" - integrity sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w== - -"@rollup/rollup-linux-ppc64-musl@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz#9f32074819eeb1ddbe51f50ea9dcd61a6745ec33" - integrity sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw== - -"@rollup/rollup-linux-riscv64-gnu@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz#3fdb9d4b1e29fb6b6a6da9f15654d42eb77b99b2" - integrity sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A== - -"@rollup/rollup-linux-riscv64-musl@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz#1de780d64e6be0e3e8762035c22e0d8ea68df8ed" - integrity sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw== - -"@rollup/rollup-linux-s390x-gnu@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz#1da022ffd2d9e9f0fd8344ea49e113001fbcac64" - integrity sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg== - -"@rollup/rollup-linux-x64-gnu@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz#78c16eef9520bd10e1ea7a112593bb58e2842622" - integrity sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg== - -"@rollup/rollup-linux-x64-musl@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz#a7598591b4d9af96cb3167b50a5bf1e02dfea06c" - integrity sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw== - -"@rollup/rollup-openbsd-x64@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz#c51d48c07cd6c466560e5bed934aec688ce02614" - integrity sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw== - -"@rollup/rollup-openharmony-arm64@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz#f09921d0b2a0b60afbf3586d2a7a7f208ba6df17" - integrity sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ== - -"@rollup/rollup-win32-arm64-msvc@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz#08d491717135376e4a99529821c94ecd433d5b36" - integrity sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ== - -"@rollup/rollup-win32-ia32-msvc@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz#b0c12aac1104a8b8f26a5e0098e5facbb3e3964a" - integrity sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew== - -"@rollup/rollup-win32-x64-gnu@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz#b9cccef26f5e6fdc013bf3c0911a3c77428509d0" - integrity sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ== - -"@rollup/rollup-win32-x64-msvc@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz#a03348e7b559c792b6277cc58874b89ef46e1e72" - integrity sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA== - -"@rspack/binding-darwin-arm64@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.6.8.tgz#52987c0cbc487a240bdc6b1a31838372daddee2b" - integrity sha512-e8CTQtzaeGnf+BIzR7wRMUwKfIg0jd/sxMRc1Vd0bCMHBhSN9EsGoMuJJaKeRrSmy2nwMCNWHIG+TvT1CEKg+A== - -"@rspack/binding-darwin-x64@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.6.8.tgz#13c801ce8210d11b7b0bc4ac7bf036ec32862935" - integrity sha512-ku1XpTEPt6Za11zhpFWhfwrTQogcgi9RJrOUVC4FESiPO9aKyd4hJ+JiPgLY0MZOqsptK6vEAgOip+uDVXrCpg== - -"@rspack/binding-linux-arm64-gnu@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.6.8.tgz#d70321ac5bbd5bc101de9a2da01c6fb984601565" - integrity sha512-fvZX6xZPvBT8qipSpvkKMX5M7yd2BSpZNCZXcefw6gA3uC7LI3gu+er0LrDXY1PtPzVuHTyDx+abwWpagV3PiQ== - -"@rspack/binding-linux-arm64-musl@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.6.8.tgz#4f9196b6233649ce43e6485a5d2714ef38dfc603" - integrity sha512-++XMKcMNrt59HcFBLnRaJcn70k3X0GwkAegZBVpel8xYIAgvoXT5+L8P1ExId/yTFxqedaz8DbcxQnNmMozviw== - -"@rspack/binding-linux-x64-gnu@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.6.8.tgz#b78e7f62b4157b31e181fe89d319a601782a802b" - integrity sha512-tv3BWkTE1TndfX+DsE1rSTg8fBevCxujNZ3MlfZ22Wfy9x1FMXTJlWG8VIOXmaaJ1wUHzv8S7cE2YUUJ2LuiCg== - -"@rspack/binding-linux-x64-musl@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.6.8.tgz#c578f730d8a9fab866e4a15920457ef9d7fd5f58" - integrity sha512-DCGgZ5/in1O3FjHWqXnDsncRy+48cMhfuUAAUyl0yDj1NpsZu9pP+xfGLvGcQTiYrVl7IH9Aojf1eShP/77WGA== - -"@rspack/binding-wasm32-wasi@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.6.8.tgz#76d23589ec31ad6bab6784da89f7cc42c7df0275" - integrity sha512-VUwdhl/lI4m6o1OGCZ9JwtMjTV/yLY5VZTQdEPKb40JMTlmZ5MBlr5xk7ByaXXYHr6I+qnqEm73iMKQvg6iknw== - dependencies: - "@napi-rs/wasm-runtime" "1.0.7" - -"@rspack/binding-win32-arm64-msvc@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.6.8.tgz#b42cba4ab7588ce72f0c13c968d3d62e8a61ab46" - integrity sha512-23YX7zlOZlub+nPGDBUzktb4D5D6ETUAluKjXEeHIZ9m7fSlEYBnGL66YE+3t1DHXGd0OqsdwlvrNGcyo6EXDQ== - -"@rspack/binding-win32-ia32-msvc@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.6.8.tgz#293a23448c6a11f25a9abbb989613059c7da3ec4" - integrity sha512-cFgRE3APxrY4AEdooVk2LtipwNNT/9mrnjdC5lVbsIsz+SxvGbZR231bxDJEqP15+RJOaD07FO1sIjINFqXMEg== - -"@rspack/binding-win32-x64-msvc@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.6.8.tgz#f5fd3f01b6694ee08cbc382c3bd42d6490ab9446" - integrity sha512-cIuhVsZYd3o3Neo1JSAhJYw6BDvlxaBoqvgwRkG1rs0ExFmEmgYyG7ip9pFKnKNWph/tmW3rDYypmEfjs1is7g== - -"@rspack/binding@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding/-/binding-1.6.8.tgz#c2cd2c31a4313ab10ad8ed871a5b9be0444046f3" - integrity sha512-lUeL4mbwGo+nqRKqFDCm9vH2jv9FNMVt1X8jqayWRcOCPlj/2UVMEFgqjR7Pp2vlvnTKq//31KbDBJmDZq31RQ== - optionalDependencies: - "@rspack/binding-darwin-arm64" "1.6.8" - "@rspack/binding-darwin-x64" "1.6.8" - "@rspack/binding-linux-arm64-gnu" "1.6.8" - "@rspack/binding-linux-arm64-musl" "1.6.8" - "@rspack/binding-linux-x64-gnu" "1.6.8" - "@rspack/binding-linux-x64-musl" "1.6.8" - "@rspack/binding-wasm32-wasi" "1.6.8" - "@rspack/binding-win32-arm64-msvc" "1.6.8" - "@rspack/binding-win32-ia32-msvc" "1.6.8" - "@rspack/binding-win32-x64-msvc" "1.6.8" - -"@rspack/core@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/core/-/core-1.6.8.tgz#b1f945a1a167f74394304ea93723616428d66095" - integrity sha512-FolcIAH5FW4J2FET+qwjd1kNeFbCkd0VLuIHO0thyolEjaPSxw5qxG67DA7BZGm6PVcoiSgPLks1DL6eZ8c+fA== - dependencies: - "@module-federation/runtime-tools" "0.21.6" - "@rspack/binding" "1.6.8" - "@rspack/lite-tapable" "1.1.0" - -"@rspack/lite-tapable@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz#3cfdafeed01078e116bd4f191b684c8b484de425" - integrity sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw== - -"@rtsao/scc@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" - integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== - -"@rushstack/node-core-library@5.19.1": - version "5.19.1" - resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.19.1.tgz#2bafbb81cdd886798db2adc44ad41506fa80195a" - integrity sha512-ESpb2Tajlatgbmzzukg6zyAhH+sICqJR2CNXNhXcEbz6UGCQfrKCtkxOpJTftWc8RGouroHG0Nud1SJAszvpmA== - dependencies: - ajv "~8.13.0" - ajv-draft-04 "~1.0.0" - ajv-formats "~3.0.1" - fs-extra "~11.3.0" - import-lazy "~4.0.0" - jju "~1.4.0" - resolve "~1.22.1" - semver "~7.5.4" - -"@rushstack/problem-matcher@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@rushstack/problem-matcher/-/problem-matcher-0.1.1.tgz#db9303ef3c47010c8aba5841e8c9511e091159df" - integrity sha512-Fm5XtS7+G8HLcJHCWpES5VmeMyjAKaWeyZU5qPzZC+22mPlJzAsOxymHiWIfuirtPckX3aptWws+K2d0BzniJA== - -"@rushstack/rig-package@0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.6.0.tgz#c80f93fe2c0d9d4977fc925ed9ce9decb75047a5" - integrity sha512-ZQmfzsLE2+Y91GF15c65L/slMRVhF6Hycq04D4TwtdGaUAbIXXg9c5pKA5KFU7M4QMaihoobp9JJYpYcaY3zOw== - dependencies: - resolve "~1.22.1" - strip-json-comments "~3.1.1" - -"@rushstack/terminal@0.21.0": - version "0.21.0" - resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.21.0.tgz#216d4383d5c10d6f3fe7530af43717b2c2513329" - integrity sha512-cLaI4HwCNYmknM5ns4G+drqdEB6q3dCPV423+d3TZeBusYSSm09+nR7CnhzJMjJqeRcdMAaLnrA4M/3xDz4R3w== - dependencies: - "@rushstack/node-core-library" "5.19.1" - "@rushstack/problem-matcher" "0.1.1" - supports-color "~8.1.1" - -"@rushstack/ts-command-line@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-5.2.0.tgz#2e6f6bc2c63f79a7422772a78edc52c50cfe8837" - integrity sha512-lYxCX0nDdkDtCkVpvF0m25ymf66SaMWuppbD6b7MdkIzvGXKBXNIVZlwBH/C0YfkanrupnICWf2n4z3AKSfaHw== - dependencies: - "@rushstack/terminal" "0.21.0" - "@types/argparse" "1.0.38" - argparse "~1.0.9" - string-argv "~0.3.1" - -"@shikijs/core@1.29.2": - version "1.29.2" - resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.29.2.tgz#9c051d3ac99dd06ae46bd96536380c916e552bf3" - integrity sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ== - dependencies: - "@shikijs/engine-javascript" "1.29.2" - "@shikijs/engine-oniguruma" "1.29.2" - "@shikijs/types" "1.29.2" - "@shikijs/vscode-textmate" "^10.0.1" - "@types/hast" "^3.0.4" - hast-util-to-html "^9.0.4" - -"@shikijs/engine-javascript@1.29.2": - version "1.29.2" - resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-1.29.2.tgz#a821ad713a3e0b7798a1926fd9e80116e38a1d64" - integrity sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A== - dependencies: - "@shikijs/types" "1.29.2" - "@shikijs/vscode-textmate" "^10.0.1" - oniguruma-to-es "^2.2.0" - -"@shikijs/engine-oniguruma@1.29.2": - version "1.29.2" - resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz#d879717ced61d44e78feab16f701f6edd75434f1" - integrity sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA== - dependencies: - "@shikijs/types" "1.29.2" - "@shikijs/vscode-textmate" "^10.0.1" - -"@shikijs/langs@1.29.2": - version "1.29.2" - resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-1.29.2.tgz#4f1de46fde8991468c5a68fa4a67dd2875d643cd" - integrity sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ== - dependencies: - "@shikijs/types" "1.29.2" - -"@shikijs/themes@1.29.2": - version "1.29.2" - resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-1.29.2.tgz#293cc5c83dd7df3fdc8efa25cec8223f3a6acb0d" - integrity sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g== - dependencies: - "@shikijs/types" "1.29.2" - -"@shikijs/types@1.29.2": - version "1.29.2" - resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.29.2.tgz#a93fdb410d1af8360c67bf5fc1d1a68d58e21c4f" - integrity sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw== - dependencies: - "@shikijs/vscode-textmate" "^10.0.1" - "@types/hast" "^3.0.4" - -"@shikijs/vscode-textmate@^10.0.1": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz#a90ab31d0cc1dfb54c66a69e515bf624fa7b2224" - integrity sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg== - -"@sinclair/typebox@^0.27.8": - version "0.27.10" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.10.tgz#beefe675f1853f73676aecc915b2bd2ac98c4fc6" - integrity sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA== - -"@sinclair/typebox@^0.34.0": - version "0.34.48" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.34.48.tgz#75b0ead87e59e1adbd6dccdc42bad4fddee73b59" - integrity sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA== - -"@sinonjs/commons@^3.0.0", "@sinonjs/commons@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" - integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@sinonjs/fake-timers@^13.0.0": - version "13.0.5" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz#36b9dbc21ad5546486ea9173d6bea063eb1717d5" - integrity sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw== - dependencies: - "@sinonjs/commons" "^3.0.1" - -"@storybook/builder-vite@10.2.8": - version "10.2.8" - resolved "https://registry.yarnpkg.com/@storybook/builder-vite/-/builder-vite-10.2.8.tgz#c00da5d1646a0bfb6ca0875302c1f776c42a048f" - integrity sha512-+6/Lwi7W0YIbzHDh798GPp0IHUYDwp0yv0Y1eVNK/StZD0tnv4/1C28NKyP+O7JOsFsuWI1qHiDhw8kNURugZw== - dependencies: - "@storybook/csf-plugin" "10.2.8" - ts-dedent "^2.0.0" - -"@storybook/csf-plugin@10.2.8": - version "10.2.8" - resolved "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-10.2.8.tgz#9a142b4022b6730ce9f8090a4bbff9abe068c98f" - integrity sha512-kKkLYhRXb33YtIPdavD2DU25sb14sqPYdcQFpyqu4TaD9truPPqW8P5PLTUgERydt/eRvRlnhauPHavU1kjsnA== - dependencies: - unplugin "^2.3.5" - -"@storybook/global@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@storybook/global/-/global-5.0.0.tgz#b793d34b94f572c1d7d9e0f44fac4e0dbc9572ed" - integrity sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ== - -"@storybook/icons@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@storybook/icons/-/icons-2.0.1.tgz#1bd351db1d33bfccbbafa7b64fb413168f1a6616" - integrity sha512-/smVjw88yK3CKsiuR71vNgWQ9+NuY2L+e8X7IMrFjexjm6ZR8ULrV2DRkTA61aV6ryefslzHEGDInGpnNeIocg== - -"@storybook/react-dom-shim@10.2.8": - version "10.2.8" - resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-10.2.8.tgz#fcab1b8428c221287afe7e74fa43f59ce2871d77" - integrity sha512-Xde9X3VszFV1pTXfc2ZFM89XOCGRxJD8MUIzDwkcT9xaki5a+8srs/fsXj75fMY6gMYfcL5lNRZvCqg37HOmcQ== - -"@storybook/react-vite@^10.1.11": - version "10.2.8" - resolved "https://registry.yarnpkg.com/@storybook/react-vite/-/react-vite-10.2.8.tgz#0a12d2b4da3ea6ee3d91da109e2c5364db412078" - integrity sha512-x5kmw+TPhxkQV84n4e9X0q6/rA5T8V2QQFolMuN+U93q1HX1r+GZ6g/nXaaq9ox168PhHUJZQnn+LzSQKGCMBA== - dependencies: - "@joshwooding/vite-plugin-react-docgen-typescript" "^0.6.3" - "@rollup/pluginutils" "^5.0.2" - "@storybook/builder-vite" "10.2.8" - "@storybook/react" "10.2.8" - empathic "^2.0.0" - magic-string "^0.30.0" - react-docgen "^8.0.0" - resolve "^1.22.8" - tsconfig-paths "^4.2.0" - -"@storybook/react@10.2.8", "@storybook/react@^10.1.11": - version "10.2.8" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-10.2.8.tgz#d8da5b9ca969b0310683f392a75218af9990ca39" - integrity sha512-nMFqQFUXq6Zg2O5SeuomyWnrIx61QfpNQMrfor8eCEzHrWNnXrrvVsz2RnHIgXN8RVyaWGDPh1srAECu/kDHXw== - dependencies: - "@storybook/global" "^5.0.0" - "@storybook/react-dom-shim" "10.2.8" - react-docgen "^8.0.2" - -"@svgr/babel-plugin-add-jsx-attribute@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" - integrity sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g== - -"@svgr/babel-plugin-remove-jsx-attribute@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" - integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== - -"@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" - integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== - -"@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz#8fbb6b2e91fa26ac5d4aa25c6b6e4f20f9c0ae27" - integrity sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ== - -"@svgr/babel-plugin-svg-dynamic-title@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz#1d5ba1d281363fc0f2f29a60d6d936f9bbc657b0" - integrity sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og== - -"@svgr/babel-plugin-svg-em-dimensions@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz#35e08df300ea8b1d41cb8f62309c241b0369e501" - integrity sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g== - -"@svgr/babel-plugin-transform-react-native-svg@8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz#90a8b63998b688b284f255c6a5248abd5b28d754" - integrity sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q== - -"@svgr/babel-plugin-transform-svg-component@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz#013b4bfca88779711f0ed2739f3f7efcefcf4f7e" - integrity sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw== - -"@svgr/babel-preset@8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-8.1.0.tgz#0e87119aecdf1c424840b9d4565b7137cabf9ece" - integrity sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug== - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "8.0.0" - "@svgr/babel-plugin-remove-jsx-attribute" "8.0.0" - "@svgr/babel-plugin-remove-jsx-empty-expression" "8.0.0" - "@svgr/babel-plugin-replace-jsx-attribute-value" "8.0.0" - "@svgr/babel-plugin-svg-dynamic-title" "8.0.0" - "@svgr/babel-plugin-svg-em-dimensions" "8.0.0" - "@svgr/babel-plugin-transform-react-native-svg" "8.1.0" - "@svgr/babel-plugin-transform-svg-component" "8.0.0" - -"@svgr/core@8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-8.1.0.tgz#41146f9b40b1a10beaf5cc4f361a16a3c1885e88" - integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA== - dependencies: - "@babel/core" "^7.21.3" - "@svgr/babel-preset" "8.1.0" - camelcase "^6.2.0" - cosmiconfig "^8.1.3" - snake-case "^3.0.4" - -"@svgr/hast-util-to-babel-ast@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz#6952fd9ce0f470e1aded293b792a2705faf4ffd4" - integrity sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q== - dependencies: - "@babel/types" "^7.21.3" - entities "^4.4.0" - -"@svgr/plugin-jsx@8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz#96969f04a24b58b174ee4cd974c60475acbd6928" - integrity sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA== - dependencies: - "@babel/core" "^7.21.3" - "@svgr/babel-preset" "8.1.0" - "@svgr/hast-util-to-babel-ast" "8.0.0" - svg-parser "^2.0.4" - -"@svgr/plugin-svgo@8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz#b115b7b967b564f89ac58feae89b88c3decd0f00" - integrity sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA== - dependencies: - cosmiconfig "^8.1.3" - deepmerge "^4.3.1" - svgo "^3.0.2" - -"@svgr/webpack@^8.0.1": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-8.1.0.tgz#16f1b5346f102f89fda6ec7338b96a701d8be0c2" - integrity sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA== - dependencies: - "@babel/core" "^7.21.3" - "@babel/plugin-transform-react-constant-elements" "^7.21.3" - "@babel/preset-env" "^7.20.2" - "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.21.0" - "@svgr/core" "8.1.0" - "@svgr/plugin-jsx" "8.1.0" - "@svgr/plugin-svgo" "8.1.0" - -"@swc/core-darwin-arm64@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.11.tgz#6f177125831b765e5dacdd1d8c07de576962ad16" - integrity sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg== - -"@swc/core-darwin-x64@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.11.tgz#31381b6560bbd8b8ca6a0755262df321e28c039d" - integrity sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA== - -"@swc/core-linux-arm-gnueabihf@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.11.tgz#ea7831776f7d8a548db4a8a5f38ef37faf5c0c66" - integrity sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg== - -"@swc/core-linux-arm64-gnu@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.11.tgz#c99a5843115ef57cbefd40b93c99cb130d6db12f" - integrity sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA== - -"@swc/core-linux-arm64-musl@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.11.tgz#9a7831f558b2ff504d3d6eaaf6a4c84e5232284b" - integrity sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w== - -"@swc/core-linux-x64-gnu@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.11.tgz#4a1fce9b9abedde04459fefe5da9dd9e405a2ae8" - integrity sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ== - -"@swc/core-linux-x64-musl@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.11.tgz#0865f23b1cc532d9d77e743a83279e074edbee25" - integrity sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw== - -"@swc/core-win32-arm64-msvc@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.11.tgz#73eda8b54c94046728f5983e5516223ad1009c59" - integrity sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA== - -"@swc/core-win32-ia32-msvc@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.11.tgz#0df41547974ba9f26ba3e903e803ff523c15650b" - integrity sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw== - -"@swc/core-win32-x64-msvc@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.11.tgz#f6f97500472c0ea4ab756c383c5d97896075f95c" - integrity sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw== - -"@swc/core@^1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.15.11.tgz#8f52ab37b4d874b9cc1b1ae809778620b42dbf9f" - integrity sha512-iLmLTodbYxU39HhMPaMUooPwO/zqJWvsqkrXv1ZI38rMb048p6N7qtAtTp37sw9NzSrvH6oli8EdDygo09IZ/w== - dependencies: - "@swc/counter" "^0.1.3" - "@swc/types" "^0.1.25" - optionalDependencies: - "@swc/core-darwin-arm64" "1.15.11" - "@swc/core-darwin-x64" "1.15.11" - "@swc/core-linux-arm-gnueabihf" "1.15.11" - "@swc/core-linux-arm64-gnu" "1.15.11" - "@swc/core-linux-arm64-musl" "1.15.11" - "@swc/core-linux-x64-gnu" "1.15.11" - "@swc/core-linux-x64-musl" "1.15.11" - "@swc/core-win32-arm64-msvc" "1.15.11" - "@swc/core-win32-ia32-msvc" "1.15.11" - "@swc/core-win32-x64-msvc" "1.15.11" - -"@swc/counter@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" - integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== - -"@swc/types@^0.1.25": - version "0.1.25" - resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.25.tgz#b517b2a60feb37dd933e542d93093719e4cf1078" - integrity sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g== - dependencies: - "@swc/counter" "^0.1.3" - -"@tailwindcss/node@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/node/-/node-4.1.18.tgz#9863be0d26178638794a38d6c7c14666fb992e8a" - integrity sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ== - dependencies: - "@jridgewell/remapping" "^2.3.4" - enhanced-resolve "^5.18.3" - jiti "^2.6.1" - lightningcss "1.30.2" - magic-string "^0.30.21" - source-map-js "^1.2.1" - tailwindcss "4.1.18" - -"@tailwindcss/oxide-android-arm64@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz#79717f87e90135e5d3d23a3d3aecde4ca5595dd5" - integrity sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q== - -"@tailwindcss/oxide-darwin-arm64@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz#7fa47608d62d60e9eb020682249d20159667fbb0" - integrity sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A== - -"@tailwindcss/oxide-darwin-x64@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz#c05991c85aa2af47bf9d1f8172fe9e4636591e79" - integrity sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw== - -"@tailwindcss/oxide-freebsd-x64@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz#3d48e8d79fd08ece0e02af8e72d5059646be34d0" - integrity sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA== - -"@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz#982ecd1a65180807ccfde67dc17c6897f2e50aa8" - integrity sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA== - -"@tailwindcss/oxide-linux-arm64-gnu@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz#df49357bc9737b2e9810ea950c1c0647ba6573c3" - integrity sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw== - -"@tailwindcss/oxide-linux-arm64-musl@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz#b266c12822bf87883cf152615f8fffb8519d689c" - integrity sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg== - -"@tailwindcss/oxide-linux-x64-gnu@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz#5c737f13dd9529b25b314e6000ff54e05b3811da" - integrity sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g== - -"@tailwindcss/oxide-linux-x64-musl@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz#3380e17f7be391f1ef924be9f0afe1f304fe3478" - integrity sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ== - -"@tailwindcss/oxide-wasm32-wasi@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz#9464df0e28a499aab1c55e97682be37b3a656c88" - integrity sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA== - dependencies: - "@emnapi/core" "^1.7.1" - "@emnapi/runtime" "^1.7.1" - "@emnapi/wasi-threads" "^1.1.0" - "@napi-rs/wasm-runtime" "^1.1.0" - "@tybys/wasm-util" "^0.10.1" - tslib "^2.4.0" - -"@tailwindcss/oxide-win32-arm64-msvc@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz#bbcdd59c628811f6a0a4d5b09616967d8fb0c4d4" - integrity sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA== - -"@tailwindcss/oxide-win32-x64-msvc@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz#9c628d04623aa4c3536c508289f58d58ba4b3fb1" - integrity sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q== - -"@tailwindcss/oxide@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide/-/oxide-4.1.18.tgz#c8335cd0a83e9880caecd60abf7904f43ebab582" - integrity sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A== - optionalDependencies: - "@tailwindcss/oxide-android-arm64" "4.1.18" - "@tailwindcss/oxide-darwin-arm64" "4.1.18" - "@tailwindcss/oxide-darwin-x64" "4.1.18" - "@tailwindcss/oxide-freebsd-x64" "4.1.18" - "@tailwindcss/oxide-linux-arm-gnueabihf" "4.1.18" - "@tailwindcss/oxide-linux-arm64-gnu" "4.1.18" - "@tailwindcss/oxide-linux-arm64-musl" "4.1.18" - "@tailwindcss/oxide-linux-x64-gnu" "4.1.18" - "@tailwindcss/oxide-linux-x64-musl" "4.1.18" - "@tailwindcss/oxide-wasm32-wasi" "4.1.18" - "@tailwindcss/oxide-win32-arm64-msvc" "4.1.18" - "@tailwindcss/oxide-win32-x64-msvc" "4.1.18" - -"@tailwindcss/vite@^4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/vite/-/vite-4.1.18.tgz#614b9d5483559518c72d31bca05d686f8df28e9a" - integrity sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA== - dependencies: - "@tailwindcss/node" "4.1.18" - "@tailwindcss/oxide" "4.1.18" - tailwindcss "4.1.18" - -"@testing-library/dom@10.4.0": - version "10.4.0" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-10.4.0.tgz#82a9d9462f11d240ecadbf406607c6ceeeff43a8" - integrity sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/runtime" "^7.12.5" - "@types/aria-query" "^5.0.1" - aria-query "5.3.0" - chalk "^4.1.0" - dom-accessibility-api "^0.5.9" - lz-string "^1.5.0" - pretty-format "^27.0.2" - -"@testing-library/jest-dom@^6.6.3": - version "6.9.1" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz#7613a04e146dd2976d24ddf019730d57a89d56c2" - integrity sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA== - dependencies: - "@adobe/css-tools" "^4.4.0" - aria-query "^5.0.0" - css.escape "^1.5.1" - dom-accessibility-api "^0.6.3" - picocolors "^1.1.1" - redent "^3.0.0" - -"@testing-library/react@16.3.0": - version "16.3.0" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.3.0.tgz#3a85bb9bdebf180cd76dba16454e242564d598a6" - integrity sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw== - dependencies: - "@babel/runtime" "^7.12.5" - -"@testing-library/user-event@^14.6.1": - version "14.6.1" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.6.1.tgz#13e09a32d7a8b7060fe38304788ebf4197cd2149" - integrity sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw== - -"@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== - -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== - -"@tybys/wasm-util@^0.10.0", "@tybys/wasm-util@^0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz#ecddd3205cf1e2d5274649ff0eedd2991ed7f414" - integrity sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg== - dependencies: - tslib "^2.4.0" - -"@tybys/wasm-util@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.9.0.tgz#3e75eb00604c8d6db470bf18c37b7d984a0e3355" - integrity sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw== - dependencies: - tslib "^2.4.0" - -"@types/argparse@1.0.38": - version "1.0.38" - resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" - integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== - -"@types/aria-query@^5.0.1": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" - integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== - -"@types/babel__core@^7.1.14", "@types/babel__core@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" - integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6", "@types/babel__traverse@^7.20.7": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74" - integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== - dependencies: - "@babel/types" "^7.28.2" - -"@types/body-parser@*", "@types/body-parser@^1.19.2": - version "1.19.6" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.6.tgz#1859bebb8fd7dac9918a45d54c1971ab8b5af474" - integrity sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/chai@^5.2.2": - version "5.2.3" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.3.tgz#8e9cd9e1c3581fa6b341a5aed5588eb285be0b4a" - integrity sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA== - dependencies: - "@types/deep-eql" "*" - assertion-error "^2.0.1" - -"@types/connect@*": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - -"@types/cookiejar@^2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.5.tgz#14a3e83fa641beb169a2dd8422d91c3c345a9a78" - integrity sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q== - -"@types/cors@^2.8.13": - version "2.8.19" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.19.tgz#d93ea2673fd8c9f697367f5eeefc2bbfa94f0342" - integrity sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg== - dependencies: - "@types/node" "*" - -"@types/debug@4.1.12": - version "4.1.12" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" - integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== - dependencies: - "@types/ms" "*" - -"@types/deep-eql@*": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" - integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== - -"@types/doctrine@^0.0.9": - version "0.0.9" - resolved "https://registry.yarnpkg.com/@types/doctrine/-/doctrine-0.0.9.tgz#d86a5f452a15e3e3113b99e39616a9baa0f9863f" - integrity sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA== - -"@types/eslint-scope@^3.7.7": - version "3.7.7" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" - integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" - integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/esquery@^1.5.0": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@types/esquery/-/esquery-1.5.4.tgz#ebfd3a3bca6db50446688ba5592d18bb9b807e91" - integrity sha512-yYO4Q8H+KJHKW1rEeSzHxcZi90durqYgWVfnh5K6ZADVBjBv2e1NEveYX5yT2bffgN7RqzH3k9930m+i2yBoMA== - dependencies: - "@types/estree" "*" - -"@types/estree@*", "@types/estree@1.0.8", "@types/estree@^1.0.0", "@types/estree@^1.0.8": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" - integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== - -"@types/express-serve-static-core@^4.17.33": - version "4.19.8" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz#99b960322a4d576b239a640ab52ef191989b036f" - integrity sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@^4.17.17": - version "4.17.25" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.25.tgz#070c8c73a6fee6936d65c195dbbfb7da5026649b" - integrity sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "^1" - -"@types/graceful-fs@^4.1.3": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" - integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== - dependencies: - "@types/node" "*" - -"@types/hast@^3.0.0", "@types/hast@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" - integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== - dependencies: - "@types/unist" "*" - -"@types/http-errors@*": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.5.tgz#5b749ab2b16ba113423feb1a64a95dcd30398472" - integrity sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg== - -"@types/http-proxy@^1.17.15": - version "1.17.17" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.17.tgz#d9e2c4571fe3507343cb210cd41790375e59a533" - integrity sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1", "@types/istanbul-lib-coverage@^2.0.6": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" - integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== - -"@types/istanbul-lib-report@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" - integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0", "@types/istanbul-reports@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" - integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^29.5.12": - version "29.5.14" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" - integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - -"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.9": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/lodash.omit@4.5.9": - version "4.5.9" - resolved "https://registry.yarnpkg.com/@types/lodash.omit/-/lodash.omit-4.5.9.tgz#cf4744d034961406d6dc41d9cd109773a9ed8fe3" - integrity sha512-zuAVFLUPJMOzsw6yawshsYGgq2hWUHtsZgeXHZmSFhaQQFC6EQ021uDKHkSjOpNhSvtNSU9165/o3o/Q51GpTw== - dependencies: - "@types/lodash" "*" - -"@types/lodash@*", "@types/lodash@^4.17.1": - version "4.17.23" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.23.tgz#c1bb06db218acc8fc232da0447473fc2fb9d9841" - integrity sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA== - -"@types/mdast@^4.0.0": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" - integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== - dependencies: - "@types/unist" "*" - -"@types/methods@^1.1.4": - version "1.1.4" - resolved "https://registry.yarnpkg.com/@types/methods/-/methods-1.1.4.tgz#d3b7ac30ac47c91054ea951ce9eed07b1051e547" - integrity sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ== - -"@types/mime@^1": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" - integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== - -"@types/ms@*": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" - integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== - -"@types/node-fetch@2.6.11": - version "2.6.11" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" - integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g== - dependencies: - "@types/node" "*" - form-data "^4.0.0" - -"@types/node@*": - version "25.2.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-25.2.3.tgz#9c18245be768bdb4ce631566c7da303a5c99a7f8" - integrity sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ== - dependencies: - undici-types "~7.16.0" - -"@types/node@20.19.9": - version "20.19.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.9.tgz#ca9a58193fec361cc6e859d88b52261853f1f0d3" - integrity sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw== - dependencies: - undici-types "~6.21.0" - -"@types/opentok@^2.14.0": - version "2.14.4" - resolved "https://registry.yarnpkg.com/@types/opentok/-/opentok-2.14.4.tgz#460722ec01deb4cf52cf8110107da661214e043d" - integrity sha512-m52tO9NbbWekxOcX6XoP5mAsjTBNcqBaZAiBXnYc6CF3TVAkTqEyXjcVMabch249iDwCMCpy1vg/yVfSgfypHg== - -"@types/parse-json@^4.0.0": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" - integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== - -"@types/prop-types@^15.7.12": - version "15.7.15" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7" - integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== - -"@types/qs@*": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.14.0.tgz#d8b60cecf62f2db0fb68e5e006077b9178b85de5" - integrity sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ== - -"@types/range-parser@*": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== - -"@types/react-dom@^19.2.3": - version "19.2.3" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.2.3.tgz#c1e305d15a52a3e508d54dca770d202cb63abf2c" - integrity sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ== - -"@types/react-transition-group@^4.4.10": - version "4.4.12" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.12.tgz#b5d76568485b02a307238270bfe96cb51ee2a044" - integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== - -"@types/react@^19.2.7": - version "19.2.14" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.14.tgz#39604929b5e3957e3a6fa0001dafb17c7af70bad" - integrity sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w== - dependencies: - csstype "^3.2.2" - -"@types/resolve@1.20.2": - version "1.20.2" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" - integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== - -"@types/resolve@^1.20.2": - version "1.20.6" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.6.tgz#e6e60dad29c2c8c206c026e6dd8d6d1bdda850b8" - integrity sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ== - -"@types/semver@7.5.8": - version "7.5.8" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" - integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== - -"@types/send@*": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@types/send/-/send-1.2.1.tgz#6a784e45543c18c774c049bff6d3dbaf045c9c74" - integrity sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ== - dependencies: - "@types/node" "*" - -"@types/send@<1": - version "0.17.6" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.6.tgz#aeb5385be62ff58a52cd5459daa509ae91651d25" - integrity sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-static@^1": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.10.tgz#768169145a778f8f5dfcb6360aead414a3994fee" - integrity sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw== - dependencies: - "@types/http-errors" "*" - "@types/node" "*" - "@types/send" "<1" - -"@types/stack-utils@^2.0.0", "@types/stack-utils@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" - integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== - -"@types/superagent@^8.1.0": - version "8.1.9" - resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-8.1.9.tgz#28bfe4658e469838ed0bf66d898354bcab21f49f" - integrity sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ== - dependencies: - "@types/cookiejar" "^2.1.5" - "@types/methods" "^1.1.4" - "@types/node" "*" - form-data "^4.0.0" - -"@types/supertest@^6.0.2": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-6.0.3.tgz#d736f0e994b195b63e1c93e80271a2faf927388c" - integrity sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w== - dependencies: - "@types/methods" "^1.1.4" - "@types/superagent" "^8.1.0" - -"@types/trusted-types@^2.0.7": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" - integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== - -"@types/ua-parser-js@^0.7.39": - version "0.7.39" - resolved "https://registry.yarnpkg.com/@types/ua-parser-js/-/ua-parser-js-0.7.39.tgz#832c58e460c9435e4e34bb866e85e9146e12cdbb" - integrity sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg== - -"@types/unist@*", "@types/unist@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" - integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== - -"@types/validator@^13.15.2": - version "13.15.10" - resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.15.10.tgz#742b77ec34d58554b94a76a14cef30d59e3c16b9" - integrity sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA== - -"@types/yargs-parser@*": - version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" - integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== - -"@types/yargs@^17.0.33", "@types/yargs@^17.0.8": - version "17.0.35" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.35.tgz#07013e46aa4d7d7d50a49e15604c1c5340d4eb24" - integrity sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@8.55.0", "@typescript-eslint/eslint-plugin@^8.30.1": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.55.0.tgz#086d2ef661507b561f7b17f62d3179d692a0765f" - integrity sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ== - dependencies: - "@eslint-community/regexpp" "^4.12.2" - "@typescript-eslint/scope-manager" "8.55.0" - "@typescript-eslint/type-utils" "8.55.0" - "@typescript-eslint/utils" "8.55.0" - "@typescript-eslint/visitor-keys" "8.55.0" - ignore "^7.0.5" - natural-compare "^1.4.0" - ts-api-utils "^2.4.0" - -"@typescript-eslint/parser@8.55.0", "@typescript-eslint/parser@^8.30.1": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.55.0.tgz#6eace4e9e95f178d3447ed1f17f3d6a5dfdb345c" - integrity sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw== - dependencies: - "@typescript-eslint/scope-manager" "8.55.0" - "@typescript-eslint/types" "8.55.0" - "@typescript-eslint/typescript-estree" "8.55.0" - "@typescript-eslint/visitor-keys" "8.55.0" - debug "^4.4.3" - -"@typescript-eslint/project-service@8.55.0": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.55.0.tgz#b8a71c06a625bdad481c24d5614b68e252f3ae9b" - integrity sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ== - dependencies: - "@typescript-eslint/tsconfig-utils" "^8.55.0" - "@typescript-eslint/types" "^8.55.0" - debug "^4.4.3" - -"@typescript-eslint/scope-manager@8.55.0": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.55.0.tgz#8a0752c31c788651840dc98f840b0c2ebe143b8c" - integrity sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q== - dependencies: - "@typescript-eslint/types" "8.55.0" - "@typescript-eslint/visitor-keys" "8.55.0" - -"@typescript-eslint/tsconfig-utils@8.55.0", "@typescript-eslint/tsconfig-utils@^8.55.0": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.55.0.tgz#62f1d005419985e09d37a040b2f1450e4e805afa" - integrity sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q== - -"@typescript-eslint/type-utils@8.55.0", "@typescript-eslint/type-utils@^8.0.0": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.55.0.tgz#195d854b3e56308ce475fdea2165313bb1190200" - integrity sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g== - dependencies: - "@typescript-eslint/types" "8.55.0" - "@typescript-eslint/typescript-estree" "8.55.0" - "@typescript-eslint/utils" "8.55.0" - debug "^4.4.3" - ts-api-utils "^2.4.0" - -"@typescript-eslint/types@8.55.0", "@typescript-eslint/types@^8.55.0": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.55.0.tgz#8449c5a7adac61184cac92dbf6315733569708c2" - integrity sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w== - -"@typescript-eslint/typescript-estree@8.55.0": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.55.0.tgz#c83ac92c11ce79bedd984937c7780a65e7f7b2e3" - integrity sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw== - dependencies: - "@typescript-eslint/project-service" "8.55.0" - "@typescript-eslint/tsconfig-utils" "8.55.0" - "@typescript-eslint/types" "8.55.0" - "@typescript-eslint/visitor-keys" "8.55.0" - debug "^4.4.3" - minimatch "^9.0.5" - semver "^7.7.3" - tinyglobby "^0.2.15" - ts-api-utils "^2.4.0" - -"@typescript-eslint/utils@8.55.0", "@typescript-eslint/utils@^8.0.0": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.55.0.tgz#c1744d94a3901deb01f58b09d3478d811f96d619" - integrity sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow== - dependencies: - "@eslint-community/eslint-utils" "^4.9.1" - "@typescript-eslint/scope-manager" "8.55.0" - "@typescript-eslint/types" "8.55.0" - "@typescript-eslint/typescript-estree" "8.55.0" - -"@typescript-eslint/visitor-keys@8.55.0": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.55.0.tgz#3d9a40fd4e3705c63d8fae3af58988add3ed464d" - integrity sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA== - dependencies: - "@typescript-eslint/types" "8.55.0" - eslint-visitor-keys "^4.2.1" - -"@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.2.0", "@ungap/structured-clone@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" - integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== - -"@unrs/resolver-binding-android-arm-eabi@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz#9f5b04503088e6a354295e8ea8fe3cb99e43af81" - integrity sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw== - -"@unrs/resolver-binding-android-arm64@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz#7414885431bd7178b989aedc4d25cccb3865bc9f" - integrity sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g== - -"@unrs/resolver-binding-darwin-arm64@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz#b4a8556f42171fb9c9f7bac8235045e82aa0cbdf" - integrity sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g== - -"@unrs/resolver-binding-darwin-x64@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz#fd4d81257b13f4d1a083890a6a17c00de571f0dc" - integrity sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ== - -"@unrs/resolver-binding-freebsd-x64@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz#d2513084d0f37c407757e22f32bd924a78cfd99b" - integrity sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw== - -"@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz#844d2605d057488d77fab09705f2866b86164e0a" - integrity sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw== - -"@unrs/resolver-binding-linux-arm-musleabihf@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz#204892995cefb6bd1d017d52d097193bc61ddad3" - integrity sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw== - -"@unrs/resolver-binding-linux-arm64-gnu@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz#023eb0c3aac46066a10be7a3f362e7b34f3bdf9d" - integrity sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ== - -"@unrs/resolver-binding-linux-arm64-musl@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz#9e6f9abb06424e3140a60ac996139786f5d99be0" - integrity sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w== - -"@unrs/resolver-binding-linux-ppc64-gnu@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz#b111417f17c9d1b02efbec8e08398f0c5527bb44" - integrity sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA== - -"@unrs/resolver-binding-linux-riscv64-gnu@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz#92ffbf02748af3e99873945c9a8a5ead01d508a9" - integrity sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ== - -"@unrs/resolver-binding-linux-riscv64-musl@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz#0bec6f1258fc390e6b305e9ff44256cb207de165" - integrity sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew== - -"@unrs/resolver-binding-linux-s390x-gnu@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz#577843a084c5952f5906770633ccfb89dac9bc94" - integrity sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg== - -"@unrs/resolver-binding-linux-x64-gnu@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz#36fb318eebdd690f6da32ac5e0499a76fa881935" - integrity sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w== - -"@unrs/resolver-binding-linux-x64-musl@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz#bfb9af75f783f98f6a22c4244214efe4df1853d6" - integrity sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA== - -"@unrs/resolver-binding-wasm32-wasi@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz#752c359dd875684b27429500d88226d7cc72f71d" - integrity sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ== - dependencies: - "@napi-rs/wasm-runtime" "^0.2.11" - -"@unrs/resolver-binding-win32-arm64-msvc@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz#ce5735e600e4c2fbb409cd051b3b7da4a399af35" - integrity sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw== - -"@unrs/resolver-binding-win32-ia32-msvc@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz#72fc57bc7c64ec5c3de0d64ee0d1810317bc60a6" - integrity sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ== - -"@unrs/resolver-binding-win32-x64-msvc@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz#538b1e103bf8d9864e7b85cc96fa8d6fb6c40777" - integrity sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g== - -"@videojs/http-streaming@^3.17.3": - version "3.17.4" - resolved "https://registry.yarnpkg.com/@videojs/http-streaming/-/http-streaming-3.17.4.tgz#083cb53e2a19b59e5d0fbce98c1f62fe77e93ab5" - integrity sha512-XAvdG2dolBuV2Fx8bu1kjmQ2D4TonGzZH68Pgv/O9xMSFWdZtITSMFismeQLEAtMmGwze8qNJp3RgV+jStrJqg== - dependencies: - "@babel/runtime" "^7.12.5" - "@videojs/vhs-utils" "^4.1.1" - aes-decrypter "^4.0.2" - global "^4.4.0" - m3u8-parser "^7.2.0" - mpd-parser "^1.3.1" - mux.js "7.1.0" - video.js "^7 || ^8" - -"@videojs/vhs-utils@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@videojs/vhs-utils/-/vhs-utils-4.0.0.tgz#4d4dbf5d61a9fbd2da114b84ec747c3a483bc60d" - integrity sha512-xJp7Yd4jMLwje2vHCUmi8MOUU76nxiwII3z4Eg3Ucb+6rrkFVGosrXlMgGnaLjq724j3wzNElRZ71D/CKrTtxg== - dependencies: - "@babel/runtime" "^7.12.5" - global "^4.4.0" - url-toolkit "^2.2.1" - -"@videojs/vhs-utils@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@videojs/vhs-utils/-/vhs-utils-4.1.1.tgz#44226fc5993f577490b5e08951ddc083714405cc" - integrity sha512-5iLX6sR2ownbv4Mtejw6Ax+naosGvoT9kY+gcuHzANyUZZ+4NpeNdKMUhb6ag0acYej1Y7cmr/F2+4PrggMiVA== - dependencies: - "@babel/runtime" "^7.12.5" - global "^4.4.0" - -"@videojs/xhr@2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@videojs/xhr/-/xhr-2.7.0.tgz#e272af6e2b5448aeb400905a5c6f4818f6b6ad47" - integrity sha512-giab+EVRanChIupZK7gXjHy90y3nncA2phIOyG3Ne5fvpiMJzvqYwiTOnEVW2S4CoYcuKJkomat7bMXA/UoUZQ== - dependencies: - "@babel/runtime" "^7.5.5" - global "~4.4.0" - is-function "^1.0.1" - -"@vitejs/plugin-react-swc@^4.2.2": - version "4.2.3" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react-swc/-/plugin-react-swc-4.2.3.tgz#ab92c8a00aab280951a04c06d99731cb7768c964" - integrity sha512-QIluDil2prhY1gdA3GGwxZzTAmLdi8cQ2CcuMW4PB/Wu4e/1pzqrwhYWVd09LInCRlDUidQjd0B70QWbjWtLxA== - dependencies: - "@rolldown/pluginutils" "1.0.0-rc.2" - "@swc/core" "^1.15.11" - -"@vitejs/plugin-react@^5.1.2": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-5.1.4.tgz#5b477e060bf612a7394c4febacc5de33a219b0e4" - integrity sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA== - dependencies: - "@babel/core" "^7.29.0" - "@babel/plugin-transform-react-jsx-self" "^7.27.1" - "@babel/plugin-transform-react-jsx-source" "^7.27.1" - "@rolldown/pluginutils" "1.0.0-rc.3" - "@types/babel__core" "^7.20.5" - react-refresh "^0.18.0" - -"@vitest/coverage-v8@^1.0.4": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/coverage-v8/-/coverage-v8-1.6.1.tgz#47230491ec73aa288a92e36b75c1671b3f741d4e" - integrity sha512-6YeRZwuO4oTGKxD3bijok756oktHSIm3eczVVzNe3scqzuhLwltIF3S9ZL/vwOVIpURmU6SnZhziXXAfw8/Qlw== - dependencies: - "@ampproject/remapping" "^2.2.1" - "@bcoe/v8-coverage" "^0.2.3" - debug "^4.3.4" - istanbul-lib-coverage "^3.2.2" - istanbul-lib-report "^3.0.1" - istanbul-lib-source-maps "^5.0.4" - istanbul-reports "^3.1.6" - magic-string "^0.30.5" - magicast "^0.3.3" - picocolors "^1.0.0" - std-env "^3.5.0" - strip-literal "^2.0.0" - test-exclude "^6.0.0" - -"@vitest/expect@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.6.1.tgz#b90c213f587514a99ac0bf84f88cff9042b0f14d" - integrity sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog== - dependencies: - "@vitest/spy" "1.6.1" - "@vitest/utils" "1.6.1" - chai "^4.3.10" - -"@vitest/expect@3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-3.2.4.tgz#8362124cd811a5ee11c5768207b9df53d34f2433" - integrity sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig== - dependencies: - "@types/chai" "^5.2.2" - "@vitest/spy" "3.2.4" - "@vitest/utils" "3.2.4" - chai "^5.2.0" - tinyrainbow "^2.0.0" - -"@vitest/pretty-format@3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-3.2.4.tgz#3c102f79e82b204a26c7a5921bf47d534919d3b4" - integrity sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA== - dependencies: - tinyrainbow "^2.0.0" - -"@vitest/runner@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.6.1.tgz#10f5857c3e376218d58c2bfacfea1161e27e117f" - integrity sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA== - dependencies: - "@vitest/utils" "1.6.1" - p-limit "^5.0.0" - pathe "^1.1.1" - -"@vitest/snapshot@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.6.1.tgz#90414451a634bb36cd539ccb29ae0d048a8c0479" - integrity sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ== - dependencies: - magic-string "^0.30.5" - pathe "^1.1.1" - pretty-format "^29.7.0" - -"@vitest/spy@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.6.1.tgz#33376be38a5ed1ecd829eb986edaecc3e798c95d" - integrity sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw== - dependencies: - tinyspy "^2.2.0" - -"@vitest/spy@3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-3.2.4.tgz#cc18f26f40f3f028da6620046881f4e4518c2599" - integrity sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw== - dependencies: - tinyspy "^4.0.3" - -"@vitest/ui@^1.3.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/ui/-/ui-1.6.1.tgz#e94c42af392ddb47531b2401d8871bc246f1947e" - integrity sha512-xa57bCPGuzEFqGjPs3vVLyqareG8DX0uMkr5U/v5vLv5/ZUrBrPL7gzxzTJedEyZxFMfsozwTIbbYfEQVo3kgg== - dependencies: - "@vitest/utils" "1.6.1" - fast-glob "^3.3.2" - fflate "^0.8.1" - flatted "^3.2.9" - pathe "^1.1.1" - picocolors "^1.0.0" - sirv "^2.0.4" - -"@vitest/utils@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.6.1.tgz#6d2f36cb6d866f2bbf59da854a324d6bf8040f17" - integrity sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g== - dependencies: - diff-sequences "^29.6.3" - estree-walker "^3.0.3" - loupe "^2.3.7" - pretty-format "^29.7.0" - -"@vitest/utils@3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-3.2.4.tgz#c0813bc42d99527fb8c5b138c7a88516bca46fea" - integrity sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA== - dependencies: - "@vitest/pretty-format" "3.2.4" - loupe "^3.1.4" - tinyrainbow "^2.0.0" - -"@volar/language-core@2.4.28", "@volar/language-core@~2.4.11": - version "2.4.28" - resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-2.4.28.tgz#c21f365a91c1dffe8bd7264fd491770c8d74fef3" - integrity sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ== - dependencies: - "@volar/source-map" "2.4.28" - -"@volar/source-map@2.4.28": - version "2.4.28" - resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-2.4.28.tgz#b40254e8c96199e5f1e0796777c593c617ad270e" - integrity sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ== - -"@volar/typescript@^2.4.11": - version "2.4.28" - resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-2.4.28.tgz#83f86356e84eb101b8081a44c104f2f2ced8411f" - integrity sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw== - dependencies: - "@volar/language-core" "2.4.28" - path-browserify "^1.0.1" - vscode-uri "^3.0.8" - -"@vonage/accounts@1.18.1": - version "1.18.1" - resolved "https://registry.yarnpkg.com/@vonage/accounts/-/accounts-1.18.1.tgz#7c32320b5587367d560d69279222f2c909c259a0" - integrity sha512-3pvmsBRh2ELjyV09AJSVcXEH+kEzLAI1k5a9lofak4wBVGSIB3XyFSNGak2V1GqWfgK6om8K5D6rZB2MFbUFmw== - dependencies: - "@vonage/server-client" "1.18.1" - -"@vonage/applications@1.18.1": - version "1.18.1" - resolved "https://registry.yarnpkg.com/@vonage/applications/-/applications-1.18.1.tgz#b7c0f6c02d20b1037fa80104d4213ec48b029725" - integrity sha512-UKRvXJRnF9hU4GBEzK8C0DTwI7T07wQFS+ByVmK5ut3jJfDkHX3dEvXxc1xlDhFl2WaE5GkuF83KcniJvMpTbg== - dependencies: - "@vonage/server-client" "1.18.1" - -"@vonage/auth@1.13.1": - version "1.13.1" - resolved "https://registry.yarnpkg.com/@vonage/auth/-/auth-1.13.1.tgz#f622e25b24602a133a2986473188881f67f8577f" - integrity sha512-zQT0hb97d3zx3UOnkf47b5MKiluT0m60lExJepC7qi0gUQwKqMCBspth3QU9YbxoR2WANVziTrHbesxo9u/kCQ== - dependencies: - "@vonage/jwt" "1.12.1" - debug "4.4.1" - -"@vonage/auth@^1.13.1": - version "1.14.0" - resolved "https://registry.yarnpkg.com/@vonage/auth/-/auth-1.14.0.tgz#9850936c1f674bd23eead28d8b72a6a7674f4ccc" - integrity sha512-MlUoeyE9GN8elQIYR9MumECPiQ3SeO6xrWCCuc1Bphx7qbJgImoCPCzAH/RUNVP9FbVDQzI6qBoYAAWuu4OSaA== - dependencies: - "@vonage/jwt" "1.13.0" - debug "4.4.3" - -"@vonage/client-sdk-video@2.32.1": - version "2.32.1" - resolved "https://registry.yarnpkg.com/@vonage/client-sdk-video/-/client-sdk-video-2.32.1.tgz#08aa4ea559648bdbdc69259194cfd1298565fa05" - integrity sha512-ko0KRVMbhIHNUR/WgskOD6H3stz702pq2yDeRZf9STNb4srp4MADb7KgleoHeLMNxxFU+ipDMr49xmygZn9rhA== - -"@vonage/conversations@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@vonage/conversations/-/conversations-1.12.1.tgz#a737b94fea58a8a0be3d05707442ab7b11a505ac" - integrity sha512-UBk/gV0oQaamMO7+yMdxbZqlfDfmybdxba9PkYOliPUReqRV6AWa5KGN9aAYOibV467chzOtgRMsVTeEnkROWA== - dependencies: - "@vonage/messages" "1.22.1" - "@vonage/server-client" "1.18.1" - "@vonage/users" "1.12.1" - "@vonage/voice" "1.19.1" - -"@vonage/jwt@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@vonage/jwt/-/jwt-1.11.0.tgz#491b82cd34d292fc180536fc3da9e5d86bad47fb" - integrity sha512-P9KM6QYBBkW8ruC+HeOxFGVQh123KCqgVuGyWjp+VjD64WikYAfT73N5isP4rQob0umpMDjGKNOIAYsVAaRdnA== - dependencies: - debug "^4.3.4" - jsonwebtoken "^9.0.2" - uuid "^9.0.1" - -"@vonage/jwt@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@vonage/jwt/-/jwt-1.12.1.tgz#507d880f409eb169970337515bf74ea41321d341" - integrity sha512-WJuGXpvjTNYOEgy/kUcAqklFchcpPToQAmsOD4+ZkbuRg06Spf5VWMT0DtILaGWQ12n6tF8eHWKeojELY9mjoA== - dependencies: - debug "4.3.4" - jsonwebtoken "9.0.2" - uuid "9.0.1" - -"@vonage/jwt@1.13.0": - version "1.13.0" - resolved "https://registry.yarnpkg.com/@vonage/jwt/-/jwt-1.13.0.tgz#75a9446b11bd0b3820cc3404a3cfae5203df58ab" - integrity sha512-LmmsW4u8LaxnMIeO94k0RLCZ5y7J2hBV4uf3lqp9GaU2SRq115kOJFynulXyFDpAFHfLd8aO7P5c/BMGNvHvrw== - dependencies: - debug "4.4.3" - jsonwebtoken "9.0.3" - uuid "13.0.0" - -"@vonage/messages@1.22.1": - version "1.22.1" - resolved "https://registry.yarnpkg.com/@vonage/messages/-/messages-1.22.1.tgz#f6849b09aaa11827685bd5bca1fe1cd948f1ab9f" - integrity sha512-aaBmaoylcl5MFUgUNgzfJrvGCoJdBcNXGrBbtlDKu4yRc6TozevmVD3IcRgq/mrIT/PKAg5dVO+KUkt48Ae0gA== - dependencies: - "@vonage/server-client" "1.18.1" - "@vonage/vetch" "1.9.1" - debug "4.4.1" - -"@vonage/number-insights@1.18.1": - version "1.18.1" - resolved "https://registry.yarnpkg.com/@vonage/number-insights/-/number-insights-1.18.1.tgz#4c2328f4d1700d8e9152cab5e2ad8956a20f34ef" - integrity sha512-+7zfdEA5jRrVKSXFS6pyDPGGV1AyvG0Y/Is+PjtLnj9sEulm2DVgltWw8A179FRmPbBa/mQyo+K6zZc02WJEtA== - dependencies: - "@vonage/auth" "1.13.1" - "@vonage/server-client" "1.18.1" - "@vonage/vetch" "1.9.1" - -"@vonage/numbers@1.20.1": - version "1.20.1" - resolved "https://registry.yarnpkg.com/@vonage/numbers/-/numbers-1.20.1.tgz#4120af41fd1e4920de5a3283bbe92f3cf469a86b" - integrity sha512-W4tRnaS3nh45th3mB0I91J7vXi8ByVKG7Grgkpldh3pthOW1OMvPSmANNgjq1K6Nf6T37plg41C17xWU4Pq8iw== - dependencies: - "@types/lodash.omit" "4.5.9" - "@vonage/auth" "1.13.1" - "@vonage/server-client" "1.18.1" - "@vonage/vetch" "1.9.1" - lodash.omit "4.5.0" - -"@vonage/pricing@1.18.1": - version "1.18.1" - resolved "https://registry.yarnpkg.com/@vonage/pricing/-/pricing-1.18.1.tgz#226699e78ba73654f5fc5eb219cac959d3d30eda" - integrity sha512-oJtJ0z5XKFeJxDfwmYXWFDu5Yn+HrwWU+vvaTJTDnwb8TK54E5I6pU4TwVJQ7fqgDamBWq4WvILmMdKC9yWOHw== - dependencies: - "@vonage/auth" "1.13.1" - "@vonage/server-client" "1.18.1" - "@vonage/vetch" "1.9.1" - -"@vonage/redact@1.17.1": - version "1.17.1" - resolved "https://registry.yarnpkg.com/@vonage/redact/-/redact-1.17.1.tgz#545005c75b38537b7cc2920f27bb11bf19d01d13" - integrity sha512-QSg4CFnpPqcg+Z54EsXb6Q8wGSphKzBrEci8/G/3xX9LTDN7o/dZU/NEbFVZU41+6D1Ap5OJZi1Rai301lpoXA== - dependencies: - "@vonage/server-client" "1.18.1" - -"@vonage/server-client@1.18.1": - version "1.18.1" - resolved "https://registry.yarnpkg.com/@vonage/server-client/-/server-client-1.18.1.tgz#9fa4a6b107381392d4e4c71fb778ec644038222a" - integrity sha512-HLOT4QoVpwsxIYAB/5tN6y8yh3AVPcqoITby3Lz/AR5tNViiTNS1X6S25+EiBg8b3tUklPddIhtbHTEVDmA+gQ== - dependencies: - "@vonage/auth" "1.13.1" - "@vonage/vetch" "1.9.1" - debug "4.4.1" - lodash.camelcase "4.3.0" - lodash.isobject "3.0.2" - lodash.kebabcase "4.1.1" - lodash.snakecase "4.1.1" - node-fetch "2.7.0" - -"@vonage/server-sdk@3.25.1": - version "3.25.1" - resolved "https://registry.yarnpkg.com/@vonage/server-sdk/-/server-sdk-3.25.1.tgz#45d0cf5c91c89ca9f0c22eb140ed20a585159134" - integrity sha512-8aDGQhLhM+m6A9+3ME+QoJ/NQLccQFHTwrreXatXGx51snSFP4olkngS2fRdWlApU0oqPQUaH65dGb5xPRIsNg== - dependencies: - "@vonage/accounts" "1.18.1" - "@vonage/applications" "1.18.1" - "@vonage/auth" "1.13.1" - "@vonage/conversations" "1.12.1" - "@vonage/messages" "1.22.1" - "@vonage/number-insights" "1.18.1" - "@vonage/numbers" "1.20.1" - "@vonage/pricing" "1.18.1" - "@vonage/redact" "1.17.1" - "@vonage/server-client" "1.18.1" - "@vonage/sms" "1.19.1" - "@vonage/users" "1.12.1" - "@vonage/verify" "1.18.1" - "@vonage/verify2" "1.17.1" - "@vonage/video" "1.26.1" - "@vonage/voice" "1.19.1" - -"@vonage/sms@1.19.1": - version "1.19.1" - resolved "https://registry.yarnpkg.com/@vonage/sms/-/sms-1.19.1.tgz#649b81f79782d9aae764cff8b8128be72184fd4d" - integrity sha512-Jrry3LP/k1I9LtUZdmOgs6pa6kdffuUbYh98xKDtw1W5YUu5rsceeV64LxwcAorO7ughqmQdq9+63BKnGZzLTA== - dependencies: - "@vonage/auth" "1.13.1" - "@vonage/server-client" "1.18.1" - -"@vonage/users@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@vonage/users/-/users-1.12.1.tgz#be9a66f5ec1633b81a0b3d25b0b5c7cf6045eb08" - integrity sha512-V4aCG2n1LnynAM0iR/wZtsB28Ze2ag/bp9G/DbgOjCmsIm460/UEuMfk1zyFWvgNmydLBVjxqmB7vAoe/XLV4w== - dependencies: - "@vonage/server-client" "1.18.1" - -"@vonage/vcr-sdk@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@vonage/vcr-sdk/-/vcr-sdk-1.3.0.tgz#9b2381ac6211a6be6b417d46f9efa4c1689f213f" - integrity sha512-drkttjmq4EBI4fNx1Qh4bK3sk04982clk6p+Pjg/XmEgNmF9ivWHt0hWjHqXYQDsqO2UgR10a90HA510o9LcUg== - dependencies: - agentkeepalive "^4.2.1" - axios "^1.2.1" - express "^4.17.2" - form-data "^4.0.0" - glob "^10.3.3" - jsonwebtoken "^9.0.0" - uuid "^8.3.2" - -"@vonage/verify2@1.17.1": - version "1.17.1" - resolved "https://registry.yarnpkg.com/@vonage/verify2/-/verify2-1.17.1.tgz#acfb660af79302f3ca2b8bf931437844eb05ed49" - integrity sha512-ctIvl/z4OsF6LaAyFBJodDJ6yYDlp+oHhGvZkKlp3Vlgowfyc/CSp2yrznY3Z7Kfpmp8rv7Qztur+SyXE7VziQ== - dependencies: - "@vonage/server-client" "1.18.1" - -"@vonage/verify@1.18.1": - version "1.18.1" - resolved "https://registry.yarnpkg.com/@vonage/verify/-/verify-1.18.1.tgz#cc896af2dafceed3e68432729f67c027e2ffbe08" - integrity sha512-7ydzRgeQSlZHr67FucuimD+rtGjvd3H5IFyuZKZwS3j6i3LcnH6BeXZjET5si6RLtopl5k8NsgCEYPOiM9YgxA== - dependencies: - "@types/lodash.omit" "4.5.9" - "@vonage/auth" "1.13.1" - "@vonage/server-client" "1.18.1" - "@vonage/vetch" "1.9.1" - lodash.omit "4.5.0" - -"@vonage/vetch@1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@vonage/vetch/-/vetch-1.9.1.tgz#cf1c4b338becbf2b620bf54497360f47c337c754" - integrity sha512-e8yzt0R4AU2d8iS+8J+bgQtz/y0AkGena9I58Dpi4e/0nN9UMMwfMxXx4s7IBwtHakWB38byouZpoV17ZSNXSQ== - dependencies: - "@types/node-fetch" "2.6.11" - node-fetch "2.7.0" - -"@vonage/video-client-network-test@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@vonage/video-client-network-test/-/video-client-network-test-5.0.0.tgz#c5d0a19f227c056bfed0fc747ea5d646c868ab5a" - integrity sha512-c+/thVawDDqJoih2kbc5y5oY8WgPbtrlkxvzgWSzoUroePPgB81htZHaN7ytk59YfrJ1WZC7BcAxCjdFm+2zWA== - dependencies: - axios "^1.8.3" - opentok-solutions-logging "^1.1.1" - promise "^8.0.1" - -"@vonage/video@1.26.1": - version "1.26.1" - resolved "https://registry.yarnpkg.com/@vonage/video/-/video-1.26.1.tgz#c20e8810bd9f2452e4e792cd478dd396d049647e" - integrity sha512-N+zgfjfZD3MWaKrTkYrpFzp7ouBUqTKoJauLkojat+z3kuKZj62PEBZ0fFMUKZVp78HnJ5nzW8foFvxA3b4mJg== - dependencies: - "@vonage/auth" "1.13.1" - "@vonage/jwt" "1.12.1" - "@vonage/server-client" "1.18.1" - "@vonage/vetch" "1.9.1" - -"@vonage/vivid@^5.15.1": - version "5.15.1" - resolved "https://registry.yarnpkg.com/@vonage/vivid/-/vivid-5.15.1.tgz#6aa3294ac14ba30e1fc131b836b2024ee4b8843c" - integrity sha512-i4QxDhWIqNsw7DB0A9A6ZdNv8D3QZ3l2MF210pqjWC/lN/PFYBKcBS70dungGPGoYd0USXmsgCRI4QgVDS7S3Q== - dependencies: - "@floating-ui/dom" "^1.7.6" - "@microsoft/fast-element" "2.8.3" - "@microsoft/fast-web-utilities" "^6.0.0" - date-fns "^3.0.0" - dompurify "^3.3.1" - prosemirror-commands "^1.7.1" - prosemirror-dropcursor "^1.8.2" - prosemirror-gapcursor "^1.3.2" - prosemirror-history "^1.4.1" - prosemirror-inputrules "^1.4.0" - prosemirror-keymap "^1.2.3" - prosemirror-model "^1.25.4" - prosemirror-schema-basic "^1.2.3" - prosemirror-state "^1.4.4" - prosemirror-transform "^1.11.0" - prosemirror-view "^1.41.6" - ramda "^0.32.0" - uuid "^11.1.0" - vanilla-colorful "^0.7.2" - video.js "^8.23.7" - -"@vonage/voice@1.19.1": - version "1.19.1" - resolved "https://registry.yarnpkg.com/@vonage/voice/-/voice-1.19.1.tgz#ea54ddb9fa461dc5104cf0aa4de4c23c461a9a5e" - integrity sha512-tdFMsJYxNrJbh0e+U5gwVPI8puy3zXmxqdR4F6wXDWFoyYSe9gvRsSmvM9ALYIlCn3N/bTgHLyMXKVBra7kX9A== - dependencies: - "@types/debug" "4.1.12" - "@vonage/server-client" "1.18.1" - "@vonage/vetch" "1.9.1" - debug "4.4.1" - ts-xor "1.3.0" - -"@vue/compiler-core@3.5.28": - version "3.5.28" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.28.tgz#8298ab91d34b2c0d7d398384cd840471919e7e34" - integrity sha512-kviccYxTgoE8n6OCw96BNdYlBg2GOWfBuOW4Vqwrt7mSKWKwFVvI8egdTltqRgITGPsTFYtKYfxIG8ptX2PJHQ== - dependencies: - "@babel/parser" "^7.29.0" - "@vue/shared" "3.5.28" - entities "^7.0.1" - estree-walker "^2.0.2" - source-map-js "^1.2.1" - -"@vue/compiler-dom@^3.5.0": - version "3.5.28" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.28.tgz#4e27b885898f4799d95305dfc56d14c2dcf8e5ba" - integrity sha512-/1ZepxAb159jKR1btkefDP+J2xuWL5V3WtleRmxaT+K2Aqiek/Ab/+Ebrw2pPj0sdHO8ViAyyJWfhXXOP/+LQA== - dependencies: - "@vue/compiler-core" "3.5.28" - "@vue/shared" "3.5.28" - -"@vue/compiler-vue2@^2.7.16": - version "2.7.16" - resolved "https://registry.yarnpkg.com/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz#2ba837cbd3f1b33c2bc865fbe1a3b53fb611e249" - integrity sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A== - dependencies: - de-indent "^1.0.2" - he "^1.2.0" - -"@vue/language-core@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-2.2.0.tgz#e48c54584f889f78b120ce10a050dfb316c7fcdf" - integrity sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw== - dependencies: - "@volar/language-core" "~2.4.11" - "@vue/compiler-dom" "^3.5.0" - "@vue/compiler-vue2" "^2.7.16" - "@vue/shared" "^3.5.0" - alien-signals "^0.4.9" - minimatch "^9.0.3" - muggle-string "^0.4.1" - path-browserify "^1.0.1" - -"@vue/shared@3.5.28", "@vue/shared@^3.5.0": - version "3.5.28" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.28.tgz#ed9b6785e9452621ad3ab2f2775e9cba494a9ef4" - integrity sha512-cfWa1fCGBxrvaHRhvV3Is0MgmrbSCxYTXCSCau2I0a1Xw1N1pHAvkWCiXPRAqjvToILvguNyEwjevUqAuBQWvQ== - -"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" - integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== - dependencies: - "@webassemblyjs/helper-numbers" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - -"@webassemblyjs/floating-point-hex-parser@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" - integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== - -"@webassemblyjs/helper-api-error@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" - integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== - -"@webassemblyjs/helper-buffer@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" - integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== - -"@webassemblyjs/helper-numbers@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" - integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.13.2" - "@webassemblyjs/helper-api-error" "1.13.2" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" - integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== - -"@webassemblyjs/helper-wasm-section@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" - integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/wasm-gen" "1.14.1" - -"@webassemblyjs/ieee754@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" - integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" - integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" - integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== - -"@webassemblyjs/wasm-edit@^1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" - integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/helper-wasm-section" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-opt" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - "@webassemblyjs/wast-printer" "1.14.1" - -"@webassemblyjs/wasm-gen@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" - integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wasm-opt@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" - integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - -"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" - integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-api-error" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wast-printer@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" - integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@xtuc/long" "4.2.2" - -"@webpack-cli/configtest@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-3.0.1.tgz#76ac285b9658fa642ce238c276264589aa2b6b57" - integrity sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA== - -"@webpack-cli/info@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-3.0.1.tgz#3cff37fabb7d4ecaab6a8a4757d3826cf5888c63" - integrity sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ== - -"@webpack-cli/serve@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-3.0.1.tgz#bd8b1f824d57e30faa19eb78e4c0951056f72f00" - integrity sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg== - -"@xmldom/xmldom@^0.8.3": - version "0.8.11" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.11.tgz#b79de2d67389734c57c52595f7a7305e30c2d608" - integrity sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -"@yarnpkg/lockfile@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" - integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== - -"@yarnpkg/parsers@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.2.tgz#48a1517a0f49124827f4c37c284a689c607b2f32" - integrity sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA== - dependencies: - js-yaml "^3.10.0" - tslib "^2.4.0" - -"@zkochan/js-yaml@0.0.7": - version "0.0.7" - resolved "https://registry.yarnpkg.com/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz#4b0cb785220d7c28ce0ec4d0804deb5d821eae89" - integrity sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ== - dependencies: - argparse "^2.0.1" - -abab@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -accepts@^1.3.8, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-import-phases@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz#16eb850ba99a056cb7cbfe872ffb8972e18c8bd7" - integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.3.2: - version "8.3.4" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" - integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== - dependencies: - acorn "^8.11.0" - -acorn@^8.11.0, acorn@^8.15.0, acorn@^8.5.0, acorn@^8.9.0: - version "8.15.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" - integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== - -address@^1.0.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" - integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== - -adm-zip@^0.5.10: - version "0.5.16" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.16.tgz#0b5e4c779f07dedea5805cdccb1147071d94a909" - integrity sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ== - -aes-decrypter@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/aes-decrypter/-/aes-decrypter-4.0.2.tgz#90648181c68878f54093920a3b44776ec2dc4914" - integrity sha512-lc+/9s6iJvuaRe5qDlMTpCFjnwpkeOXp8qP3oiZ5jsj1MRg+SBVUmmICrhxHvc8OELSmc+fEyyxAuppY6hrWzw== - dependencies: - "@babel/runtime" "^7.12.5" - "@videojs/vhs-utils" "^4.1.1" - global "^4.4.0" - pkcs7 "^1.0.4" - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -agentkeepalive@^4.2.1: - version "4.6.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.6.0.tgz#35f73e94b3f40bf65f105219c623ad19c136ea6a" - integrity sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ== - dependencies: - humanize-ms "^1.2.1" - -ajv-draft-04@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8" - integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw== - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-formats@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578" - integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@^8.9.0: - version "8.18.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.18.0.tgz#8864186b6738d003eb3a933172bb3833e10cefbc" - integrity sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - -ajv@~8.12.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ajv@~8.13.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" - integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== - dependencies: - fast-deep-equal "^3.1.3" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.4.1" - -alien-signals@^0.4.9: - version "0.4.14" - resolved "https://registry.yarnpkg.com/alien-signals/-/alien-signals-0.4.14.tgz#9ff8f72a272300a51692f54bd9bbbada78fbf539" - integrity sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q== - -ansi-colors@^4.1.1, ansi-colors@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" - integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0, ansi-styles@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@^3.0.3, anymatch@^3.1.3, anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7, argparse@~1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== - dependencies: - dequal "^2.0.3" - -aria-query@^5.0.0, aria-query@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" - integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== - -array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" - integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== - dependencies: - call-bound "^1.0.3" - is-array-buffer "^3.0.5" - -array-find-index@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-includes@^3.1.6, array-includes@^3.1.8, array-includes@^3.1.9: - version "3.1.9" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.9.tgz#1f0ccaa08e90cdbc3eb433210f903ad0f17c3f3a" - integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.24.0" - es-object-atoms "^1.1.1" - get-intrinsic "^1.3.0" - is-string "^1.1.1" - math-intrinsics "^1.1.0" - -array-timsort@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-timsort/-/array-timsort-1.0.3.tgz#3c9e4199e54fb2b9c3fe5976396a21614ef0d926" - integrity sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ== - -array.prototype.findlast@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" - integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.findlastindex@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz#cfa1065c81dcb64e34557c9b81d012f6a421c564" - integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.23.9" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - es-shim-unscopables "^1.1.0" - -array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" - integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-shim-unscopables "^1.0.2" - -array.prototype.flatmap@^1.3.2, array.prototype.flatmap@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" - integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-shim-unscopables "^1.0.2" - -array.prototype.tosorted@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" - integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.3" - es-errors "^1.3.0" - es-shim-unscopables "^1.0.2" - -arraybuffer.prototype.slice@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" - integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - is-array-buffer "^3.0.4" - -asap@^2.0.0, asap@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -assertion-error@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" - integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== - -ast-types-flow@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" - integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== - -ast-types@^0.16.1: - version "0.16.1" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.16.1.tgz#7a9da1617c9081bc121faafe91711b4c8bb81da2" - integrity sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg== - dependencies: - tslib "^2.0.1" - -async-function@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" - integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== - -async@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" - integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -autolinker@^4.0.0: - version "4.1.5" - resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-4.1.5.tgz#e0d45f04c41d62598bf80b809c422f732d3aafde" - integrity sha512-vEfYZPmvVOIuE567XBVCsx8SBgOYtjB2+S1iAaJ+HgH+DNjAcrHem2hmAeC9yaNGWayicv4yR+9UaJlkF3pvtw== - dependencies: - tslib "^2.8.1" - -autoprefixer@^10.4.9: - version "10.4.24" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.24.tgz#2c29595f3abd820a79976a609d0bf40eecf212fb" - integrity sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw== - dependencies: - browserslist "^4.28.1" - caniuse-lite "^1.0.30001766" - fraction.js "^5.3.4" - picocolors "^1.1.1" - postcss-value-parser "^4.2.0" - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axe-core@^4.10.0: - version "4.11.1" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.11.1.tgz#052ff9b2cbf543f5595028b583e4763b40c78ea7" - integrity sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A== - -axios@^1.12.0, axios@^1.13.5, axios@^1.2.1, axios@^1.6.3, axios@^1.8.3: - version "1.13.5" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.5.tgz#5e464688fa127e11a660a2c49441c009f6567a43" - integrity sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q== - dependencies: - follow-redirects "^1.15.11" - form-data "^4.0.5" - proxy-from-env "^1.1.0" - -axobject-query@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee" - integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== - -babel-jest@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-30.2.0.tgz#fd44a1ec9552be35ead881f7381faa7d8f3b95ac" - integrity sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw== - dependencies: - "@jest/transform" "30.2.0" - "@types/babel__core" "^7.20.5" - babel-plugin-istanbul "^7.0.1" - babel-preset-jest "30.2.0" - chalk "^4.1.2" - graceful-fs "^4.2.11" - slash "^3.0.0" - -babel-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" - integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== - dependencies: - "@jest/transform" "^29.7.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.6.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-const-enum@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-const-enum/-/babel-plugin-const-enum-1.2.0.tgz#3d25524106f68f081e187829ba736b251c289861" - integrity sha512-o1m/6iyyFnp9MRsK1dHF3bneqyf3AlM2q3A/YbgQr2pCat6B6XJVDv2TXqzfY2RYUi4mak6WAksSBPlyYGx9dg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-typescript" "^7.3.3" - "@babel/traverse" "^7.16.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-istanbul@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz#d8b518c8ea199364cf84ccc82de89740236daf92" - integrity sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.3" - istanbul-lib-instrument "^6.0.2" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz#94c250d36b43f95900f3a219241e0f4648191ce2" - integrity sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA== - dependencies: - "@types/babel__core" "^7.20.5" - -babel-plugin-jest-hoist@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" - integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-plugin-macros@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" - integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== - dependencies: - "@babel/runtime" "^7.12.5" - cosmiconfig "^7.0.0" - resolve "^1.19.0" - -babel-plugin-polyfill-corejs2@^0.4.14, babel-plugin-polyfill-corejs2@^0.4.15: - version "0.4.15" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz#808fa349686eea4741807cfaaa2aa3aa57ce120a" - integrity sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw== - dependencies: - "@babel/compat-data" "^7.28.6" - "@babel/helper-define-polyfill-provider" "^0.6.6" - semver "^6.3.1" - -babel-plugin-polyfill-corejs3@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz#bb7f6aeef7addff17f7602a08a6d19a128c30164" - integrity sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.5" - core-js-compat "^3.43.0" - -babel-plugin-polyfill-corejs3@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.0.tgz#65b06cda48d6e447e1e926681f5a247c6ae2b9cf" - integrity sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.6" - core-js-compat "^3.48.0" - -babel-plugin-polyfill-regenerator@^0.6.5, babel-plugin-polyfill-regenerator@^0.6.6: - version "0.6.6" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz#69f5dd263cab933c42fe5ea05e83443b374bd4bf" - integrity sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.6" - -babel-plugin-transform-typescript-metadata@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-typescript-metadata/-/babel-plugin-transform-typescript-metadata-0.3.2.tgz#7a327842d8c36ffe07ee1b5276434e56c297c9b7" - integrity sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -babel-preset-current-node-syntax@^1.0.0, babel-preset-current-node-syntax@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz#20730d6cdc7dda5d89401cab10ac6a32067acde6" - integrity sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-import-attributes" "^7.24.7" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - -babel-preset-jest@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz#04717843e561347781d6d7f69c81e6bcc3ed11ce" - integrity sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ== - dependencies: - babel-plugin-jest-hoist "30.2.0" - babel-preset-current-node-syntax "^1.2.0" - -babel-preset-jest@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" - integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== - dependencies: - babel-plugin-jest-hoist "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -baseline-browser-mapping@^2.9.0: - version "2.9.19" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz#3e508c43c46d961eb4d7d2e5b8d1dd0f9ee4f488" - integrity sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg== - -basic-auth@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" - integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== - dependencies: - safe-buffer "5.1.2" - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -body-parser@^1.20.3, body-parser@~1.20.3: - version "1.20.4" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.4.tgz#f8e20f4d06ca8a50a71ed329c15dccad1cdc547f" - integrity sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA== - dependencies: - bytes "~3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "~1.2.0" - http-errors "~2.0.1" - iconv-lite "~0.4.24" - on-finished "~2.4.1" - qs "~6.14.0" - raw-body "~2.5.3" - type-is "~1.6.18" - unpipe "~1.0.0" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -brace-expansion@2.0.2, brace-expansion@^1.1.7, brace-expansion@^2.0.1, brace-expansion@^5.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" - integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -browserslist@^4.24.0, browserslist@^4.28.1: - version "4.28.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.1.tgz#7f534594628c53c63101079e27e40de490456a95" - integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== - dependencies: - baseline-browser-mapping "^2.9.0" - caniuse-lite "^1.0.30001759" - electron-to-chromium "^1.5.263" - node-releases "^2.0.27" - update-browserslist-db "^1.2.0" - -bs-logger@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -btoa@1.2.1, btoa@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" - integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== - -buffer-equal-constant-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" - integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -bundle-name@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" - integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== - dependencies: - run-applescript "^7.0.0" - -bytes@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cac@^6.7.14: - version "6.7.14" - resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" - integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== - -call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" - integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - -call-bind@^1.0.7, call-bind@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" - integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== - dependencies: - call-bind-apply-helpers "^1.0.0" - es-define-property "^1.0.0" - get-intrinsic "^1.2.4" - set-function-length "^1.2.2" - -call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" - integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== - dependencies: - call-bind-apply-helpers "^1.0.2" - get-intrinsic "^1.3.0" - -callsites@^3.0.0, callsites@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0, camelcase@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001759, caniuse-lite@^1.0.30001766: - version "1.0.30001770" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001770.tgz#4dc47d3b263a50fbb243448034921e0a88591a84" - integrity sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw== - -ccount@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" - integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== - -chai@^4.3.10: - version "4.5.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" - integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.3" - deep-eql "^4.1.3" - get-func-name "^2.0.2" - loupe "^2.3.6" - pathval "^1.1.1" - type-detect "^4.1.0" - -chai@^5.2.0: - version "5.3.3" - resolved "https://registry.yarnpkg.com/chai/-/chai-5.3.3.tgz#dd3da955e270916a4bd3f625f4b919996ada7e06" - integrity sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw== - dependencies: - assertion-error "^2.0.1" - check-error "^2.1.1" - deep-eql "^5.0.1" - loupe "^3.1.0" - pathval "^2.0.0" - -chalk@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -character-entities-html4@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" - integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== - -character-entities-legacy@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" - integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== - -check-error@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" - integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== - dependencies: - get-func-name "^2.0.2" - -check-error@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.3.tgz#2427361117b70cca8dc89680ead32b157019caf5" - integrity sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA== - -chokidar@^3.5.2: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chokidar@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" - integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== - dependencies: - readdirp "^4.0.1" - -chrome-trace-event@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" - integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== - -ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -ci-info@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.4.0.tgz#7d54eff9f54b45b62401c26032696eb59c8bd18c" - integrity sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg== - -cjs-module-lexer@^1.0.0: - version "1.4.3" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz#0f79731eb8cfe1ec72acd4066efac9d61991b00d" - integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== - -cjs-module-lexer@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz#b3ca5101843389259ade7d88c77bd06ce55849ca" - integrity sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ== - -classnames@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" - integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== - -clear-module@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/clear-module/-/clear-module-4.1.2.tgz#5a58a5c9f8dccf363545ad7284cad3c887352a80" - integrity sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw== - dependencies: - parent-module "^2.0.0" - resolve-from "^5.0.0" - -cli-cursor@3.1.0, cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-spinners@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" - integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== - -cli-spinners@^2.5.0: - version "2.9.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -clsx@^2.1.0, clsx@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" - integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0, collect-v8-coverage@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz#cc1f01eb8d02298cbc9a437c74c70ab4e5210b80" - integrity sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^2.0.14: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -columnify@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" - integrity sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q== - dependencies: - strip-ansi "^6.0.1" - wcwidth "^1.0.0" - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -comma-separated-tokens@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" - integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== - -commander@11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" - integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== - -commander@^12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" - integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -comment-json@^4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-4.5.1.tgz#2da1b85d5471b6494a344ed166fed3e831d268ed" - integrity sha512-taEtr3ozUmOB7it68Jll7s0Pwm+aoiHyXKrEC8SEodL4rNpdfDLqa7PfBlrgFoCNNdR8ImL+muti5IGvktJAAg== - dependencies: - array-timsort "^1.0.3" - core-util-is "^1.0.3" - esprima "^4.0.1" - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -compare-versions@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.1.tgz#7af3cc1099ba37d244b3145a9af5201b629148a9" - integrity sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg== - -component-emitter@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" - integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== - -concat-with-sourcemaps@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" - integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg== - dependencies: - source-map "^0.6.1" - -concurrently@^9.1.2: - version "9.2.1" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-9.2.1.tgz#248ea21b95754947be2dad9c3e4b60f18ca4e44f" - integrity sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng== - dependencies: - chalk "4.1.2" - rxjs "7.8.2" - shell-quote "1.8.3" - supports-color "8.1.1" - tree-kill "1.2.2" - yargs "17.7.2" - -confbox@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" - integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== - -confbox@^0.2.2: - version "0.2.4" - resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.2.4.tgz#592e7be71f882a4a874e3c88f0ac1ef6f7da1ce5" - integrity sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ== - -confusing-browser-globals@^1.0.9: - version "1.0.11" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" - integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== - -content-disposition@~0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@^1.0.5, content-type@~1.0.4, content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -convert-source-map@^1.5.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cookie-signature@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" - integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== - -cookie-signature@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454" - integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== - -cookie@~0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" - integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== - -cookiejar@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" - integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== - -cookies@~0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.9.1.tgz#3ffed6f60bb4fb5f146feeedba50acc418af67e3" - integrity sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw== - dependencies: - depd "~2.0.0" - keygrip "~1.1.0" - -copy-webpack-plugin@^13.0.1: - version "13.0.1" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-13.0.1.tgz#fba18c22bcab3633524e1b652580ff4489eddc0d" - integrity sha512-J+YV3WfhY6W/Xf9h+J1znYuqTye2xkBUIGyTPWuBAT27qajBa5mR4f8WBmfDY3YjRftT2kqZZiLi1qf0H+UOFw== - dependencies: - glob-parent "^6.0.1" - normalize-path "^3.0.0" - schema-utils "^4.2.0" - serialize-javascript "^6.0.2" - tinyglobby "^0.2.12" - -core-js-compat@^3.43.0, core-js-compat@^3.48.0: - version "3.48.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.48.0.tgz#7efbe1fc1cbad44008190462217cc5558adaeaa6" - integrity sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q== - dependencies: - browserslist "^4.28.1" - -core-util-is@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cors@^2.8.5: - version "2.8.6" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.6.tgz#ff5dd69bd95e547503820d29aba4f8faf8dfec96" - integrity sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw== - dependencies: - object-assign "^4" - vary "^1" - -corser@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" - integrity sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ== - -cosmiconfig@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cosmiconfig@^8.1.3: - version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" - integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== - dependencies: - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - path-type "^4.0.0" - -create-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" - integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-config "^29.7.0" - jest-util "^29.7.0" - prompts "^2.0.1" - -cron-parser@^4.2.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-4.9.0.tgz#0340694af3e46a0894978c6f52a6dbb5c0f11ad5" - integrity sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q== - dependencies: - luxon "^3.2.1" - -cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.5, cross-spawn@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cspell-config-lib@9.6.4: - version "9.6.4" - resolved "https://registry.yarnpkg.com/cspell-config-lib/-/cspell-config-lib-9.6.4.tgz#ffa961f2fa7fe0457581e594bc38f6cbbc08e9fd" - integrity sha512-MecJNR9bIlcPBhyZFsXP6Q2n8qQ2IR9N9HiIz0yh0gBNVydp3LR5JITP5Ji8m7hexmZzVeoXms/dVN74XbS95g== - dependencies: - "@cspell/cspell-types" "9.6.4" - comment-json "^4.5.1" - smol-toml "^1.6.0" - yaml "^2.8.2" - -cspell-dictionary@9.6.4: - version "9.6.4" - resolved "https://registry.yarnpkg.com/cspell-dictionary/-/cspell-dictionary-9.6.4.tgz#a01e6d0defa1edcdae8d85bd2a0e724967aa232f" - integrity sha512-Ik9ZQVqV/fJfMt5X6IkC7yHGVH46/qjcqCNWwrMSwvROLM3SemNxxZoLvh0wi0GXz9WF1lHcxLJVdeKUk6QB8g== - dependencies: - "@cspell/cspell-performance-monitor" "9.6.4" - "@cspell/cspell-pipe" "9.6.4" - "@cspell/cspell-types" "9.6.4" - cspell-trie-lib "9.6.4" - fast-equals "^6.0.0" - -cspell-glob@9.6.4: - version "9.6.4" - resolved "https://registry.yarnpkg.com/cspell-glob/-/cspell-glob-9.6.4.tgz#df6d58478d1f1b0f93cf01ab0e2fe7fd5a750f80" - integrity sha512-253VrjbR8QU15h8GtpDQLX5Ti9uNSuNod2T7f8YEElQOb9I/kUXoCj3Cq4P390IC99klqSHIDxHsxd77ex19lA== - dependencies: - "@cspell/url" "9.6.4" - picomatch "^4.0.3" - -cspell-grammar@9.6.4: - version "9.6.4" - resolved "https://registry.yarnpkg.com/cspell-grammar/-/cspell-grammar-9.6.4.tgz#e57a9584fc19a4a79fcc68ddf0b09ece6bb90cf4" - integrity sha512-rvZyTB45/XSRWx7eAsrvTTAZvBTREr/2G2JWVMdqrptFyq1XReAKHhw/x1HJkNgWC9LKAK3bVQJpjLsNG37U9A== - dependencies: - "@cspell/cspell-pipe" "9.6.4" - "@cspell/cspell-types" "9.6.4" - -cspell-io@9.6.4: - version "9.6.4" - resolved "https://registry.yarnpkg.com/cspell-io/-/cspell-io-9.6.4.tgz#8c5e05539b72bf39490cc88dc20f5e85f4eb1ced" - integrity sha512-bmvJ4yn5QK2FZWTkZA4sx2qJqIi8BrUUUV7W209drSwkYjhJtXqP0RyF6Qx4Xuu2D1s0UilEtO5Jd+E9UJkQ6w== - dependencies: - "@cspell/cspell-service-bus" "9.6.4" - "@cspell/url" "9.6.4" - -cspell-lib@9.6.4: - version "9.6.4" - resolved "https://registry.yarnpkg.com/cspell-lib/-/cspell-lib-9.6.4.tgz#2a6d9930bb20d9f544ddd00017e1d31e6353d4bf" - integrity sha512-fUodKcIHTwvokuowB25XyFzBxlk73yj1QRw2por3BxDz9fAim1zAIohAPAnGuzj3LowYnTMjHLYE7RFDUSxy5A== - dependencies: - "@cspell/cspell-bundled-dicts" "9.6.4" - "@cspell/cspell-performance-monitor" "9.6.4" - "@cspell/cspell-pipe" "9.6.4" - "@cspell/cspell-resolver" "9.6.4" - "@cspell/cspell-types" "9.6.4" - "@cspell/dynamic-import" "9.6.4" - "@cspell/filetypes" "9.6.4" - "@cspell/rpc" "9.6.4" - "@cspell/strong-weak-map" "9.6.4" - "@cspell/url" "9.6.4" - clear-module "^4.1.2" - cspell-config-lib "9.6.4" - cspell-dictionary "9.6.4" - cspell-glob "9.6.4" - cspell-grammar "9.6.4" - cspell-io "9.6.4" - cspell-trie-lib "9.6.4" - env-paths "^4.0.0" - gensequence "^8.0.8" - import-fresh "^3.3.1" - resolve-from "^5.0.0" - vscode-languageserver-textdocument "^1.0.12" - vscode-uri "^3.1.0" - xdg-basedir "^5.1.0" - -cspell-trie-lib@9.6.4: - version "9.6.4" - resolved "https://registry.yarnpkg.com/cspell-trie-lib/-/cspell-trie-lib-9.6.4.tgz#9ef5726e5fe6b51e7896bd08e2c2600fae9c4d6e" - integrity sha512-JKwyRtyybbaTrixwI1OgU5Hvva2Z5zHVWl92WBa9U7KijAyiD/Ehp3T3DCYuBwGks7egw7MgWPySkXXnpme6mw== - -css-select@^5.1.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.2.2.tgz#01b6e8d163637bb2dd6c982ca4ed65863682786e" - integrity sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw== - dependencies: - boolbase "^1.0.0" - css-what "^6.1.0" - domhandler "^5.0.2" - domutils "^3.0.1" - nth-check "^2.0.1" - -css-tree@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" - integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== - dependencies: - mdn-data "2.0.30" - source-map-js "^1.0.1" - -css-tree@~2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032" - integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== - dependencies: - mdn-data "2.0.28" - source-map-js "^1.0.1" - -css-what@^6.1.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.2.2.tgz#cdcc8f9b6977719fdfbd1de7aec24abf756b9dea" - integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA== - -css.escape@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" - integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -csso@^5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" - integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== - dependencies: - css-tree "~2.2.0" - -cssstyle@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-3.0.0.tgz#17ca9c87d26eac764bb8cfd00583cff21ce0277a" - integrity sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg== - dependencies: - rrweb-cssom "^0.6.0" - -csstype@^3.0.2, csstype@^3.1.3, csstype@^3.2.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a" - integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== - -damerau-levenshtein@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - -data-urls@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-4.0.0.tgz#333a454eca6f9a5b7b0f1013ff89074c3f522dd4" - integrity sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g== - dependencies: - abab "^2.0.6" - whatwg-mimetype "^3.0.0" - whatwg-url "^12.0.0" - -data-view-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" - integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-data-view "^1.0.2" - -data-view-byte-length@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" - integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-data-view "^1.0.2" - -data-view-byte-offset@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" - integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -date-fns@^3.0.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf" - integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== - -date-format@^4.0.14: - version "4.0.14" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400" - integrity sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg== - -de-indent@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" - integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@4.4.3, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.6, debug@^4.3.7, debug@^4.4.0, debug@^4.4.1, debug@^4.4.3: - version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - -debug@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - -debug@4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== - dependencies: - ms "^2.1.3" - -debug@4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" - integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== - dependencies: - ms "^2.1.3" - -debug@^3.1.0, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debuglog@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" - integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw== - -decimal.js@^10.4.3: - version "10.6.0" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.6.0.tgz#e649a43e3ab953a72192ff5983865e509f37ed9a" - integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== - -dedent@^1.0.0, dedent@^1.6.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.7.1.tgz#364661eea3d73f3faba7089214420ec2f8f13e15" - integrity sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg== - -deep-eql@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" - integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== - dependencies: - type-detect "^4.0.0" - -deep-eql@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" - integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== - -deep-equal@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - integrity sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2, deepmerge@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -default-browser-id@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.1.tgz#f7a7ccb8f5104bf8e0f71ba3b1ccfa5eafdb21e8" - integrity sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q== - -default-browser@^5.2.1: - version "5.5.0" - resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.5.0.tgz#2792e886f2422894545947cc80e1a444496c5976" - integrity sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw== - dependencies: - bundle-name "^4.1.0" - default-browser-id "^5.0.0" - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-lazy-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" - integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== - -define-properties@^1.1.3, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== - -depd@2.0.0, depd@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -dequal@^2.0.0, dequal@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -destroy@1.2.0, destroy@^1.2.0, destroy@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-libc@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" - integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== - -detect-newline@^3.0.0, detect-newline@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -detect-port@^1.5.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.6.1.tgz#45e4073997c5f292b957cb678fb0bb8ed4250a67" - integrity sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q== - dependencies: - address "^1.0.1" - debug "4" - -devlop@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" - integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== - dependencies: - dequal "^2.0.0" - -dezalgo@^1.0.0, dezalgo@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" - integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== - dependencies: - asap "^2.0.0" - wrappy "1" - -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -diff@~8.0.2: - version "8.0.3" - resolved "https://registry.yarnpkg.com/diff/-/diff-8.0.3.tgz#c7da3d9e0e8c283bb548681f8d7174653720c2d5" - integrity sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ== - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-accessibility-api@^0.5.9: - version "0.5.16" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" - integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== - -dom-accessibility-api@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" - integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== - -dom-helpers@^5.0.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" - integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== - dependencies: - "@babel/runtime" "^7.8.7" - csstype "^3.0.2" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - -domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domexception@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" - integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== - dependencies: - webidl-conversions "^7.0.0" - -domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -dompurify@^3.3.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.3.3.tgz#680cae8af3e61320ddf3666a3bc843f7b291b2b6" - integrity sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA== - optionalDependencies: - "@types/trusted-types" "^2.0.7" - -domutils@^3.0.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" - integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dotenv-expand@~11.0.6: - version "11.0.7" - resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-11.0.7.tgz#af695aea007d6fdc84c86cd8d0ad7beb40a0bd08" - integrity sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA== - dependencies: - dotenv "^16.4.5" - -dotenv@^16.0.3, dotenv@^16.4.5: - version "16.6.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.6.1.tgz#773f0e69527a8315c7285d5ee73c4459d20a8020" - integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== - -dotenv@~16.4.5: - version "16.4.7" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26" - integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ== - -dunder-proto@^1.0.0, dunder-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -easy-cancelable-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/easy-cancelable-promise/-/easy-cancelable-promise-2.0.1.tgz#38aa20d82613387bb04eafe2850f219c24488793" - integrity sha512-z9nWwEMh3oGkCO2KNlTRxJFyQRJDLvu7sdDr0dka8lR69a43z3l1zJMS8nGEgWThIethC9EScF0XIzYkDDWDEw== - -ecdsa-sig-formatter@1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" - integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== - dependencies: - safe-buffer "^5.0.1" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -ejs@^3.1.7: - version "3.1.10" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" - integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== - dependencies: - jake "^10.8.5" - -electron-to-chromium@^1.5.263: - version "1.5.286" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz#142be1ab5e1cd5044954db0e5898f60a4960384e" - integrity sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emoji-regex-xs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz#e8af22e5d9dbd7f7f22d280af3d19d2aab5b0724" - integrity sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -empathic@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/empathic/-/empathic-2.0.0.tgz#71d3c2b94fad49532ef98a6c34be0386659f6131" - integrity sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA== - -encodeurl@^2.0.0, encodeurl@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" - integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== - -encoding@^0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -end-of-stream@^1.4.1: - version "1.4.5" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" - integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.0.0, enhanced-resolve@^5.18.1, enhanced-resolve@^5.18.3, enhanced-resolve@^5.19.0: - version "5.19.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz#6687446a15e969eaa63c2fa2694510e17ae6d97c" - integrity sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.3.0" - -enquirer@~2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - -entities@^4.2.0, entities@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -entities@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-6.0.1.tgz#c28c34a43379ca7f61d074130b2f5f7020a30694" - integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== - -entities@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-7.0.1.tgz#26e8a88889db63417dcb9a1e79a3f1bc92b5976b" - integrity sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA== - -env-paths@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-4.0.0.tgz#d0bb1f84a81d2542581bf7b7e8085d0683b39097" - integrity sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw== - dependencies: - is-safe-filename "^0.1.0" - -envinfo@^7.14.0: - version "7.21.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.21.0.tgz#04a251be79f92548541f37d13c8b6f22940c3bae" - integrity sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow== - -error-ex@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.4.tgz#b3a8d8bb6f92eecc1629e3e27d3c8607a8a32414" - integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9, es-abstract@^1.24.0, es-abstract@^1.24.1: - version "1.24.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.1.tgz#f0c131ed5ea1bb2411134a8dd94def09c46c7899" - integrity sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw== - dependencies: - array-buffer-byte-length "^1.0.2" - arraybuffer.prototype.slice "^1.0.4" - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - call-bound "^1.0.4" - data-view-buffer "^1.0.2" - data-view-byte-length "^1.0.2" - data-view-byte-offset "^1.0.1" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - es-set-tostringtag "^2.1.0" - es-to-primitive "^1.3.0" - function.prototype.name "^1.1.8" - get-intrinsic "^1.3.0" - get-proto "^1.0.1" - get-symbol-description "^1.1.0" - globalthis "^1.0.4" - gopd "^1.2.0" - has-property-descriptors "^1.0.2" - has-proto "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - internal-slot "^1.1.0" - is-array-buffer "^3.0.5" - is-callable "^1.2.7" - is-data-view "^1.0.2" - is-negative-zero "^2.0.3" - is-regex "^1.2.1" - is-set "^2.0.3" - is-shared-array-buffer "^1.0.4" - is-string "^1.1.1" - is-typed-array "^1.1.15" - is-weakref "^1.1.1" - math-intrinsics "^1.1.0" - object-inspect "^1.13.4" - object-keys "^1.1.1" - object.assign "^4.1.7" - own-keys "^1.0.1" - regexp.prototype.flags "^1.5.4" - safe-array-concat "^1.1.3" - safe-push-apply "^1.0.0" - safe-regex-test "^1.1.0" - set-proto "^1.0.0" - stop-iteration-iterator "^1.1.0" - string.prototype.trim "^1.2.10" - string.prototype.trimend "^1.0.9" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.3" - typed-array-byte-length "^1.0.3" - typed-array-byte-offset "^1.0.4" - typed-array-length "^1.0.7" - unbox-primitive "^1.1.0" - which-typed-array "^1.1.19" - -es-define-property@^1.0.0, es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-iterator-helpers@^1.1.0, es-iterator-helpers@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz#d979a9f686e2b0b72f88dbead7229924544720bc" - integrity sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.24.1" - es-errors "^1.3.0" - es-set-tostringtag "^2.1.0" - function-bind "^1.1.2" - get-intrinsic "^1.3.0" - globalthis "^1.0.4" - gopd "^1.2.0" - has-property-descriptors "^1.0.2" - has-proto "^1.2.0" - has-symbols "^1.1.0" - internal-slot "^1.1.0" - iterator.prototype "^1.1.5" - safe-array-concat "^1.1.3" - -es-module-lexer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-2.0.0.tgz#f657cd7a9448dcdda9c070a3cb75e5dc1e85f5b1" - integrity sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw== - -es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" - integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" - integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== - dependencies: - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" - integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== - dependencies: - hasown "^2.0.2" - -es-to-primitive@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" - integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== - dependencies: - is-callable "^1.2.7" - is-date-object "^1.0.5" - is-symbol "^1.0.4" - -"esbuild@^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0", esbuild@~0.27.0: - version "0.27.3" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.27.3.tgz#5859ca8e70a3af956b26895ce4954d7e73bd27a8" - integrity sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg== - optionalDependencies: - "@esbuild/aix-ppc64" "0.27.3" - "@esbuild/android-arm" "0.27.3" - "@esbuild/android-arm64" "0.27.3" - "@esbuild/android-x64" "0.27.3" - "@esbuild/darwin-arm64" "0.27.3" - "@esbuild/darwin-x64" "0.27.3" - "@esbuild/freebsd-arm64" "0.27.3" - "@esbuild/freebsd-x64" "0.27.3" - "@esbuild/linux-arm" "0.27.3" - "@esbuild/linux-arm64" "0.27.3" - "@esbuild/linux-ia32" "0.27.3" - "@esbuild/linux-loong64" "0.27.3" - "@esbuild/linux-mips64el" "0.27.3" - "@esbuild/linux-ppc64" "0.27.3" - "@esbuild/linux-riscv64" "0.27.3" - "@esbuild/linux-s390x" "0.27.3" - "@esbuild/linux-x64" "0.27.3" - "@esbuild/netbsd-arm64" "0.27.3" - "@esbuild/netbsd-x64" "0.27.3" - "@esbuild/openbsd-arm64" "0.27.3" - "@esbuild/openbsd-x64" "0.27.3" - "@esbuild/openharmony-arm64" "0.27.3" - "@esbuild/sunos-x64" "0.27.3" - "@esbuild/win32-arm64" "0.27.3" - "@esbuild/win32-ia32" "0.27.3" - "@esbuild/win32-x64" "0.27.3" - -esbuild@^0.21.3: - version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - -escalade@^3.1.1, escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-html@^1.0.3, escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-prettier@^10.1.8: - version "10.1.8" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz#15734ce4af8c2778cc32f0b01b37b0b5cd1ecb97" - integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== - -eslint-import-context@^0.1.8: - version "0.1.9" - resolved "https://registry.yarnpkg.com/eslint-import-context/-/eslint-import-context-0.1.9.tgz#967b0b2f0a90ef4b689125e088f790f0b7756dbe" - integrity sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg== - dependencies: - get-tsconfig "^4.10.1" - stable-hash-x "^0.2.0" - -eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-import-resolver-typescript@^4.4.4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.4.tgz#3e83a9c25f4a053fe20e1b07b47e04e8519a8720" - integrity sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw== - dependencies: - debug "^4.4.1" - eslint-import-context "^0.1.8" - get-tsconfig "^4.10.1" - is-bun-module "^2.0.0" - stable-hash-x "^0.2.0" - tinyglobby "^0.2.14" - unrs-resolver "^1.7.11" - -eslint-module-utils@^2.12.1: - version "2.12.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz#f76d3220bfb83c057651359295ab5854eaad75ff" - integrity sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw== - dependencies: - debug "^3.2.7" - -eslint-plugin-filename-rules@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-filename-rules/-/eslint-plugin-filename-rules-1.3.1.tgz#8fb769f2c19dc832b43c13d76c1442bca4a2f4a4" - integrity sha512-kBMxGFvK3QrRBHMurhFSNa+PFdszezVtBV6egg39TDzlj6D4jL3Xx6oyNjm5xE4C+TdQUBzWwymHJHBPyxOreA== - -eslint-plugin-import@^2.32.0: - version "2.32.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz#602b55faa6e4caeaa5e970c198b5c00a37708980" - integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== - dependencies: - "@rtsao/scc" "^1.1.0" - array-includes "^3.1.9" - array.prototype.findlastindex "^1.2.6" - array.prototype.flat "^1.3.3" - array.prototype.flatmap "^1.3.3" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.12.1" - hasown "^2.0.2" - is-core-module "^2.16.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.8" - object.groupby "^1.0.3" - object.values "^1.2.1" - semver "^6.3.1" - string.prototype.trimend "^1.0.9" - tsconfig-paths "^3.15.0" - -eslint-plugin-jsx-a11y@6.10.1: - version "6.10.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.1.tgz#87003835bad8875e023aa5db26f41a0c9e6a8fa9" - integrity sha512-zHByM9WTUMnfsDTafGXRiqxp6lFtNoSOWBY6FonVRn3A+BUwN1L/tdBXT40BcBJi0cZjOGTXZ0eD/rTG9fEJ0g== - dependencies: - aria-query "^5.3.2" - array-includes "^3.1.8" - array.prototype.flatmap "^1.3.2" - ast-types-flow "^0.0.8" - axe-core "^4.10.0" - axobject-query "^4.1.0" - damerau-levenshtein "^1.0.8" - emoji-regex "^9.2.2" - es-iterator-helpers "^1.1.0" - hasown "^2.0.2" - jsx-ast-utils "^3.3.5" - language-tags "^1.0.9" - minimatch "^3.1.2" - object.fromentries "^2.0.8" - safe-regex-test "^1.0.3" - string.prototype.includes "^2.0.1" - -eslint-plugin-prettier@^5.5.4: - version "5.5.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz#9eae11593faa108859c26f9a9c367d619a0769c0" - integrity sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw== - dependencies: - prettier-linter-helpers "^1.0.1" - synckit "^0.11.12" - -eslint-plugin-react-hooks@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz#66e258db58ece50723ef20cc159f8aa908219169" - integrity sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA== - dependencies: - "@babel/core" "^7.24.4" - "@babel/parser" "^7.24.4" - hermes-parser "^0.25.1" - zod "^3.25.0 || ^4.0.0" - zod-validation-error "^3.5.0 || ^4.0.0" - -eslint-plugin-react-refresh@^0.4.6: - version "0.4.26" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz#2bcdd109ea9fb4e0b56bb1b5146cf8841b21b626" - integrity sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ== - -eslint-plugin-react@^7.37.5: - version "7.37.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz#2975511472bdda1b272b34d779335c9b0e877065" - integrity sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA== - dependencies: - array-includes "^3.1.8" - array.prototype.findlast "^1.2.5" - array.prototype.flatmap "^1.3.3" - array.prototype.tosorted "^1.1.4" - doctrine "^2.1.0" - es-iterator-helpers "^1.2.1" - estraverse "^5.3.0" - hasown "^2.0.2" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.9" - object.fromentries "^2.0.8" - object.values "^1.2.1" - prop-types "^15.8.1" - resolve "^2.0.0-next.5" - semver "^6.3.1" - string.prototype.matchall "^4.0.12" - string.prototype.repeat "^1.0.0" - -eslint-plugin-tailwindcss@4.0.0-beta.0: - version "4.0.0-beta.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-tailwindcss/-/eslint-plugin-tailwindcss-4.0.0-beta.0.tgz#b46159c1db47b863a2e68d0cf95675b395e708b9" - integrity sha512-WWCajZgQu38Sd67ZCl2W6i3MRzqB0d+H8s4qV9iB6lBJbsDOIpIlj6R1Fj2FXkoWErbo05pZnZYbCGIU9o/DsA== - dependencies: - fast-glob "^3.2.5" - postcss "^8.4.4" - synckit "^0.11.4" - tailwind-api-utils "^1.0.3" - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-visitor-keys@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" - integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== - -eslint@^8: - version "8.57.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" - integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.1" - "@humanwhocodes/config-array" "^0.13.0" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.0.0, espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.0, esquery@^1.4.2, esquery@^1.5.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" - integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^2.0.1, estree-walker@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -estree-walker@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" - integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== - dependencies: - "@types/estree" "^1.0.0" - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0, events@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -execa@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - -exenv-es6@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exenv-es6/-/exenv-es6-1.1.1.tgz#80b7a8c5af24d53331f755bac07e84abb1f6de67" - integrity sha512-vlVu3N8d6yEMpMsEm+7sUBAI81aqYYuEvfK0jNqmdb/OPXzzH7QWDDnVjMvDSY47JdHEqx/dfC/q8WkfoTmpGQ== - -exit-x@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/exit-x/-/exit-x-0.2.2.tgz#1f9052de3b8d99a696b10dad5bced9bdd5c3aa64" - integrity sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ== - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== - dependencies: - homedir-polyfill "^1.0.1" - -expect@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-30.2.0.tgz#d4013bed267013c14bc1199cec8aa57cee9b5869" - integrity sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw== - dependencies: - "@jest/expect-utils" "30.2.0" - "@jest/get-type" "30.1.0" - jest-matcher-utils "30.2.0" - jest-message-util "30.2.0" - jest-mock "30.2.0" - jest-util "30.2.0" - -expect@^29.0.0, expect@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" - integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== - dependencies: - "@jest/expect-utils" "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - -express@^4.17.2, express@^4.21.2: - version "4.22.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.22.1.tgz#1de23a09745a4fffdb39247b344bb5eaff382069" - integrity sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "~1.20.3" - content-disposition "~0.5.4" - content-type "~1.0.4" - cookie "~0.7.1" - cookie-signature "~1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.3.1" - fresh "~0.5.2" - http-errors "~2.0.0" - merge-descriptors "1.0.3" - methods "~1.1.2" - on-finished "~2.4.1" - parseurl "~1.3.3" - path-to-regexp "~0.1.12" - proxy-addr "~2.0.7" - qs "~6.14.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "~0.19.0" - serve-static "~1.16.2" - setprototypeof "1.2.0" - statuses "~2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -exsolve@^1.0.7: - version "1.0.8" - resolved "https://registry.yarnpkg.com/exsolve/-/exsolve-1.0.8.tgz#7f5e34da61cd1116deda5136e62292c096f50613" - integrity sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" - integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== - -fast-equals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-6.0.0.tgz#719dedd2e126668b857b5e9d24e112e4acb2649a" - integrity sha512-PFhhIGgdM79r5Uztdj9Zb6Tt1zKafqVfdMGwVca1z5z6fbX7DmsySSuJd8HiP6I1j505DCS83cLxo5rmSNeVEA== - -fast-glob@^3.2.5, fast-glob@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" - integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.8" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-safe-stringify@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" - integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== - -fast-uri@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa" - integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== - -fastest-levenshtein@^1.0.12: - version "1.0.16" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" - integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== - -fastq@^1.6.0: - version "1.20.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675" - integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0, fb-watchman@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -fdir@^6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" - integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== - -fflate@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" - integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== - -figures@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -filelist@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" - integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== - dependencies: - minimatch "^5.0.1" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@~1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.2.tgz#1ebc2228fc7673aac4a472c310cc05b77d852b88" - integrity sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg== - dependencies: - debug "2.6.9" - encodeurl "~2.0.0" - escape-html "~1.0.3" - on-finished "~2.4.1" - parseurl "~1.3.3" - statuses "~2.0.2" - unpipe "~1.0.0" - -find-cache-dir@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-file-up@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/find-file-up/-/find-file-up-2.0.1.tgz#4932dd81551af643893f8cda7453f221e3e28261" - integrity sha512-qVdaUhYO39zmh28/JLQM5CoYN9byEOKEH4qfa8K1eNV17W0UUMJ9WgbR/hHFH+t5rcl+6RTb5UC7ck/I+uRkpQ== - dependencies: - resolve-dir "^1.0.1" - -find-pkg@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-pkg/-/find-pkg-2.0.0.tgz#3a7c35c704e11a6e5722c56e45bd7e587507735e" - integrity sha512-WgZ+nKbELDa6N3i/9nrHeNznm+lY3z4YfhDDWgW+5P0pdmMj26bxaxU11ookgY3NyP9GC7HvZ9etp0jRFqGEeQ== - dependencies: - find-file-up "^2.0.1" - -find-root@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^3.2.7, flatted@^3.2.9: - version "3.3.3" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" - integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== - -follow-redirects@^1.0.0, follow-redirects@^1.15.11: - version "1.15.11" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" - integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== - -for-each@^0.3.3, for-each@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" - integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== - dependencies: - is-callable "^1.2.7" - -foreground-child@^3.1.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" - integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== - dependencies: - cross-spawn "^7.0.6" - signal-exit "^4.0.1" - -form-data@^4.0.0, form-data@^4.0.4, form-data@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" - integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - es-set-tostringtag "^2.1.0" - hasown "^2.0.2" - mime-types "^2.1.12" - -formidable@^3.5.4: - version "3.5.4" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-3.5.4.tgz#ac9a593b951e829b3298f21aa9a2243932f32ed9" - integrity sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug== - dependencies: - "@paralleldrive/cuid2" "^2.2.2" - dezalgo "^1.0.4" - once "^1.4.0" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fraction.js@^5.3.4: - version "5.3.4" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-5.3.4.tgz#8c0fcc6a9908262df4ed197427bdeef563e0699a" - integrity sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ== - -fresh@~0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -front-matter@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-4.0.2.tgz#b14e54dc745cfd7293484f3210d15ea4edd7f4d5" - integrity sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg== - dependencies: - js-yaml "^3.13.1" - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@~11.3.0: - version "11.3.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.3.tgz#a27da23b72524e81ac6c3815cc0179b8c74c59ee" - integrity sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -fsevents@^2.3.2, fsevents@^2.3.3, fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" - integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - functions-have-names "^1.2.3" - hasown "^2.0.2" - is-callable "^1.2.7" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -generator-function@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/generator-function/-/generator-function-2.0.1.tgz#0e75dd410d1243687a0ba2e951b94eedb8f737a2" - integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g== - -generic-names@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-4.0.0.tgz#0bd8a2fd23fe8ea16cbd0a279acd69c06933d9a3" - integrity sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A== - dependencies: - loader-utils "^3.2.0" - -gensequence@^8.0.8: - version "8.0.8" - resolved "https://registry.yarnpkg.com/gensequence/-/gensequence-8.0.8.tgz#381a46bef4b1c26f6aff2b291ce9cd417d363fb1" - integrity sha512-omMVniXEXpdx/vKxGnPRoO2394Otlze28TyxECbFVyoSpZ9H3EO7lemjcB12OpQJzRW4e5tt/dL1rOxry6aMHg== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.1, get-func-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" - integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== - -get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" - integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== - dependencies: - call-bind-apply-helpers "^1.0.2" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - function-bind "^1.1.2" - get-proto "^1.0.1" - gopd "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - math-intrinsics "^1.1.0" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-proto@^1.0.0, get-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" - integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== - dependencies: - dunder-proto "^1.0.1" - es-object-atoms "^1.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - -get-symbol-description@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" - integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - -get-them-args@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/get-them-args/-/get-them-args-1.3.2.tgz#74a20ba8a4abece5ae199ad03f2bcc68fdfc9ba5" - integrity sha512-LRn8Jlk+DwZE4GTlDbT3Hikd1wSHgLMme/+7ddlqKd7ldwR6LjJgTVWzBnR01wnYGe4KgrXjg287RaI22UHmAw== - -get-tsconfig@^4.10.1, get-tsconfig@^4.7.5: - version "4.13.6" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.13.6.tgz#2fbfda558a98a691a798f123afd95915badce876" - integrity sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw== - dependencies: - resolve-pkg-maps "^1.0.0" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.1, glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^10.3.10, glob@^10.3.3: - version "10.5.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz#8ec0355919cd3338c28428a23d4f24ecc5fe738c" - integrity sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - -glob@^13.0.1: - version "13.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-13.0.3.tgz#e5c39b3e0eb8a2e2bc35e3b28e78fd0839ff9e68" - integrity sha512-/g3B0mC+4x724v1TgtBlBtt2hPi/EWptsIAmXUx9Z2rvBYleQcsrmaOzd5LyL50jf/Soi83ZDJmw2+XqvH/EeA== - dependencies: - minimatch "^10.2.0" - minipass "^7.1.2" - path-scurry "^2.0.0" - -glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^8.0.3: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - -global-directory@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" - integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== - dependencies: - ini "4.1.1" - -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -global@4.4.0, global@^4.3.1, global@^4.4.0, global@~4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globals@^15.9.0: - version "15.15.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-15.15.0.tgz#7c4761299d41c32b075715a4ce1ede7897ff72a8" - integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg== - -globalthis@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -gopd@^1.0.1, gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -handlebars@^4.7.8: - version "4.7.8" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" - integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.2" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -harmony-reflect@^1.4.6: - version "1.6.2" - resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" - integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== - -has-bigints@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" - integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" - integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== - dependencies: - dunder-proto "^1.0.0" - -has-symbols@^1.0.3, has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -hast-util-to-html@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz#ccc673a55bb8e85775b08ac28380f72d47167005" - integrity sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw== - dependencies: - "@types/hast" "^3.0.0" - "@types/unist" "^3.0.0" - ccount "^2.0.0" - comma-separated-tokens "^2.0.0" - hast-util-whitespace "^3.0.0" - html-void-elements "^3.0.0" - mdast-util-to-hast "^13.0.0" - property-information "^7.0.0" - space-separated-tokens "^2.0.0" - stringify-entities "^4.0.0" - zwitch "^2.0.4" - -hast-util-whitespace@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" - integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== - dependencies: - "@types/hast" "^3.0.0" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hermes-estree@0.25.1: - version "0.25.1" - resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.25.1.tgz#6aeec17d1983b4eabf69721f3aa3eb705b17f480" - integrity sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw== - -hermes-parser@^0.25.1: - version "0.25.1" - resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.25.1.tgz#5be0e487b2090886c62bd8a11724cd766d5f54d1" - integrity sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA== - dependencies: - hermes-estree "0.25.1" - -hoist-non-react-statics@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -html-encoding-sniffer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" - integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== - dependencies: - whatwg-encoding "^2.0.0" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -html-parse-stringify@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" - integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== - dependencies: - void-elements "3.1.0" - -html-void-elements@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" - integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== - -http-assert@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.5.0.tgz#c389ccd87ac16ed2dfa6246fd73b926aa00e6b8f" - integrity sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w== - dependencies: - deep-equal "~1.0.1" - http-errors "~1.8.0" - -http-errors@^2.0.0, http-errors@~2.0.0, http-errors@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" - integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== - dependencies: - depd "~2.0.0" - inherits "~2.0.4" - setprototypeof "~1.2.0" - statuses "~2.0.2" - toidentifier "~1.0.1" - -http-errors@~1.8.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.1" - -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== - dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" - -http-proxy-middleware@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-3.0.5.tgz#9dcde663edc44079bc5a9c63e03fe5e5d6037fab" - integrity sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg== - dependencies: - "@types/http-proxy" "^1.17.15" - debug "^4.3.6" - http-proxy "^1.18.1" - is-glob "^4.0.3" - is-plain-object "^5.0.0" - micromatch "^4.0.8" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -http-server@^14.1.0: - version "14.1.1" - resolved "https://registry.yarnpkg.com/http-server/-/http-server-14.1.1.tgz#d60fbb37d7c2fdff0f0fbff0d0ee6670bd285e2e" - integrity sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A== - dependencies: - basic-auth "^2.0.1" - chalk "^4.1.2" - corser "^2.0.1" - he "^1.2.0" - html-encoding-sniffer "^3.0.0" - http-proxy "^1.18.1" - mime "^1.6.0" - minimist "^1.2.6" - opener "^1.5.1" - portfinder "^1.0.28" - secure-compare "3.0.1" - union "~0.5.0" - url-join "^4.0.1" - -https-proxy-agent@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - -husky@^9.0.11: - version "9.1.7" - resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d" - integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA== - -i18next-browser-languagedetector@^8.2.0: - version "8.2.1" - resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.1.tgz#f17a918d376a97aa12a5b63fd8ea559a6231935b" - integrity sha512-bZg8+4bdmaOiApD7N7BPT9W8MLZG+nPTOFlLiJiT8uzKXFjhxw4v2ierCXOwB5sFDMtuA5G4kgYZ0AznZxQ/cw== - dependencies: - "@babel/runtime" "^7.23.2" - -i18next@^25.3.2: - version "25.8.8" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-25.8.8.tgz#b5fdf59a90ffda5f2cfe41725b6eb04e86a2fac8" - integrity sha512-gNTWXMBe9JBr6LAl2tqRfa6fn2EjrQJ3JBeH2jR+yIckwaJYdI7UfMQrnxzFjuFBb2FHy9Yn4gJB2BwLuC8/ZQ== - dependencies: - "@babel/runtime" "^7.28.4" - -iconv-lite@0.6.3, iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -iconv-lite@~0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -identity-obj-proxy@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" - integrity sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA== - dependencies: - harmony-reflect "^1.4.6" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== - -ignore@^5.0.4, ignore@^5.2.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -ignore@^7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" - integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== - -import-fresh@^3.2.1, import-fresh@^3.3.0, import-fresh@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" - integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-lazy@~4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" - integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== - -import-local@^3.0.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" - integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -import-meta-resolve@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz#08cb85b5bd37ecc8eb1e0f670dc2767002d43734" - integrity sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" - integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== - -ini@^1.3.4: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -internal-slot@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" - integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.2" - side-channel "^1.1.0" - -interpret@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" - integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== - -ip-regex@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" - integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" - integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - get-intrinsic "^1.2.6" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-async-function@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" - integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== - dependencies: - async-function "^1.0.0" - call-bound "^1.0.3" - get-proto "^1.0.1" - has-tostringtag "^1.0.2" - safe-regex-test "^1.1.0" - -is-bigint@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" - integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== - dependencies: - has-bigints "^1.0.2" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" - integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-bun-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-2.0.0.tgz#4d7859a87c0fcac950c95e666730e745eae8bddd" - integrity sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ== - dependencies: - semver "^7.7.1" - -is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.13.0, is-core-module@^2.16.1: - version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== - dependencies: - hasown "^2.0.2" - -is-data-view@^1.0.1, is-data-view@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" - integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== - dependencies: - call-bound "^1.0.2" - get-intrinsic "^1.2.6" - is-typed-array "^1.1.13" - -is-date-object@^1.0.5, is-date-object@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" - integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== - dependencies: - call-bound "^1.0.2" - has-tostringtag "^1.0.2" - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-finalizationregistry@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" - integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== - dependencies: - call-bound "^1.0.3" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-function@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" - integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== - -is-generator-fn@^2.0.0, is-generator-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-generator-function@^1.0.10: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.2.tgz#ae3b61e3d5ea4e4839b90bad22b02335051a17d5" - integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA== - dependencies: - call-bound "^1.0.4" - generator-function "^2.0.0" - get-proto "^1.0.1" - has-tostringtag "^1.0.2" - safe-regex-test "^1.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-map@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" - integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== - -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" - integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-plain-object@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-reference@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" - integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== - dependencies: - "@types/estree" "*" - -is-regex@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" - integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== - dependencies: - call-bound "^1.0.2" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -is-safe-filename@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-safe-filename/-/is-safe-filename-0.1.1.tgz#fb22eead097c614c47aa674de5d79a1648a53e66" - integrity sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g== - -is-set@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" - integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== - -is-shared-array-buffer@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" - integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== - dependencies: - call-bound "^1.0.3" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-string@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" - integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-symbol@^1.0.4, is-symbol@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" - integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== - dependencies: - call-bound "^1.0.2" - has-symbols "^1.1.0" - safe-regex-test "^1.1.0" - -is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" - integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== - dependencies: - which-typed-array "^1.1.16" - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-url@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" - integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== - -is-weakmap@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" - integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== - -is-weakref@^1.0.2, is-weakref@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" - integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== - dependencies: - call-bound "^1.0.3" - -is-weakset@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" - integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== - dependencies: - call-bound "^1.0.3" - get-intrinsic "^1.2.6" - -is-windows@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -is-wsl@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.1.tgz#327897b26832a3eb117da6c27492d04ca132594f" - integrity sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw== - dependencies: - is-inside-container "^1.0.0" - -is2@^2.0.6: - version "2.0.9" - resolved "https://registry.yarnpkg.com/is2/-/is2-2.0.9.tgz#ff63b441f90de343fa8fac2125ee170da8e8240d" - integrity sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g== - dependencies: - deep-is "^0.1.3" - ip-regex "^4.1.0" - is-url "^1.2.4" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -isomorphic-ws@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" - integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0, istanbul-lib-coverage@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" - integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== - -istanbul-lib-instrument@^5.0.4: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-instrument@^6.0.0, istanbul-lib-instrument@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" - integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== - dependencies: - "@babel/core" "^7.23.9" - "@babel/parser" "^7.23.9" - "@istanbuljs/schema" "^0.1.3" - istanbul-lib-coverage "^3.2.0" - semver "^7.5.4" - -istanbul-lib-report@^3.0.0, istanbul-lib-report@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" - integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^4.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-lib-source-maps@^5.0.0, istanbul-lib-source-maps@^5.0.4: - version "5.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz#acaef948df7747c8eb5fbf1265cb980f6353a441" - integrity sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A== - dependencies: - "@jridgewell/trace-mapping" "^0.3.23" - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - -istanbul-reports@^3.1.3, istanbul-reports@^3.1.6: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.2.0.tgz#cb4535162b5784aa623cee21a7252cf2c807ac93" - integrity sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -iterator.prototype@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz#12c959a29de32de0aa3bbbb801f4d777066dae39" - integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== - dependencies: - define-data-property "^1.1.4" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.6" - get-proto "^1.0.0" - has-symbols "^1.1.0" - set-function-name "^2.0.2" - -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jake@^10.8.5: - version "10.9.4" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.4.tgz#d626da108c63d5cfb00ab5c25fadc7e0084af8e6" - integrity sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA== - dependencies: - async "^3.2.6" - filelist "^1.0.4" - picocolors "^1.1.1" - -jest-changed-files@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" - integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== - dependencies: - execa "^5.0.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - -jest-circus@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-30.2.0.tgz#98b8198b958748a2f322354311023d1d02e7603f" - integrity sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg== - dependencies: - "@jest/environment" "30.2.0" - "@jest/expect" "30.2.0" - "@jest/test-result" "30.2.0" - "@jest/types" "30.2.0" - "@types/node" "*" - chalk "^4.1.2" - co "^4.6.0" - dedent "^1.6.0" - is-generator-fn "^2.1.0" - jest-each "30.2.0" - jest-matcher-utils "30.2.0" - jest-message-util "30.2.0" - jest-runtime "30.2.0" - jest-snapshot "30.2.0" - jest-util "30.2.0" - p-limit "^3.1.0" - pretty-format "30.2.0" - pure-rand "^7.0.0" - slash "^3.0.0" - stack-utils "^2.0.6" - -jest-circus@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" - integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^1.0.0" - is-generator-fn "^2.0.0" - jest-each "^29.7.0" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - pretty-format "^29.7.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" - integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== - dependencies: - "@jest/core" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - chalk "^4.0.0" - create-jest "^29.7.0" - exit "^0.1.2" - import-local "^3.0.2" - jest-config "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - yargs "^17.3.1" - -jest-config@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" - integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.7.0" - "@jest/types" "^29.6.3" - babel-jest "^29.7.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.7.0" - jest-environment-node "^29.7.0" - jest-get-type "^29.6.3" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-runner "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-config@^30.0.2: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-30.2.0.tgz#29df8c50e2ad801cc59c406b50176c18c362a90b" - integrity sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA== - dependencies: - "@babel/core" "^7.27.4" - "@jest/get-type" "30.1.0" - "@jest/pattern" "30.0.1" - "@jest/test-sequencer" "30.2.0" - "@jest/types" "30.2.0" - babel-jest "30.2.0" - chalk "^4.1.2" - ci-info "^4.2.0" - deepmerge "^4.3.1" - glob "^10.3.10" - graceful-fs "^4.2.11" - jest-circus "30.2.0" - jest-docblock "30.2.0" - jest-environment-node "30.2.0" - jest-regex-util "30.0.1" - jest-resolve "30.2.0" - jest-runner "30.2.0" - jest-util "30.2.0" - jest-validate "30.2.0" - micromatch "^4.0.8" - parse-json "^5.2.0" - pretty-format "30.2.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@30.2.0, jest-diff@^30.0.2: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-30.2.0.tgz#e3ec3a6ea5c5747f605c9e874f83d756cba36825" - integrity sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A== - dependencies: - "@jest/diff-sequences" "30.0.1" - "@jest/get-type" "30.1.0" - chalk "^4.1.2" - pretty-format "30.2.0" - -jest-diff@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-docblock@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-30.2.0.tgz#42cd98d69f887e531c7352309542b1ce4ee10256" - integrity sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA== - dependencies: - detect-newline "^3.1.0" - -jest-docblock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" - integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== - dependencies: - detect-newline "^3.0.0" - -jest-each@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-30.2.0.tgz#39e623ae71641c2ac3ee69b3ba3d258fce8e768d" - integrity sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ== - dependencies: - "@jest/get-type" "30.1.0" - "@jest/types" "30.2.0" - chalk "^4.1.2" - jest-util "30.2.0" - pretty-format "30.2.0" - -jest-each@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" - integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - jest-get-type "^29.6.3" - jest-util "^29.7.0" - pretty-format "^29.7.0" - -jest-environment-node@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-30.2.0.tgz#3def7980ebd2fd86e74efd4d2e681f55ab38da0f" - integrity sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA== - dependencies: - "@jest/environment" "30.2.0" - "@jest/fake-timers" "30.2.0" - "@jest/types" "30.2.0" - "@types/node" "*" - jest-mock "30.2.0" - jest-util "30.2.0" - jest-validate "30.2.0" - -jest-environment-node@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" - integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -jest-get-type@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== - -jest-haste-map@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-30.2.0.tgz#808e3889f288603ac70ff0ac047598345a66022e" - integrity sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw== - dependencies: - "@jest/types" "30.2.0" - "@types/node" "*" - anymatch "^3.1.3" - fb-watchman "^2.0.2" - graceful-fs "^4.2.11" - jest-regex-util "30.0.1" - jest-util "30.2.0" - jest-worker "30.2.0" - micromatch "^4.0.8" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.3" - -jest-haste-map@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" - integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== - dependencies: - "@jest/types" "^29.6.3" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - jest-worker "^29.7.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz#292fdca7b7c9cf594e1e570ace140b01d8beb736" - integrity sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ== - dependencies: - "@jest/get-type" "30.1.0" - pretty-format "30.2.0" - -jest-leak-detector@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" - integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== - dependencies: - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-matcher-utils@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz#69a0d4c271066559ec8b0d8174829adc3f23a783" - integrity sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg== - dependencies: - "@jest/get-type" "30.1.0" - chalk "^4.1.2" - jest-diff "30.2.0" - pretty-format "30.2.0" - -jest-matcher-utils@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== - dependencies: - chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-message-util@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-30.2.0.tgz#fc97bf90d11f118b31e6131e2b67fc4f39f92152" - integrity sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw== - dependencies: - "@babel/code-frame" "^7.27.1" - "@jest/types" "30.2.0" - "@types/stack-utils" "^2.0.3" - chalk "^4.1.2" - graceful-fs "^4.2.11" - micromatch "^4.0.8" - pretty-format "30.2.0" - slash "^3.0.0" - stack-utils "^2.0.6" - -jest-message-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-30.2.0.tgz#69f991614eeb4060189459d3584f710845bff45e" - integrity sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw== - dependencies: - "@jest/types" "30.2.0" - "@types/node" "*" - jest-util "30.2.0" - -jest-mock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" - integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-util "^29.7.0" - -jest-pnp-resolver@^1.2.2, jest-pnp-resolver@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@30.0.1: - version "30.0.1" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-30.0.1.tgz#f17c1de3958b67dfe485354f5a10093298f2a49b" - integrity sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA== - -jest-regex-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" - integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== - -jest-resolve-dependencies@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" - integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== - dependencies: - jest-regex-util "^29.6.3" - jest-snapshot "^29.7.0" - -jest-resolve@30.2.0, jest-resolve@^30.0.2: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-30.2.0.tgz#2e2009cbd61e8f1f003355d5ec87225412cebcd7" - integrity sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A== - dependencies: - chalk "^4.1.2" - graceful-fs "^4.2.11" - jest-haste-map "30.2.0" - jest-pnp-resolver "^1.2.3" - jest-util "30.2.0" - jest-validate "30.2.0" - slash "^3.0.0" - unrs-resolver "^1.7.11" - -jest-resolve@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" - integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.7.0" - jest-validate "^29.7.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-30.2.0.tgz#c62b4c3130afa661789705e13a07bdbcec26a114" - integrity sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ== - dependencies: - "@jest/console" "30.2.0" - "@jest/environment" "30.2.0" - "@jest/test-result" "30.2.0" - "@jest/transform" "30.2.0" - "@jest/types" "30.2.0" - "@types/node" "*" - chalk "^4.1.2" - emittery "^0.13.1" - exit-x "^0.2.2" - graceful-fs "^4.2.11" - jest-docblock "30.2.0" - jest-environment-node "30.2.0" - jest-haste-map "30.2.0" - jest-leak-detector "30.2.0" - jest-message-util "30.2.0" - jest-resolve "30.2.0" - jest-runtime "30.2.0" - jest-util "30.2.0" - jest-watcher "30.2.0" - jest-worker "30.2.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runner@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" - integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== - dependencies: - "@jest/console" "^29.7.0" - "@jest/environment" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.7.0" - jest-environment-node "^29.7.0" - jest-haste-map "^29.7.0" - jest-leak-detector "^29.7.0" - jest-message-util "^29.7.0" - jest-resolve "^29.7.0" - jest-runtime "^29.7.0" - jest-util "^29.7.0" - jest-watcher "^29.7.0" - jest-worker "^29.7.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-30.2.0.tgz#395ea792cde048db1b0cd1a92dc9cb9f1921bf8a" - integrity sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg== - dependencies: - "@jest/environment" "30.2.0" - "@jest/fake-timers" "30.2.0" - "@jest/globals" "30.2.0" - "@jest/source-map" "30.0.1" - "@jest/test-result" "30.2.0" - "@jest/transform" "30.2.0" - "@jest/types" "30.2.0" - "@types/node" "*" - chalk "^4.1.2" - cjs-module-lexer "^2.1.0" - collect-v8-coverage "^1.0.2" - glob "^10.3.10" - graceful-fs "^4.2.11" - jest-haste-map "30.2.0" - jest-message-util "30.2.0" - jest-mock "30.2.0" - jest-regex-util "30.0.1" - jest-resolve "30.2.0" - jest-snapshot "30.2.0" - jest-util "30.2.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-runtime@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" - integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/globals" "^29.7.0" - "@jest/source-map" "^29.6.3" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-30.2.0.tgz#266fbbb4b95fc4665ce6f32f1f38eeb39f4e26d0" - integrity sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA== - dependencies: - "@babel/core" "^7.27.4" - "@babel/generator" "^7.27.5" - "@babel/plugin-syntax-jsx" "^7.27.1" - "@babel/plugin-syntax-typescript" "^7.27.1" - "@babel/types" "^7.27.3" - "@jest/expect-utils" "30.2.0" - "@jest/get-type" "30.1.0" - "@jest/snapshot-utils" "30.2.0" - "@jest/transform" "30.2.0" - "@jest/types" "30.2.0" - babel-preset-current-node-syntax "^1.2.0" - chalk "^4.1.2" - expect "30.2.0" - graceful-fs "^4.2.11" - jest-diff "30.2.0" - jest-matcher-utils "30.2.0" - jest-message-util "30.2.0" - jest-util "30.2.0" - pretty-format "30.2.0" - semver "^7.7.2" - synckit "^0.11.8" - -jest-snapshot@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" - integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.7.0" - graceful-fs "^4.2.9" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - natural-compare "^1.4.0" - pretty-format "^29.7.0" - semver "^7.5.3" - -jest-util@30.2.0, jest-util@^30.0.2: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-30.2.0.tgz#5142adbcad6f4e53c2776c067a4db3c14f913705" - integrity sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA== - dependencies: - "@jest/types" "30.2.0" - "@types/node" "*" - chalk "^4.1.2" - ci-info "^4.2.0" - graceful-fs "^4.2.11" - picomatch "^4.0.2" - -jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-30.2.0.tgz#273eaaed4c0963b934b5b31e96289edda6e0a2ef" - integrity sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw== - dependencies: - "@jest/get-type" "30.1.0" - "@jest/types" "30.2.0" - camelcase "^6.3.0" - chalk "^4.1.2" - leven "^3.1.0" - pretty-format "30.2.0" - -jest-validate@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" - integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== - dependencies: - "@jest/types" "^29.6.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.6.3" - leven "^3.1.0" - pretty-format "^29.7.0" - -jest-watcher@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-30.2.0.tgz#f9c055de48e18c979e7756a3917e596e2d69b07b" - integrity sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg== - dependencies: - "@jest/test-result" "30.2.0" - "@jest/types" "30.2.0" - "@types/node" "*" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - emittery "^0.13.1" - jest-util "30.2.0" - string-length "^4.0.2" - -jest-watcher@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" - integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== - dependencies: - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.7.0" - string-length "^4.0.1" - -jest-worker@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-30.2.0.tgz#fd5c2a36ff6058ec8f74366ec89538cc99539d26" - integrity sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g== - dependencies: - "@types/node" "*" - "@ungap/structured-clone" "^1.3.0" - jest-util "30.2.0" - merge-stream "^2.0.0" - supports-color "^8.1.1" - -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest-worker@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" - integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== - dependencies: - "@types/node" "*" - jest-util "^29.7.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" - integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== - dependencies: - "@jest/core" "^29.7.0" - "@jest/types" "^29.6.3" - import-local "^3.0.2" - jest-cli "^29.7.0" - -jiti@2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.4.2.tgz#d19b7732ebb6116b06e2038da74a55366faef560" - integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A== - -jiti@^2.4.2, jiti@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.6.1.tgz#178ef2fc9a1a594248c20627cd820187a4d78d92" - integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ== - -jju@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" - integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-tokens@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.1.tgz#2ec43964658435296f6761b34e10671c2d9527f4" - integrity sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ== - -js-yaml@^3.10.0, js-yaml@^3.13.1: - version "3.14.2" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.2.tgz#77485ce1dd7f33c061fd1b16ecea23b55fcb04b0" - integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" - integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== - dependencies: - argparse "^2.0.1" - -jsdom@~22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-22.1.0.tgz#0fca6d1a37fbeb7f4aac93d1090d782c56b611c8" - integrity sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw== - dependencies: - abab "^2.0.6" - cssstyle "^3.0.0" - data-urls "^4.0.0" - decimal.js "^10.4.3" - domexception "^4.0.0" - form-data "^4.0.0" - html-encoding-sniffer "^3.0.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.1" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.4" - parse5 "^7.1.2" - rrweb-cssom "^0.6.0" - saxes "^6.0.0" - symbol-tree "^3.2.4" - tough-cookie "^4.1.2" - w3c-xmlserializer "^4.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^2.0.0" - whatwg-mimetype "^3.0.0" - whatwg-url "^12.0.1" - ws "^8.13.0" - xml-name-validator "^4.0.0" - -jsesc@^3.0.2, jsesc@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" - integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-storage-formatter@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/json-storage-formatter/-/json-storage-formatter-3.0.2.tgz#575d92d85b532c8ec91dbf6556f45df3f1e72fea" - integrity sha512-H5+2fRLur/hmHa6coYIGJX/j+8o4G0AjGQ+1mirKzdiBYw0V51T0Nyur6/WTQqNo1OsdqZxSjKYgcnnr+Z4SIw== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.2.2, json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonc-eslint-parser@^2.1.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.2.tgz#f135454fd35784ecc1b848908f0d3e98a5be9433" - integrity sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA== - dependencies: - acorn "^8.5.0" - eslint-visitor-keys "^3.0.0" - espree "^9.0.0" - semver "^7.3.5" - -jsonc-parser@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" - integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62" - integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonwebtoken@9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" - integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== - dependencies: - jws "^3.2.2" - lodash.includes "^4.3.0" - lodash.isboolean "^3.0.3" - lodash.isinteger "^4.0.4" - lodash.isnumber "^3.0.3" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.once "^4.0.0" - ms "^2.1.1" - semver "^7.5.4" - -jsonwebtoken@9.0.3, jsonwebtoken@^9.0.0, jsonwebtoken@^9.0.2: - version "9.0.3" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz#6cd57ab01e9b0ac07cb847d53d3c9b6ee31f7ae2" - integrity sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g== - dependencies: - jws "^4.0.1" - lodash.includes "^4.3.0" - lodash.isboolean "^3.0.3" - lodash.isinteger "^4.0.4" - lodash.isnumber "^3.0.3" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.once "^4.0.0" - ms "^2.1.1" - semver "^7.5.4" - -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: - version "3.3.5" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" - integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" - -jwa@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.2.tgz#16011ac6db48de7b102777e57897901520eec7b9" - integrity sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw== - dependencies: - buffer-equal-constant-time "^1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jwa@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.1.tgz#bf8176d1ad0cd72e0f3f58338595a13e110bc804" - integrity sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg== - dependencies: - buffer-equal-constant-time "^1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jws@^3.2.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.3.tgz#5ac0690b460900a27265de24520526853c0b8ca1" - integrity sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g== - dependencies: - jwa "^1.4.2" - safe-buffer "^5.0.1" - -jws@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.1.tgz#07edc1be8fac20e677b283ece261498bd38f0690" - integrity sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA== - dependencies: - jwa "^2.0.1" - safe-buffer "^5.0.1" - -keygrip@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" - integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== - dependencies: - tsscmp "1.0.6" - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kill-port@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/kill-port/-/kill-port-1.6.1.tgz#560fe79484583bdf3a5e908557dae614447618aa" - integrity sha512-un0Y55cOM7JKGaLnGja28T38tDDop0AQ8N0KlAdyh+B1nmMoX8AnNmqPNZbS3mUMgiST51DCVqmbFT1gNJpVNw== - dependencies: - get-them-args "1.3.2" - shell-exec "1.0.2" - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -koa-compose@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" - integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== - -koa@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/koa/-/koa-3.0.3.tgz#40a97b6da0c0d49a704af82db2b3e5a618ed9042" - integrity sha512-MeuwbCoN1daWS32/Ni5qkzmrOtQO2qrnfdxDHjrm6s4b59yG4nexAJ0pTEFyzjLp0pBVO80CZp0vW8Ze30Ebow== - dependencies: - accepts "^1.3.8" - content-disposition "~0.5.4" - content-type "^1.0.5" - cookies "~0.9.1" - delegates "^1.0.0" - destroy "^1.2.0" - encodeurl "^2.0.0" - escape-html "^1.0.3" - fresh "~0.5.2" - http-assert "^1.5.0" - http-errors "^2.0.0" - koa-compose "^4.1.0" - mime-types "^3.0.1" - on-finished "^2.4.1" - parseurl "^1.3.3" - statuses "^2.0.1" - type-is "^2.0.1" - vary "^1.1.2" - -kolorist@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" - integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== - -language-subtag-registry@^0.3.20: - version "0.3.23" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" - integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== - -language-tags@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" - integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== - dependencies: - language-subtag-registry "^0.3.20" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -license-checker@^25.0.1: - version "25.0.1" - resolved "https://registry.yarnpkg.com/license-checker/-/license-checker-25.0.1.tgz#4d14504478a5240a857bb3c21cd0491a00d761fa" - integrity sha512-mET5AIwl7MR2IAKYYoVBBpV0OnkKQ1xGj2IMMeEFIs42QAkEVjRtFZGWmQ28WeU7MP779iAgOaOy93Mn44mn6g== - dependencies: - chalk "^2.4.1" - debug "^3.1.0" - mkdirp "^0.5.1" - nopt "^4.0.1" - read-installed "~4.0.3" - semver "^5.5.0" - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - spdx-satisfies "^4.0.0" - treeify "^1.1.0" - -lightningcss-android-arm64@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz#6966b7024d39c94994008b548b71ab360eb3a307" - integrity sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A== - -lightningcss-darwin-arm64@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz#a5fa946d27c029e48c7ff929e6e724a7de46eb2c" - integrity sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA== - -lightningcss-darwin-x64@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz#5ce87e9cd7c4f2dcc1b713f5e8ee185c88d9b7cd" - integrity sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ== - -lightningcss-freebsd-x64@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz#6ae1d5e773c97961df5cff57b851807ef33692a5" - integrity sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA== - -lightningcss-linux-arm-gnueabihf@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz#62c489610c0424151a6121fa99d77731536cdaeb" - integrity sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA== - -lightningcss-linux-arm64-gnu@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz#2a3661b56fe95a0cafae90be026fe0590d089298" - integrity sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A== - -lightningcss-linux-arm64-musl@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz#d7ddd6b26959245e026bc1ad9eb6aa983aa90e6b" - integrity sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA== - -lightningcss-linux-x64-gnu@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz#5a89814c8e63213a5965c3d166dff83c36152b1a" - integrity sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w== - -lightningcss-linux-x64-musl@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz#808c2e91ce0bf5d0af0e867c6152e5378c049728" - integrity sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA== - -lightningcss-win32-arm64-msvc@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz#ab4a8a8a2e6a82a4531e8bbb6bf0ff161ee6625a" - integrity sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ== - -lightningcss-win32-x64-msvc@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz#f01f382c8e0a27e1c018b0bee316d210eac43b6e" - integrity sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw== - -lightningcss@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.30.2.tgz#4ade295f25d140f487d37256f4cd40dc607696d0" - integrity sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ== - dependencies: - detect-libc "^2.0.3" - optionalDependencies: - lightningcss-android-arm64 "1.30.2" - lightningcss-darwin-arm64 "1.30.2" - lightningcss-darwin-x64 "1.30.2" - lightningcss-freebsd-x64 "1.30.2" - lightningcss-linux-arm-gnueabihf "1.30.2" - lightningcss-linux-arm64-gnu "1.30.2" - lightningcss-linux-arm64-musl "1.30.2" - lightningcss-linux-x64-gnu "1.30.2" - lightningcss-linux-x64-musl "1.30.2" - lightningcss-win32-arm64-msvc "1.30.2" - lightningcss-win32-x64-msvc "1.30.2" - -lines-and-columns@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" - integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -linkify-it@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" - integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== - dependencies: - uc.micro "^2.0.0" - -loader-runner@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.1.tgz#6c76ed29b0ccce9af379208299f07f876de737e3" - integrity sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q== - -loader-utils@^3.2.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.3.1.tgz#735b9a19fd63648ca7adbd31c2327dfe281304e5" - integrity sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg== - -local-pkg@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.1.tgz#69658638d2a95287534d4c2fff757980100dbb6d" - integrity sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ== - dependencies: - mlly "^1.7.3" - pkg-types "^1.2.1" - -local-pkg@^1.0.0, local-pkg@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-1.1.2.tgz#c03d208787126445303f8161619dc701afa4abb5" - integrity sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A== - dependencies: - mlly "^1.7.4" - pkg-types "^2.3.0" - quansync "^0.2.11" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.camelcase@4.3.0, lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -lodash.clonedeepwith@4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz#6ee30573a03a1a60d670a62ef33c10cf1afdbdd4" - integrity sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA== - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.includes@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" - integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== - -lodash.isboolean@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" - integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== - -lodash.isinteger@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" - integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== - -lodash.isnumber@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" - integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== - -lodash.isobject@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" - integrity sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== - -lodash.kebabcase@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" - integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.omit@4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" - integrity sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg== - -lodash.once@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" - integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== - -lodash.snakecase@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" - integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== - -lodash@4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lodash@^4.17.11, lodash@^4.17.21, lodash@~4.17.23: - version "4.17.23" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a" - integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w== - -log-symbols@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log4js@6.9.1: - version "6.9.1" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.9.1.tgz#aba5a3ff4e7872ae34f8b4c533706753709e38b6" - integrity sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g== - dependencies: - date-format "^4.0.14" - debug "^4.3.4" - flatted "^3.2.7" - rfdc "^1.3.0" - streamroller "^3.1.5" - -long-timeout@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/long-timeout/-/long-timeout-0.1.1.tgz#9721d788b47e0bcb5a24c2e2bee1a0da55dab514" - integrity sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w== - -loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -loupe@^2.3.6, loupe@^2.3.7: - version "2.3.7" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" - integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== - dependencies: - get-func-name "^2.0.1" - -loupe@^3.1.0, loupe@^3.1.4: - version "3.2.1" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.2.1.tgz#0095cf56dc5b7a9a7c08ff5b1a8796ec8ad17e76" - integrity sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ== - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - -lru-cache@^11.0.0: - version "11.2.6" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.2.6.tgz#356bf8a29e88a7a2945507b31f6429a65a192c58" - integrity sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lunr@^2.3.9: - version "2.3.9" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" - integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== - -luxon@^3.2.1: - version "3.7.2" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.7.2.tgz#d697e48f478553cca187a0f8436aff468e3ba0ba" - integrity sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew== - -lz-string@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" - integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== - -m3u8-parser@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/m3u8-parser/-/m3u8-parser-7.2.0.tgz#9e2eb50abb8349d248cd58842367da4acabdf297" - integrity sha512-CRatFqpjVtMiMaKXxNvuI3I++vUumIXVVT/JpCpdU/FynV/ceVw1qpPyyBNindL+JlPMSesx+WX1QJaZEJSaMQ== - dependencies: - "@babel/runtime" "^7.12.5" - "@videojs/vhs-utils" "^4.1.1" - global "^4.4.0" - -magic-string@^0.30.0, magic-string@^0.30.17, magic-string@^0.30.21, magic-string@^0.30.3, magic-string@^0.30.5: - version "0.30.21" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" - integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.5" - -magicast@^0.3.3: - version "0.3.5" - resolved "https://registry.yarnpkg.com/magicast/-/magicast-0.3.5.tgz#8301c3c7d66704a0771eb1bad74274f0ec036739" - integrity sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ== - dependencies: - "@babel/parser" "^7.25.4" - "@babel/types" "^7.25.4" - source-map-js "^1.2.0" - -make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== - dependencies: - semver "^7.5.3" - -make-error@^1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -markdown-it@^14.1.0: - version "14.1.1" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.1.tgz#856f90b66fc39ae70affd25c1b18b581d7deee1f" - integrity sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA== - dependencies: - argparse "^2.0.1" - entities "^4.4.0" - linkify-it "^5.0.0" - mdurl "^2.0.0" - punycode.js "^2.3.1" - uc.micro "^2.1.0" - -math-intrinsics@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - -mdast-util-to-hast@^13.0.0: - version "13.2.1" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz#d7ff84ca499a57e2c060ae67548ad950e689a053" - integrity sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA== - dependencies: - "@types/hast" "^3.0.0" - "@types/mdast" "^4.0.0" - "@ungap/structured-clone" "^1.0.0" - devlop "^1.0.0" - micromark-util-sanitize-uri "^2.0.0" - trim-lines "^3.0.0" - unist-util-position "^5.0.0" - unist-util-visit "^5.0.0" - vfile "^6.0.0" - -mdn-data@2.0.28: - version "2.0.28" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" - integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== - -mdn-data@2.0.30: - version "2.0.30" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" - integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== - -mdurl@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" - integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -media-typer@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" - integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== - -merge-descriptors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" - integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@^1.1.2, methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromark-util-character@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz#2f987831a40d4c510ac261e89852c4e9703ccda6" - integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== - dependencies: - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-util-encode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz#0d51d1c095551cfaac368326963cf55f15f540b8" - integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== - -micromark-util-sanitize-uri@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz#ab89789b818a58752b73d6b55238621b7faa8fd7" - integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== - dependencies: - micromark-util-character "^2.0.0" - micromark-util-encode "^2.0.0" - micromark-util-symbol "^2.0.0" - -micromark-util-symbol@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz#e5da494e8eb2b071a0d08fb34f6cefec6c0a19b8" - integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== - -micromark-util-types@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz#f00225f5f5a0ebc3254f96c36b6605c4b393908e" - integrity sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA== - -micromatch@^4.0.0, micromatch@^4.0.4, micromatch@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-db@^1.54.0: - version "1.54.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" - integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== - -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime-types@^3.0.0, mime-types@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.2.tgz#39002d4182575d5af036ffa118100f2524b2e2ab" - integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== - dependencies: - mime-db "^1.54.0" - -mime@1.6.0, mime@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -min-document@^2.19.0: - version "2.19.2" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.2.tgz#f95db44639eaae3ac8ea85ae6809ae85ff7e3b81" - integrity sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A== - dependencies: - dom-walk "^0.1.0" - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -mini-svg-data-uri@^1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz#8ab0aabcdf8c29ad5693ca595af19dd2ead09939" - integrity sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg== - -minimatch@10.1.1: - version "10.1.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.1.1.tgz#e6e61b9b0c1dcab116b5a7d1458e8b6ae9e73a55" - integrity sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ== - dependencies: - "@isaacs/brace-expansion" "^5.0.0" - -minimatch@10.1.2: - version "10.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.1.2.tgz#6c3f289f9de66d628fa3feb1842804396a43d81c" - integrity sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw== - dependencies: - "@isaacs/brace-expansion" "^5.0.1" - -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^10.1.1, minimatch@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.0.tgz#e710473e66e3e1aaf376d0aa82438375cac86e9e" - integrity sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w== - dependencies: - brace-expansion "^5.0.2" - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.3, minimatch@^9.0.4, minimatch@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -mkdirp@^0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mlly@^1.7.3, mlly@^1.7.4: - version "1.8.0" - resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.8.0.tgz#e074612b938af8eba1eaf43299cbc89cb72d824e" - integrity sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g== - dependencies: - acorn "^8.15.0" - pathe "^2.0.3" - pkg-types "^1.3.1" - ufo "^1.6.1" - -mpd-parser@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mpd-parser/-/mpd-parser-1.3.1.tgz#557b6ac27411c2c177bb01e46e14440703a414a3" - integrity sha512-1FuyEWI5k2HcmhS1HkKnUAQV7yFPfXPht2DnRRGtoiiAAW+ESTbtEXIDpRkwdU+XyrQuwrIym7UkoPKsZ0SyFw== - dependencies: - "@babel/runtime" "^7.12.5" - "@videojs/vhs-utils" "^4.0.0" - "@xmldom/xmldom" "^0.8.3" - global "^4.4.0" - -mrmime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.1.tgz#bc3e87f7987853a54c9850eeb1f1078cd44adddc" - integrity sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -muggle-string@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.4.1.tgz#3b366bd43b32f809dc20659534dd30e7c8a0d328" - integrity sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ== - -mux.js@7.1.0, mux.js@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/mux.js/-/mux.js-7.1.0.tgz#aba5ed55a39cb790ef4b30b2c3ea0d2630b0264e" - integrity sha512-NTxawK/BBELJrYsZThEulyUMDVlLizKdxyAsMuzoCD1eFj97BVaA8D/CvKsKu6FOLYkFojN5CbM9h++ZTZtknA== - dependencies: - "@babel/runtime" "^7.11.2" - global "^4.4.0" - -nanoid@^3.3.11, nanoid@^3.3.8: - version "3.3.11" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" - integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== - -napi-postinstall@^0.3.0: - version "0.3.4" - resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.3.4.tgz#7af256d6588b5f8e952b9190965d6b019653bbb9" - integrity sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-fetch@2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-machine-id@1.1.12: - version "1.1.12" - resolved "https://registry.yarnpkg.com/node-machine-id/-/node-machine-id-1.1.12.tgz#37904eee1e59b320bb9c5d6c0a59f3b469cb6267" - integrity sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ== - -node-releases@^2.0.27: - version "2.0.27" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e" - integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== - -node-schedule@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/node-schedule/-/node-schedule-2.1.1.tgz#6958b2c5af8834954f69bb0a7a97c62b97185de3" - integrity sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ== - dependencies: - cron-parser "^4.2.0" - long-timeout "0.1.1" - sorted-array-functions "^1.3.0" - -nodemon@^3.1.10: - version "3.1.11" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.11.tgz#04a54d1e794fbec9d8f6ffd8bf1ba9ea93a756ed" - integrity sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g== - dependencies: - chokidar "^3.5.2" - debug "^4" - ignore-by-default "^1.0.1" - minimatch "^3.1.2" - pstree.remy "^1.1.8" - semver "^7.5.3" - simple-update-notifier "^2.0.0" - supports-color "^5.5.0" - touch "^3.1.0" - undefsafe "^2.0.5" - -nonce@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/nonce/-/nonce-1.0.4.tgz#ee7302ade8c1bef476f301b8c91f5cc51a487612" - integrity sha512-FVPu+tMZPP91HDwiq1DNhn9WIhg4/uo6mXR0xXAn0IMOxDmjJOkgbH0tm7qtowvAFZofWZRX+9KWZpNURrgtSA== - -nopt@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-package-data@^2.0.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -npm-normalize-package-bin@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== - dependencies: - path-key "^4.0.0" - -npm-run-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-6.0.0.tgz#25cfdc4eae04976f3349c0b1afc089052c362537" - integrity sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA== - dependencies: - path-key "^4.0.0" - unicorn-magic "^0.3.0" - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -nwsapi@^2.2.4: - version "2.2.23" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.23.tgz#59712c3a88e6de2bb0b6ccc1070397267019cf6c" - integrity sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ== - -nx@22.0.1: - version "22.0.1" - resolved "https://registry.yarnpkg.com/nx/-/nx-22.0.1.tgz#16471039085911183916413e01a137844203c689" - integrity sha512-7/8RurvJpbYHIywR7/OVF3akVBRLlMq6DdEjddzR4KOHP5cYLf2mdwXx59Tf+z3dQtKDclk0mN7koZdTTv3JMQ== - dependencies: - "@napi-rs/wasm-runtime" "0.2.4" - "@yarnpkg/lockfile" "^1.1.0" - "@yarnpkg/parsers" "3.0.2" - "@zkochan/js-yaml" "0.0.7" - axios "^1.12.0" - chalk "^4.1.0" - cli-cursor "3.1.0" - cli-spinners "2.6.1" - cliui "^8.0.1" - dotenv "~16.4.5" - dotenv-expand "~11.0.6" - enquirer "~2.3.6" - figures "3.2.0" - flat "^5.0.2" - front-matter "^4.0.2" - ignore "^7.0.5" - jest-diff "^30.0.2" - jsonc-parser "3.2.0" - lines-and-columns "2.0.3" - minimatch "9.0.3" - node-machine-id "1.1.12" - npm-run-path "^4.0.1" - open "^8.4.0" - ora "5.3.0" - resolve.exports "2.0.3" - semver "^7.5.3" - string-width "^4.2.3" - tar-stream "~2.2.0" - tmp "~0.2.1" - tree-kill "^1.2.2" - tsconfig-paths "^4.1.2" - tslib "^2.3.0" - yaml "^2.6.0" - yargs "^17.6.2" - yargs-parser "21.1.1" - optionalDependencies: - "@nx/nx-darwin-arm64" "22.0.1" - "@nx/nx-darwin-x64" "22.0.1" - "@nx/nx-freebsd-x64" "22.0.1" - "@nx/nx-linux-arm-gnueabihf" "22.0.1" - "@nx/nx-linux-arm64-gnu" "22.0.1" - "@nx/nx-linux-arm64-musl" "22.0.1" - "@nx/nx-linux-x64-gnu" "22.0.1" - "@nx/nx-linux-x64-musl" "22.0.1" - "@nx/nx-win32-arm64-msvc" "22.0.1" - "@nx/nx-win32-x64-msvc" "22.0.1" - -nx@22.5.1, nx@^22.0.3: - version "22.5.1" - resolved "https://registry.yarnpkg.com/nx/-/nx-22.5.1.tgz#29109d3434e974e0027822673770bef886efaec1" - integrity sha512-KIQqOSdoshkav9JuoH/+Vp42niA5MTRtACupe+q8CaB7bHiLsWr5nctQVC7ul3NauAmsoqNWH7t5CIi8KgrPIQ== - dependencies: - "@napi-rs/wasm-runtime" "0.2.4" - "@yarnpkg/lockfile" "^1.1.0" - "@yarnpkg/parsers" "3.0.2" - "@zkochan/js-yaml" "0.0.7" - axios "^1.12.0" - cli-cursor "3.1.0" - cli-spinners "2.6.1" - cliui "^8.0.1" - dotenv "~16.4.5" - dotenv-expand "~11.0.6" - ejs "^3.1.7" - enquirer "~2.3.6" - figures "3.2.0" - flat "^5.0.2" - front-matter "^4.0.2" - ignore "^7.0.5" - jest-diff "^30.0.2" - jsonc-parser "3.2.0" - lines-and-columns "2.0.3" - minimatch "10.1.1" - node-machine-id "1.1.12" - npm-run-path "^4.0.1" - open "^8.4.0" - ora "5.3.0" - picocolors "^1.1.0" - resolve.exports "2.0.3" - semver "^7.6.3" - string-width "^4.2.3" - tar-stream "~2.2.0" - tmp "~0.2.1" - tree-kill "^1.2.2" - tsconfig-paths "^4.1.2" - tslib "^2.3.0" - yaml "^2.6.0" - yargs "^17.6.2" - yargs-parser "21.1.1" - optionalDependencies: - "@nx/nx-darwin-arm64" "22.5.1" - "@nx/nx-darwin-x64" "22.5.1" - "@nx/nx-freebsd-x64" "22.5.1" - "@nx/nx-linux-arm-gnueabihf" "22.5.1" - "@nx/nx-linux-arm64-gnu" "22.5.1" - "@nx/nx-linux-arm64-musl" "22.5.1" - "@nx/nx-linux-x64-gnu" "22.5.1" - "@nx/nx-linux-x64-musl" "22.5.1" - "@nx/nx-win32-arm64-msvc" "22.5.1" - "@nx/nx-win32-x64-msvc" "22.5.1" - -object-assign@^4, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.13.3, object-inspect@^1.13.4: - version "1.13.4" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" - integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4, object.assign@^4.1.7: - version "4.1.7" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" - integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - has-symbols "^1.1.0" - object-keys "^1.1.1" - -object.entries@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.9.tgz#e4770a6a1444afb61bd39f984018b5bede25f8b3" - integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-object-atoms "^1.1.1" - -object.fromentries@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.values@^1.1.6, object.values@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" - integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -on-finished@^2.4.1, on-finished@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -once@^1.3.0, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -oniguruma-to-es@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz#35ea9104649b7c05f3963c6b3b474d964625028b" - integrity sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g== - dependencies: - emoji-regex-xs "^1.0.0" - regex "^5.1.1" - regex-recursion "^5.1.1" - -open@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/open/-/open-10.2.0.tgz#b9d855be007620e80b6fb05fac98141fe62db73c" - integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA== - dependencies: - default-browser "^5.2.1" - define-lazy-prop "^3.0.0" - is-inside-container "^1.0.0" - wsl-utils "^0.1.0" - -open@^8.4.0: - version "8.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -opener@^1.5.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - -opentok-jwt@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/opentok-jwt/-/opentok-jwt-0.1.5.tgz#c7c84724fc4d287f3a08f4264f97935cbbdb624e" - integrity sha512-Ub3iQEYava3oHK9Xp+UePFw9mratzp98LuDx46qtfkAFzsIKePlwBbj6UZ4pGuJDXZ28BJWpnXZyRWMJK9IW6w== - dependencies: - jsonwebtoken "^9.0.0" - -opentok-layout-js@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/opentok-layout-js/-/opentok-layout-js-5.5.0.tgz#20f6971fdd9a39c816b1c23182351836a61d25e2" - integrity sha512-ynUo+zRjp1iasLUT0UQXuWvFyPAQIxhrdLOjWdNrPkPtziTuZcxccgPhr2kGQm9TztdLLQVlFruJN48cmqQiYA== - -opentok-solutions-logging@^1.1.1, opentok-solutions-logging@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/opentok-solutions-logging/-/opentok-solutions-logging-1.1.5.tgz#d7e399b1a65f19676d21484bf104d3ab50580dd5" - integrity sha512-xnLz0iWmJCWYDMKD80ow5+TcQYOzr2B4l2QA/EQQXjQGIEaXRqEFMhbQr3WXq0ET0Yn5zdJ3unBe8ESGXxUqxw== - dependencies: - axios "^1.6.3" - -opentok-token@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/opentok-token/-/opentok-token-1.1.1.tgz#1ec2b0f29d84477060934c43a2ce4b08f7e8fcc2" - integrity sha512-/uMsmUMiGWT95zemuE9H3OWSb+1NcDmZSDzjum1oKk2KLLGkjqlPsEo8NWarH2q1rfd+cBWP8Pu+dwJS0uNHcg== - dependencies: - lodash "^4.17.11" - nonce "^1.0.3" - unix-timestamp "^0.1.2" - -opentok@2.22.0: - version "2.22.0" - resolved "https://registry.yarnpkg.com/opentok/-/opentok-2.22.0.tgz#d29075211d7a6bc2125da7a5691308e2fa1ec1cb" - integrity sha512-mrEmZt9pUvNGpU0aTjsjb4a2KbLJ+PMWh3f4sm/Rt0CWe1dBTUnvHcqRPQiOiYPAA/SXqv+lktmPdXcVYCbtMQ== - dependencies: - "@vonage/jwt" "1.11.0" - debug "4.4.0" - jsonwebtoken "9.0.2" - lodash "4.17.21" - node-fetch "2.7.0" - opentok-token "1.1.1" - uuid "11.0.5" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -ora@5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.3.0.tgz#fb832899d3a1372fe71c8b2c534bbfe74961bb6f" - integrity sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g== - dependencies: - bl "^4.0.3" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - log-symbols "^4.0.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -orderedmap@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-2.1.1.tgz#61481269c44031c449915497bf5a4ad273c512d2" - integrity sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g== - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== - -os-tmpdir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -own-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" - integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== - dependencies: - get-intrinsic "^1.2.6" - object-keys "^1.1.1" - safe-push-apply "^1.0.0" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-limit@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985" - integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== - dependencies: - yocto-queue "^1.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-json-from-dist@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" - integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parent-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-2.0.0.tgz#fa71f88ff1a50c27e15d8ff74e0e3a9523bf8708" - integrity sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg== - dependencies: - callsites "^3.1.0" - -parse-json@^5.0.0, parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== - -parse5@^7.1.2: - version "7.3.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.3.0.tgz#d7e224fa72399c7a175099f45fc2ad024b05ec05" - integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw== - dependencies: - entities "^6.0.0" - -parseurl@^1.3.3, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-browserify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-scurry@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.1.tgz#4b6572376cfd8b811fca9cd1f5c24b3cbac0fe10" - integrity sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA== - dependencies: - lru-cache "^11.0.0" - minipass "^7.1.2" - -path-to-regexp@^0.1.12, path-to-regexp@~0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" - integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pathe@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" - integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== - -pathe@^2.0.1, pathe@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" - integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -pathval@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.1.tgz#8855c5a2899af072d6ac05d11e46045ad0dc605d" - integrity sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ== - -picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -picomatch@^4.0.2, picomatch@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" - integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== - -pirates@^4.0.4, pirates@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22" - integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== - -pkcs7@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/pkcs7/-/pkcs7-1.0.4.tgz#6090b9e71160dabf69209d719cbafa538b00a1cb" - integrity sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ== - dependencies: - "@babel/runtime" "^7.5.5" - -pkg-dir@^4.1.0, pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkg-types@^1.2.1, pkg-types@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df" - integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== - dependencies: - confbox "^0.1.8" - mlly "^1.7.4" - pathe "^2.0.1" - -pkg-types@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-2.3.0.tgz#037f2c19bd5402966ff6810e32706558cb5b5726" - integrity sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig== - dependencies: - confbox "^0.2.2" - exsolve "^1.0.7" - pathe "^2.0.3" - -playwright-core@1.46.0: - version "1.46.0" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.46.0.tgz#2336ac453a943abf0dc95a76c117f9d3ebd390eb" - integrity sha512-9Y/d5UIwuJk8t3+lhmMSAJyNP1BUC/DqP3cQJDQQL/oWqAiuPTLgy7Q5dzglmTLwcBRdetzgNM/gni7ckfTr6A== - -playwright@1.46.0: - version "1.46.0" - resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.46.0.tgz#c7ff490deae41fc1e814bf2cb62109dd9351164d" - integrity sha512-XYJ5WvfefWONh1uPAUAi0H2xXV5S3vrtcnXe6uAOgdGi3aSpqOSXX08IAjXW34xitfuOJsvXU5anXZxPSEQiJw== - dependencies: - playwright-core "1.46.0" - optionalDependencies: - fsevents "2.3.2" - -portfinder@^1.0.28: - version "1.0.38" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.38.tgz#e4fb3a2d888b20d2977da050e48ab5e1f57a185e" - integrity sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg== - dependencies: - async "^3.2.6" - debug "^4.3.6" - -possible-typed-array-names@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" - integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== - -postcss-modules-extract-imports@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" - integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== - -postcss-modules-local-by-default@^4.0.5: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz#d150f43837831dae25e4085596e84f6f5d6ec368" - integrity sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^7.0.0" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz#1bbccddcb398f1d7a511e0a2d1d047718af4078c" - integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== - dependencies: - postcss-selector-parser "^7.0.0" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-modules@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-6.0.1.tgz#e3e895918c060c14fa6a22f84ba14a4286f436a5" - integrity sha512-zyo2sAkVvuZFFy0gc2+4O+xar5dYlaVy/ebO24KT0ftk/iJevSNyPyQellsBLlnccwh7f6V6Y4GvuKRYToNgpQ== - dependencies: - generic-names "^4.0.0" - icss-utils "^5.1.0" - lodash.camelcase "^4.3.0" - postcss-modules-extract-imports "^3.1.0" - postcss-modules-local-by-default "^4.0.5" - postcss-modules-scope "^3.2.0" - postcss-modules-values "^4.0.0" - string-hash "^1.1.3" - -postcss-selector-parser@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz#e75d2e0d843f620e5df69076166f4e16f891cb9f" - integrity sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.4.38, postcss@^8.4.4, postcss@^8.4.43: - version "8.5.6" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" - integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== - dependencies: - nanoid "^3.3.11" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier-linter-helpers@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz#6a31f88a4bad6c7adda253de12ba4edaea80ebcd" - integrity sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg== - dependencies: - fast-diff "^1.1.2" - -prettier@^3.6.2: - version "3.8.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.8.1.tgz#edf48977cf991558f4fcbd8a3ba6015ba2a3a173" - integrity sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg== - -pretty-format@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-30.2.0.tgz#2d44fe6134529aed18506f6d11509d8a62775ebe" - integrity sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA== - dependencies: - "@jest/schemas" "30.0.5" - ansi-styles "^5.2.0" - react-is "^18.3.1" - -pretty-format@^27.0.2: - version "27.5.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" - integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== - dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -pretty-format@^29.0.0, pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -promise@^8.0.1: - version "8.3.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" - integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== - dependencies: - asap "~2.0.6" - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.6.2, prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -property-information@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.1.0.tgz#b622e8646e02b580205415586b40804d3e8bfd5d" - integrity sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ== - -prosemirror-commands@^1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz#d101fef85618b1be53d5b99ea17bee5600781b38" - integrity sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w== - dependencies: - prosemirror-model "^1.0.0" - prosemirror-state "^1.0.0" - prosemirror-transform "^1.10.2" - -prosemirror-dropcursor@^1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.2.tgz#2ed30c4796109ddeb1cf7282372b3850528b7228" - integrity sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw== - dependencies: - prosemirror-state "^1.0.0" - prosemirror-transform "^1.1.0" - prosemirror-view "^1.1.0" - -prosemirror-gapcursor@^1.3.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.4.0.tgz#e1144a83b79db7ed0ec32cd0e915a0364220af43" - integrity sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ== - dependencies: - prosemirror-keymap "^1.0.0" - prosemirror-model "^1.0.0" - prosemirror-state "^1.0.0" - prosemirror-view "^1.0.0" - -prosemirror-history@^1.4.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.5.0.tgz#ee21fc5de85a1473e3e3752015ffd6d649a06859" - integrity sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg== - dependencies: - prosemirror-state "^1.2.2" - prosemirror-transform "^1.0.0" - prosemirror-view "^1.31.0" - rope-sequence "^1.3.0" - -prosemirror-inputrules@^1.4.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.5.1.tgz#d2e935f6086e3801486b09222638f61dae89a570" - integrity sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw== - dependencies: - prosemirror-state "^1.0.0" - prosemirror-transform "^1.0.0" - -prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz#c0f6ab95f75c0b82c97e44eb6aaf29cbfc150472" - integrity sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw== - dependencies: - prosemirror-state "^1.0.0" - w3c-keyname "^2.2.0" - -prosemirror-model@^1.0.0, prosemirror-model@^1.20.0, prosemirror-model@^1.21.0, prosemirror-model@^1.25.0, prosemirror-model@^1.25.4: - version "1.25.4" - resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.25.4.tgz#8ebfbe29ecbee9e5e2e4048c4fe8e363fcd56e7c" - integrity sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA== - dependencies: - orderedmap "^2.0.0" - -prosemirror-schema-basic@^1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.4.tgz#389ce1ec09b8a30ea9bbb92c58569cb690c2d695" - integrity sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ== - dependencies: - prosemirror-model "^1.25.0" - -prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.4.4.tgz#72b5e926f9e92dcee12b62a05fcc8a2de3bf5b39" - integrity sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw== - dependencies: - prosemirror-model "^1.0.0" - prosemirror-transform "^1.0.0" - prosemirror-view "^1.27.0" - -prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.10.2, prosemirror-transform@^1.11.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.11.0.tgz#f5c5050354423dc83c6b083f6f1959ec86a3f9ba" - integrity sha512-4I7Ce4KpygXb9bkiPS3hTEk4dSHorfRw8uI0pE8IhxlK2GXsqv5tIA7JUSxtSu7u8APVOTtbUBxTmnHIxVkIJw== - dependencies: - prosemirror-model "^1.21.0" - -prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.27.0, prosemirror-view@^1.31.0: - version "1.41.6" - resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.41.6.tgz#949d0407a91e36f6024db2191b8d3058dfd18838" - integrity sha512-mxpcDG4hNQa/CPtzxjdlir5bJFDlm0/x5nGBbStB2BWX+XOQ9M8ekEG+ojqB5BcVu2Rc80/jssCMZzSstJuSYg== - dependencies: - prosemirror-model "^1.20.0" - prosemirror-state "^1.0.0" - prosemirror-transform "^1.1.0" - -prosemirror-view@^1.41.6: - version "1.41.7" - resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.41.7.tgz#61e6f44ac160795c913ead92a282247df9d468f6" - integrity sha512-jUwKNCEIGiqdvhlS91/2QAg21e4dfU5bH2iwmSDQeosXJgKF7smG0YSplOWK0cjSNgIqXe7VXqo7EIfUFJdt3w== - dependencies: - prosemirror-model "^1.20.0" - prosemirror-state "^1.0.0" - prosemirror-transform "^1.1.0" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -psl@^1.1.33: - version "1.15.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6" - integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== - dependencies: - punycode "^2.3.1" - -pstree.remy@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" - integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== - -punycode.js@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" - integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== - -punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.0, punycode@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -pure-rand@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" - integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== - -pure-rand@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-7.0.1.tgz#6f53a5a9e3e4a47445822af96821ca509ed37566" - integrity sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ== - -qs@^6.14.1, qs@^6.4.0: - version "6.15.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.0.tgz#db8fd5d1b1d2d6b5b33adaf87429805f1909e7b3" - integrity sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ== - dependencies: - side-channel "^1.1.0" - -qs@~6.14.0: - version "6.14.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.2.tgz#b5634cf9d9ad9898e31fba3504e866e8efb6798c" - integrity sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q== - dependencies: - side-channel "^1.1.0" - -quansync@^0.2.11: - version "0.2.11" - resolved "https://registry.yarnpkg.com/quansync/-/quansync-0.2.11.tgz#f9c3adda2e1272e4f8cf3f1457b04cbdb4ee692a" - integrity sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -rambda@^9.1.0: - version "9.4.2" - resolved "https://registry.yarnpkg.com/rambda/-/rambda-9.4.2.tgz#1a0da6171ca5830e88311f0083e5fd8b945a32ad" - integrity sha512-++euMfxnl7OgaEKwXh9QqThOjMeta2HH001N1v4mYQzBjJBnmXBh2BCK6dZAbICFVXOFUVD3xFG0R3ZPU0mxXw== - -ramda@^0.32.0: - version "0.32.0" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.32.0.tgz#b2116807b59b6b177af7a2ad19b14a3653570e96" - integrity sha512-GQWAHhxhxWBWA8oIBr1XahFVjQ9Fic6MK9ikijfd4TZHfE2+urfk+irVlR5VOn48uwMgM+loRRBJd6Yjsbc0zQ== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@~2.5.3: - version "2.5.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2" - integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA== - dependencies: - bytes "~3.1.2" - http-errors "~2.0.1" - iconv-lite "~0.4.24" - unpipe "~1.0.0" - -react-docgen-typescript@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-2.4.0.tgz#033428b4a6a639d050ac8baf2a5195c596521713" - integrity sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg== - -react-docgen@^8.0.0, react-docgen@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-8.0.2.tgz#450efcac75813e3d614d7bd15eb4066e2e7bcbf5" - integrity sha512-+NRMYs2DyTP4/tqWz371Oo50JqmWltR1h2gcdgUMAWZJIAvrd0/SqlCfx7tpzpl/s36rzw6qH2MjoNrxtRNYhA== - dependencies: - "@babel/core" "^7.28.0" - "@babel/traverse" "^7.28.0" - "@babel/types" "^7.28.2" - "@types/babel__core" "^7.20.5" - "@types/babel__traverse" "^7.20.7" - "@types/doctrine" "^0.0.9" - "@types/resolve" "^1.20.2" - doctrine "^3.0.0" - resolve "^1.22.1" - strip-indent "^4.0.0" - -react-dom@^19.2.1: - version "19.2.4" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.4.tgz#6fac6bd96f7db477d966c7ec17c1a2b1ad8e6591" - integrity sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ== - dependencies: - scheduler "^0.27.0" - -react-global-state-hooks@^15.0.6: - version "15.0.15" - resolved "https://registry.yarnpkg.com/react-global-state-hooks/-/react-global-state-hooks-15.0.15.tgz#797cf3ca38b200471fee9a56494518f40e15ed4d" - integrity sha512-Xf548EVUyyMHTx+1zi07FQNXhOTPk8H0D6kHnDfcJMx3DKjnefT3LMsmS3Iy3pwA052AjVfPGW8YQhU9bHxIOQ== - dependencies: - json-storage-formatter "^3.0.2" - react-hooks-global-states "^15.0.16" - -react-hooks-global-states@^15.0.16: - version "15.0.16" - resolved "https://registry.yarnpkg.com/react-hooks-global-states/-/react-hooks-global-states-15.0.16.tgz#2ed71058f5d7b642ba37b4d6d125f2890068c747" - integrity sha512-3QbZWMemhy0fBvTaMMAX2/NLRbW86GGwGi75LBbAy7Dxe9glWvMGz31s1gOrDsB8GcNILryokMtbRp9H3Eexuw== - dependencies: - json-storage-formatter "^3.0.2" - -react-i18next@^15.6.1: - version "15.7.4" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-15.7.4.tgz#146e50f220d204b842e22c75d1a3d23c6c589a30" - integrity sha512-nyU8iKNrI5uDJch0z9+Y5XEr34b0wkyYj3Rp+tfbahxtlswxSCjcUL9H0nqXo9IR3/t5Y5PKIA3fx3MfUyR9Xw== - dependencies: - "@babel/runtime" "^7.27.6" - html-parse-stringify "^3.0.1" - -react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-is@^18.0.0, react-is@^18.3.1: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - -react-is@^19.0.0: - version "19.2.4" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.2.4.tgz#a080758243c572ccd4a63386537654298c99d135" - integrity sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA== - -react-refresh@^0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.18.0.tgz#2dce97f4fe932a4d8142fa1630e475c1729c8062" - integrity sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw== - -react-router-dom@6.30.2: - version "6.30.2" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.30.2.tgz#ee8c161bce4890d34484b552f8510f9af0e22b01" - integrity sha512-l2OwHn3UUnEVUqc6/1VMmR1cvZryZ3j3NzapC2eUXO1dB0sYp5mvwdjiXhpUbRb21eFow3qSxpP8Yv6oAU824Q== - dependencies: - "@remix-run/router" "1.23.1" - react-router "6.30.2" - -react-router@6.30.2: - version "6.30.2" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.30.2.tgz#c78a3b40f7011f49a373b1df89492e7d4ec12359" - integrity sha512-H2Bm38Zu1bm8KUE5NVWRMzuIyAV8p/JrOaBJAwVmp37AXG72+CZJlEBw6pdn9i5TBgLMhNDgijS4ZlblpHyWTA== - dependencies: - "@remix-run/router" "1.23.1" - -react-transition-group@^4.4.5: - version "4.4.5" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" - integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== - dependencies: - "@babel/runtime" "^7.5.5" - dom-helpers "^5.0.1" - loose-envify "^1.4.0" - prop-types "^15.6.2" - -react@^19.2.1: - version "19.2.4" - resolved "https://registry.yarnpkg.com/react/-/react-19.2.4.tgz#438e57baa19b77cb23aab516cf635cd0579ee09a" - integrity sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ== - -read-installed@~4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067" - integrity sha512-O03wg/IYuV/VtnK2h/KXEt9VIbMUFbk3ERG0Iu4FhLZw0EP0T9znqrYDGn6ncbEsXUFaUjiVAWXHzxwt3lhRPQ== - dependencies: - debuglog "^1.0.1" - read-package-json "^2.0.0" - readdir-scoped-modules "^1.0.0" - semver "2 || 3 || 4 || 5" - slide "~1.1.3" - util-extend "^1.0.1" - optionalDependencies: - graceful-fs "^4.1.2" - -read-package-json@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a" - integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== - dependencies: - glob "^7.1.1" - json-parse-even-better-errors "^2.3.0" - normalize-package-data "^2.0.0" - npm-normalize-package-bin "^1.0.0" - -readable-stream@^3.1.1, readable-stream@^3.4.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdir-scoped-modules@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" - integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== - dependencies: - debuglog "^1.0.1" - dezalgo "^1.0.0" - graceful-fs "^4.1.2" - once "^1.3.0" - -readdirp@^4.0.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" - integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -recast@^0.23.5: - version "0.23.11" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.23.11.tgz#8885570bb28cf773ba1dc600da7f502f7883f73f" - integrity sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA== - dependencies: - ast-types "^0.16.1" - esprima "~4.0.0" - source-map "~0.6.1" - tiny-invariant "^1.3.3" - tslib "^2.0.1" - -rechoir@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" - integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== - dependencies: - resolve "^1.20.0" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" - integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.9" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.7" - get-proto "^1.0.1" - which-builtin-type "^1.2.1" - -regenerate-unicode-properties@^10.2.2: - version "10.2.2" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz#aa113812ba899b630658c7623466be71e1f86f66" - integrity sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regex-recursion@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/regex-recursion/-/regex-recursion-5.1.1.tgz#5a73772d18adbf00f57ad097bf54171b39d78f8b" - integrity sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w== - dependencies: - regex "^5.1.1" - regex-utilities "^2.3.0" - -regex-utilities@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/regex-utilities/-/regex-utilities-2.3.0.tgz#87163512a15dce2908cf079c8960d5158ff43280" - integrity sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng== - -regex@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/regex/-/regex-5.1.1.tgz#cf798903f24d6fe6e531050a36686e082b29bd03" - integrity sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw== - dependencies: - regex-utilities "^2.3.0" - -regexp.prototype.flags@^1.5.3, regexp.prototype.flags@^1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" - integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-errors "^1.3.0" - get-proto "^1.0.1" - gopd "^1.2.0" - set-function-name "^2.0.2" - -regexpu-core@^6.3.1: - version "6.4.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.4.0.tgz#3580ce0c4faedef599eccb146612436b62a176e5" - integrity sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^10.2.2" - regjsgen "^0.8.0" - regjsparser "^0.13.0" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.2.1" - -regjsgen@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" - integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== - -regjsparser@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.13.0.tgz#01f8351335cf7898d43686bc74d2dd71c847ecc0" - integrity sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q== - dependencies: - jsesc "~3.1.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resize-observer-polyfill@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" - integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -resolve.exports@2.0.3, resolve.exports@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" - integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== - -resolve@1.22.8: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.10.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.11, resolve@^1.22.4, resolve@^1.22.8, resolve@~1.22.1, resolve@~1.22.2: - version "1.22.11" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" - integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== - dependencies: - is-core-module "^2.16.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^2.0.0-next.5: - version "2.0.0-next.5" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" - integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -reusify@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" - integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== - -rfdc@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" - integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rollup-plugin-typescript2@^0.36.0: - version "0.36.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.36.0.tgz#309564eb70d710412f5901344ca92045e180ed53" - integrity sha512-NB2CSQDxSe9+Oe2ahZbf+B4bh7pHwjV5L+RSYpCu7Q5ROuN94F9b6ioWwKfz3ueL3KTtmX4o2MUH2cgHDIEUsw== - dependencies: - "@rollup/pluginutils" "^4.1.2" - find-cache-dir "^3.3.2" - fs-extra "^10.0.0" - semver "^7.5.4" - tslib "^2.6.2" - -rollup@^4.14.0, rollup@^4.20.0, rollup@^4.22.4: - version "4.57.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.57.1.tgz#947f70baca32db2b9c594267fe9150aa316e5a88" - integrity sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A== - dependencies: - "@types/estree" "1.0.8" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.57.1" - "@rollup/rollup-android-arm64" "4.57.1" - "@rollup/rollup-darwin-arm64" "4.57.1" - "@rollup/rollup-darwin-x64" "4.57.1" - "@rollup/rollup-freebsd-arm64" "4.57.1" - "@rollup/rollup-freebsd-x64" "4.57.1" - "@rollup/rollup-linux-arm-gnueabihf" "4.57.1" - "@rollup/rollup-linux-arm-musleabihf" "4.57.1" - "@rollup/rollup-linux-arm64-gnu" "4.57.1" - "@rollup/rollup-linux-arm64-musl" "4.57.1" - "@rollup/rollup-linux-loong64-gnu" "4.57.1" - "@rollup/rollup-linux-loong64-musl" "4.57.1" - "@rollup/rollup-linux-ppc64-gnu" "4.57.1" - "@rollup/rollup-linux-ppc64-musl" "4.57.1" - "@rollup/rollup-linux-riscv64-gnu" "4.57.1" - "@rollup/rollup-linux-riscv64-musl" "4.57.1" - "@rollup/rollup-linux-s390x-gnu" "4.57.1" - "@rollup/rollup-linux-x64-gnu" "4.57.1" - "@rollup/rollup-linux-x64-musl" "4.57.1" - "@rollup/rollup-openbsd-x64" "4.57.1" - "@rollup/rollup-openharmony-arm64" "4.57.1" - "@rollup/rollup-win32-arm64-msvc" "4.57.1" - "@rollup/rollup-win32-ia32-msvc" "4.57.1" - "@rollup/rollup-win32-x64-gnu" "4.57.1" - "@rollup/rollup-win32-x64-msvc" "4.57.1" - fsevents "~2.3.2" - -rope-sequence@^1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.3.4.tgz#df85711aaecd32f1e756f76e43a415171235d425" - integrity sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ== - -rrweb-cssom@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1" - integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== - -run-applescript@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911" - integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q== - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@7.8.2: - version "7.8.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" - integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== - dependencies: - tslib "^2.1.0" - -safe-array-concat@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" - integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.2" - get-intrinsic "^1.2.6" - has-symbols "^1.1.0" - isarray "^2.0.5" - -safe-buffer@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-push-apply@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" - integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== - dependencies: - es-errors "^1.3.0" - isarray "^2.0.5" - -safe-regex-test@^1.0.3, safe-regex-test@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" - integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - is-regex "^1.2.1" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -saxes@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" - integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== - dependencies: - xmlchars "^2.2.0" - -scheduler@^0.27.0: - version "0.27.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.27.0.tgz#0c4ef82d67d1e5c1e359e8fc76d3a87f045fe5bd" - integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== - -schema-utils@^4.2.0, schema-utils@^4.3.0, schema-utils@^4.3.3: - version "4.3.3" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.3.tgz#5b1850912fa31df90716963d45d9121fdfc09f46" - integrity sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - -secure-compare@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/secure-compare/-/secure-compare-3.0.1.tgz#f1a0329b308b221fae37b9974f3d578d0ca999e3" - integrity sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw== - -"semver@2 || 3 || 4 || 5", semver@^5.5.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@7.6.3: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.4, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3, semver@^7.7.1, semver@^7.7.2, semver@^7.7.3: - version "7.7.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" - integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== - -semver@~7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -send@~0.19.0, send@~0.19.1: - version "0.19.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.2.tgz#59bc0da1b4ea7ad42736fd642b1c4294e114ff29" - integrity sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "~0.5.2" - http-errors "~2.0.1" - mime "1.6.0" - ms "2.1.3" - on-finished "~2.4.1" - range-parser "~1.2.1" - statuses "~2.0.2" - -serialize-javascript@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - -serve-static@~1.16.2: - version "1.16.3" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.3.tgz#a97b74d955778583f3862a4f0b841eb4d5d78cf9" - integrity sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA== - dependencies: - encodeurl "~2.0.0" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "~0.19.1" - -set-function-length@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -set-proto@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" - integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== - dependencies: - dunder-proto "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - -setprototypeof@1.2.0, setprototypeof@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-exec@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/shell-exec/-/shell-exec-1.0.2.tgz#2e9361b0fde1d73f476c4b6671fa17785f696756" - integrity sha512-jyVd+kU2X+mWKMmGhx4fpWbPsjvD53k9ivqetutVW/BQ+WIZoDoP4d8vUMGezV6saZsiNoW2f9GIhg9Dondohg== - -shell-quote@1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.3.tgz#55e40ef33cf5c689902353a3d8cd1a6725f08b4b" - integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw== - -shiki@^1.16.2: - version "1.29.2" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.29.2.tgz#5c93771f2d5305ce9c05975c33689116a27dc657" - integrity sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg== - dependencies: - "@shikijs/core" "1.29.2" - "@shikijs/engine-javascript" "1.29.2" - "@shikijs/engine-oniguruma" "1.29.2" - "@shikijs/langs" "1.29.2" - "@shikijs/themes" "1.29.2" - "@shikijs/types" "1.29.2" - "@shikijs/vscode-textmate" "^10.0.1" - "@types/hast" "^3.0.4" - -side-channel-list@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" - integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - -side-channel-map@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" - integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - -side-channel-weakmap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" - integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - side-channel-map "^1.0.1" - -side-channel@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" - integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - side-channel-list "^1.0.0" - side-channel-map "^1.0.1" - side-channel-weakmap "^1.0.2" - -siginfo@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" - integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== - -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.0.1, signal-exit@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -simple-update-notifier@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" - integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== - dependencies: - semver "^7.5.3" - -sirv@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" - integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== - dependencies: - "@polka/url" "^1.0.0-next.24" - mrmime "^2.0.0" - totalist "^3.0.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slide@~1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw== - -smol-toml@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/smol-toml/-/smol-toml-1.6.0.tgz#7911830b47bb3e87be536f939453e10c9e1dfd36" - integrity sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw== - -snake-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" - integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -sorted-array-functions@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz#8605695563294dffb2c9796d602bd8459f7a0dd5" - integrity sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA== - -source-map-js@^1.0.1, source-map-js@^1.2.0, source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@0.5.19: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.4: - version "0.7.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02" - integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== - -space-separated-tokens@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" - integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== - -spdx-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/spdx-compare/-/spdx-compare-1.0.0.tgz#2c55f117362078d7409e6d7b08ce70a857cd3ed7" - integrity sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A== - dependencies: - array-find-index "^1.0.2" - spdx-expression-parse "^3.0.0" - spdx-ranges "^2.0.0" - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" - integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.22" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz#abf5a08a6f5d7279559b669f47f0a43e8f3464ef" - integrity sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ== - -spdx-ranges@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/spdx-ranges/-/spdx-ranges-2.1.1.tgz#87573927ba51e92b3f4550ab60bfc83dd07bac20" - integrity sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA== - -spdx-satisfies@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/spdx-satisfies/-/spdx-satisfies-4.0.1.tgz#9a09a68d80f5f1a31cfaebb384b0c6009e4969fe" - integrity sha512-WVzZ/cXAzoNmjCWiEluEA3BjHp5tiUmmhn9MK+X0tBbR9sOqtC6UQwmgCNrAIZvNlMuBUYAaHYfb2oqlF9SwKA== - dependencies: - spdx-compare "^1.0.0" - spdx-expression-parse "^3.0.0" - spdx-ranges "^2.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stable-hash-x@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/stable-hash-x/-/stable-hash-x-0.2.0.tgz#dfd76bfa5d839a7470125c6a6b3c8b22061793e9" - integrity sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ== - -stack-utils@^2.0.3, stack-utils@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -stackback@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" - integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== - -status-code-enum@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/status-code-enum/-/status-code-enum-1.0.0.tgz#097b6d87e8402fa20f5fbf3c50a24eda20d4efed" - integrity sha512-aDTkL2wug8wYX8i0a2K1foqIDaJyGF/a3I0KTZ9gD4MJaxzd7/LKD1VQ2rXL5u7fWESVY+qY2LQLqj6LK/YXiA== - -"statuses@>= 1.5.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -statuses@^2.0.1, statuses@~2.0.1, statuses@~2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" - integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== - -std-env@^3.5.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.10.0.tgz#d810b27e3a073047b2b5e40034881f5ea6f9c83b" - integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== - -stop-iteration-iterator@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" - integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== - dependencies: - es-errors "^1.3.0" - internal-slot "^1.1.0" - -storybook@^10.1.11: - version "10.2.8" - resolved "https://registry.yarnpkg.com/storybook/-/storybook-10.2.8.tgz#fa4d915a0d209028d52edfbc485aa62fd8ebdb69" - integrity sha512-885uSIn8NQw2ZG7vy84K45lHCOSyz1DVsDV8pHiHQj3J0riCuWLNeO50lK9z98zE8kjhgTtxAAkMTy5nkmNRKQ== - dependencies: - "@storybook/global" "^5.0.0" - "@storybook/icons" "^2.0.1" - "@testing-library/jest-dom" "^6.6.3" - "@testing-library/user-event" "^14.6.1" - "@vitest/expect" "3.2.4" - "@vitest/spy" "3.2.4" - esbuild "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0" - open "^10.2.0" - recast "^0.23.5" - semver "^7.7.3" - use-sync-external-store "^1.5.0" - ws "^8.18.0" - -streamroller@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.5.tgz#1263182329a45def1ffaef58d31b15d13d2ee7ff" - integrity sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw== - dependencies: - date-format "^4.0.14" - debug "^4.3.4" - fs-extra "^8.1.0" - -string-argv@~0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" - integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== - -string-hash@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" - integrity sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A== - -string-length@^4.0.1, string-length@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string.prototype.includes@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz#eceef21283640761a81dbe16d6c7171a4edf7d92" - integrity sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.3" - -string.prototype.matchall@^4.0.12: - version "4.0.12" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz#6c88740e49ad4956b1332a911e949583a275d4c0" - integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-abstract "^1.23.6" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.6" - gopd "^1.2.0" - has-symbols "^1.1.0" - internal-slot "^1.1.0" - regexp.prototype.flags "^1.5.3" - set-function-name "^2.0.2" - side-channel "^1.1.0" - -string.prototype.repeat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" - integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string.prototype.trim@^1.2.10: - version "1.2.10" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" - integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.2" - define-data-property "^1.1.4" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-object-atoms "^1.0.0" - has-property-descriptors "^1.0.2" - -string.prototype.trimend@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" - integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.2" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -stringify-entities@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" - integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== - dependencies: - character-entities-html4 "^2.0.0" - character-entities-legacy "^3.0.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.2.tgz#132875abde678c7ea8d691533f2e7e22bb744dba" - integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-indent@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.1.1.tgz#aba13de189d4ad9a17f6050e76554ac27585c7af" - integrity sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA== - -strip-json-comments@^3.1.1, strip-json-comments@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-literal@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-2.1.1.tgz#26906e65f606d49f748454a08084e94190c2e5ad" - integrity sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q== - dependencies: - js-tokens "^9.0.1" - -stylis@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" - integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== - -superagent@^10.3.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-10.3.0.tgz#ff1e39e7976b63f8084291d65f5bfbbbbd156989" - integrity sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ== - dependencies: - component-emitter "^1.3.1" - cookiejar "^2.1.4" - debug "^4.3.7" - fast-safe-stringify "^2.1.1" - form-data "^4.0.5" - formidable "^3.5.4" - methods "^1.1.2" - mime "2.6.0" - qs "^6.14.1" - -supertest@^7.0.0: - version "7.2.2" - resolved "https://registry.yarnpkg.com/supertest/-/supertest-7.2.2.tgz#dac3ee25a2aa59942a7f641e50c838a7c8819204" - integrity sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA== - dependencies: - cookie-signature "^1.2.2" - methods "^1.1.2" - superagent "^10.3.0" - -supports-color@8.1.1, supports-color@^8.0.0, supports-color@^8.1.1, supports-color@~8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svg-parser@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" - integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== - -svgo@^3.0.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.3.2.tgz#ad58002652dffbb5986fc9716afe52d869ecbda8" - integrity sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw== - dependencies: - "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^5.1.0" - css-tree "^2.3.1" - css-what "^6.1.0" - csso "^5.0.5" - picocolors "^1.0.0" - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -synckit@^0.11.12, synckit@^0.11.4, synckit@^0.11.8: - version "0.11.12" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.12.tgz#abe74124264fbc00a48011b0d98bdc1cffb64a7b" - integrity sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ== - dependencies: - "@pkgr/core" "^0.2.9" - -tailwind-api-utils@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tailwind-api-utils/-/tailwind-api-utils-1.0.3.tgz#8315b86addf55ac1e3624e971546dc680e4b3275" - integrity sha512-KpzUHkH1ug1sq4394SLJX38ZtpeTiqQ1RVyFTTSY2XuHsNSTWUkRo108KmyyrMWdDbQrLYkSHaNKj/a3bmA4sQ== - dependencies: - enhanced-resolve "^5.18.1" - jiti "^2.4.2" - local-pkg "^1.1.1" - -tailwind-merge@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-3.4.1.tgz#37e12eeb8bf49d15c116ff2018fa01fac10e2b9e" - integrity sha512-2OA0rFqWOkITEAOFWSBSApYkDeH9t2B3XSJuI4YztKBzK3mX0737A2qtxDZ7xkw9Zfh0bWl+r34sF3HXV+Ig7Q== - -tailwind-variants@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/tailwind-variants/-/tailwind-variants-3.2.2.tgz#3ac8ccc735cae8b6f416330070f5f7437a77a0f3" - integrity sha512-Mi4kHeMTLvKlM98XPnK+7HoBPmf4gygdFmqQPaDivc3DpYS6aIY6KiG/PgThrGvii5YZJqRsPz0aPyhoFzmZgg== - -tailwindcss@4.1.18, tailwindcss@^4.1.18: - version "4.1.18" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-4.1.18.tgz#f488ba47853abdb5354daf9679d3e7791fc4f4e3" - integrity sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw== - -tapable@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.0.tgz#7e3ea6d5ca31ba8e078b560f0d83ce9a14aa8be6" - integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== - -tar-stream@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -tcp-port-used@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-1.0.2.tgz#9652b7436eb1f4cfae111c79b558a25769f6faea" - integrity sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA== - dependencies: - debug "4.3.1" - is2 "^2.0.6" - -terser-webpack-plugin@^5.3.16: - version "5.3.16" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz#741e448cc3f93d8026ebe4f7ef9e4afacfd56330" - integrity sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q== - dependencies: - "@jridgewell/trace-mapping" "^0.3.25" - jest-worker "^27.4.5" - schema-utils "^4.3.0" - serialize-javascript "^6.0.2" - terser "^5.31.1" - -terser@^5.31.1, terser@^5.46.0: - version "5.46.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.46.0.tgz#1b81e560d584bbdd74a8ede87b4d9477b0ff9695" - integrity sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.15.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -tiny-invariant@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" - integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== - -tinybench@^2.5.1: - version "2.9.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" - integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== - -tinyglobby@^0.2.12, tinyglobby@^0.2.14, tinyglobby@^0.2.15: - version "0.2.15" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" - integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== - dependencies: - fdir "^6.5.0" - picomatch "^4.0.3" - -tinypool@^0.8.3: - version "0.8.4" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.8.4.tgz#e217fe1270d941b39e98c625dcecebb1408c9aa8" - integrity sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ== - -tinyrainbow@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-2.0.0.tgz#9509b2162436315e80e3eee0fcce4474d2444294" - integrity sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw== - -tinyspy@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.1.tgz#117b2342f1f38a0dbdcc73a50a454883adf861d1" - integrity sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A== - -tinyspy@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-4.0.4.tgz#d77a002fb53a88aa1429b419c1c92492e0c81f78" - integrity sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q== - -tmp@~0.2.1: - version "0.2.5" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" - integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1, toidentifier@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -totalist@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" - integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== - -touch@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694" - integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== - -tough-cookie@^4.1.2: - version "4.1.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" - integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" - integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== - dependencies: - punycode "^2.3.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -tree-kill@1.2.2, tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -treeify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" - integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== - -trim-lines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" - integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== - -ts-api-utils@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.4.0.tgz#2690579f96d2790253bdcf1ca35d569ad78f9ad8" - integrity sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA== - -ts-dedent@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" - integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== - -ts-jest@^29.2.5: - version "29.4.6" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.4.6.tgz#51cb7c133f227396818b71297ad7409bb77106e9" - integrity sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA== - dependencies: - bs-logger "^0.2.6" - fast-json-stable-stringify "^2.1.0" - handlebars "^4.7.8" - json5 "^2.2.3" - lodash.memoize "^4.1.2" - make-error "^1.3.6" - semver "^7.7.3" - type-fest "^4.41.0" - yargs-parser "^21.1.1" - -ts-loader@^9.5.4: - version "9.5.4" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.4.tgz#44b571165c10fb5a90744aa5b7e119233c4f4585" - integrity sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ== - dependencies: - chalk "^4.1.0" - enhanced-resolve "^5.0.0" - micromatch "^4.0.0" - semver "^7.3.4" - source-map "^0.7.4" - -ts-xor@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-xor/-/ts-xor-1.3.0.tgz#3e59f24f0321f9f10f350e0cee3b534b89a2c70b" - integrity sha512-RLXVjliCzc1gfKQFLRpfeD0rrWmjnSTgj7+RFhoq3KRkUYa8LE/TIidYOzM5h+IdFBDSjjSgk9Lto9sdMfDFEA== - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tsconfig-paths@^4.1.2, tsconfig-paths@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" - integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== - dependencies: - json5 "^2.2.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.6.2, tslib@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -tsscmp@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" - integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== - -tsx@^4.10.5: - version "4.21.0" - resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.21.0.tgz#32aa6cf17481e336f756195e6fe04dae3e6308b1" - integrity sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw== - dependencies: - esbuild "~0.27.0" - get-tsconfig "^4.7.5" - optionalDependencies: - fsevents "~2.3.3" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-detect@^4.0.0, type-detect@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" - integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^4.41.0: - version "4.41.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58" - integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== - -type-is@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.0.1.tgz#64f6cf03f92fce4015c2b224793f6bdd4b068c97" - integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== - dependencies: - content-type "^1.0.5" - media-typer "^1.1.0" - mime-types "^3.0.0" - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typed-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" - integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-typed-array "^1.1.14" - -typed-array-byte-length@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" - integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== - dependencies: - call-bind "^1.0.8" - for-each "^0.3.3" - gopd "^1.2.0" - has-proto "^1.2.0" - is-typed-array "^1.1.14" - -typed-array-byte-offset@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" - integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - for-each "^0.3.3" - gopd "^1.2.0" - has-proto "^1.2.0" - is-typed-array "^1.1.15" - reflect.getprototypeof "^1.0.9" - -typed-array-length@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" - integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - reflect.getprototypeof "^1.0.6" - -typedoc@^0.26.10: - version "0.26.11" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.26.11.tgz#124b43a5637b7f3237b8c721691b44738c5c9dc9" - integrity sha512-sFEgRRtrcDl2FxVP58Ze++ZK2UQAEvtvvH8rRlig1Ja3o7dDaMHmaBfvJmdGnNEFaLTpQsN8dpvZaTqJSu/Ugw== - dependencies: - lunr "^2.3.9" - markdown-it "^14.1.0" - minimatch "^9.0.5" - shiki "^1.16.2" - yaml "^2.5.1" - -typescript-eslint@^8.46.4: - version "8.55.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.55.0.tgz#abae8295c5f0f82f816218113a46e89bc30c3de2" - integrity sha512-HE4wj+r5lmDVS9gdaN0/+iqNvPZwGfnJ5lZuz7s5vLlg9ODw0bIiiETaios9LvFI1U94/VBXGm3CB2Y5cNFMpw== - dependencies: - "@typescript-eslint/eslint-plugin" "8.55.0" - "@typescript-eslint/parser" "8.55.0" - "@typescript-eslint/typescript-estree" "8.55.0" - "@typescript-eslint/utils" "8.55.0" - -typescript@5.8.2: - version "5.8.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.2.tgz#8170b3702f74b79db2e5a96207c15e65807999e4" - integrity sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ== - -typescript@^5.8.3, typescript@~5.9.2: - version "5.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" - integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== - -ua-parser-js@^1.0.41: - version "1.0.41" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.41.tgz#bd04dc9ec830fcf9e4fad35cf22dcedd2e3b4e9c" - integrity sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug== - -uc.micro@^2.0.0, uc.micro@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" - integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== - -ufo@^1.6.1: - version "1.6.3" - resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.6.3.tgz#799666e4e88c122a9659805e30b9dc071c3aed4f" - integrity sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q== - -uglify-js@^3.1.4: - version "3.19.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" - integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== - -unbox-primitive@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" - integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== - dependencies: - call-bound "^1.0.3" - has-bigints "^1.0.2" - has-symbols "^1.1.0" - which-boxed-primitive "^1.1.1" - -undefsafe@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" - integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== - -undici-types@~6.21.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" - integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== - -undici-types@~7.16.0: - version "7.16.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" - integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" - integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz#65a7adfad8574c219890e219285ce4c64ed67eaa" - integrity sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz#301d4f8a43d2b75c97adfad87c9dd5350c9475d1" - integrity sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ== - -unicorn-magic@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz#4efd45c85a69e0dd576d25532fbfa22aa5c8a104" - integrity sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA== - -union@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/union/-/union-0.5.0.tgz#b2c11be84f60538537b846edb9ba266ba0090075" - integrity sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA== - dependencies: - qs "^6.4.0" - -unist-util-is@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.1.tgz#d0a3f86f2dd0db7acd7d8c2478080b5c67f9c6a9" - integrity sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g== - dependencies: - "@types/unist" "^3.0.0" - -unist-util-position@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" - integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== - dependencies: - "@types/unist" "^3.0.0" - -unist-util-stringify-position@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" - integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== - dependencies: - "@types/unist" "^3.0.0" - -unist-util-visit-parents@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz#777df7fb98652ce16b4b7cd999d0a1a40efa3a02" - integrity sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ== - dependencies: - "@types/unist" "^3.0.0" - unist-util-is "^6.0.0" - -unist-util-visit@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.1.0.tgz#9a2a28b0aa76a15e0da70a08a5863a2f060e2468" - integrity sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg== - dependencies: - "@types/unist" "^3.0.0" - unist-util-is "^6.0.0" - unist-util-visit-parents "^6.0.0" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -unix-timestamp@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unix-timestamp/-/unix-timestamp-0.1.2.tgz#c371de092ab1491a25c5ce3c0758d2c25e7be3c3" - integrity sha512-nSpkcoMTJWN8sup4/pAt04Rj8Psf9hV6ymtn6XWWBtGBCyKhxvkhi/MOfLn8GLfITIaRt4XFnrg9Mb3SSkT+sg== - -unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -unplugin@^2.3.5: - version "2.3.11" - resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-2.3.11.tgz#411e020dd2ba90e2fbe1e7bd63a5a399e6ee3b54" - integrity sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww== - dependencies: - "@jridgewell/remapping" "^2.3.5" - acorn "^8.15.0" - picomatch "^4.0.3" - webpack-virtual-modules "^0.6.2" - -unrs-resolver@^1.7.11: - version "1.11.1" - resolved "https://registry.yarnpkg.com/unrs-resolver/-/unrs-resolver-1.11.1.tgz#be9cd8686c99ef53ecb96df2a473c64d304048a9" - integrity sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg== - dependencies: - napi-postinstall "^0.3.0" - optionalDependencies: - "@unrs/resolver-binding-android-arm-eabi" "1.11.1" - "@unrs/resolver-binding-android-arm64" "1.11.1" - "@unrs/resolver-binding-darwin-arm64" "1.11.1" - "@unrs/resolver-binding-darwin-x64" "1.11.1" - "@unrs/resolver-binding-freebsd-x64" "1.11.1" - "@unrs/resolver-binding-linux-arm-gnueabihf" "1.11.1" - "@unrs/resolver-binding-linux-arm-musleabihf" "1.11.1" - "@unrs/resolver-binding-linux-arm64-gnu" "1.11.1" - "@unrs/resolver-binding-linux-arm64-musl" "1.11.1" - "@unrs/resolver-binding-linux-ppc64-gnu" "1.11.1" - "@unrs/resolver-binding-linux-riscv64-gnu" "1.11.1" - "@unrs/resolver-binding-linux-riscv64-musl" "1.11.1" - "@unrs/resolver-binding-linux-s390x-gnu" "1.11.1" - "@unrs/resolver-binding-linux-x64-gnu" "1.11.1" - "@unrs/resolver-binding-linux-x64-musl" "1.11.1" - "@unrs/resolver-binding-wasm32-wasi" "1.11.1" - "@unrs/resolver-binding-win32-arm64-msvc" "1.11.1" - "@unrs/resolver-binding-win32-ia32-msvc" "1.11.1" - "@unrs/resolver-binding-win32-x64-msvc" "1.11.1" - -upath@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" - integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== - -update-browserslist-db@^1.2.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" - integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.1" - -uri-js@^4.2.2, uri-js@^4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-join@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" - integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -url-toolkit@^2.2.1: - version "2.2.5" - resolved "https://registry.yarnpkg.com/url-toolkit/-/url-toolkit-2.2.5.tgz#58406b18e12c58803e14624df5e374f638b0f607" - integrity sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg== - -use-sync-external-store@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz#b174bfa65cb2b526732d9f2ac0a408027876f32d" - integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util-extend@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" - integrity sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@11.0.5: - version "11.0.5" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.0.5.tgz#07b46bdfa6310c92c3fb3953a8720f170427fc62" - integrity sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA== - -uuid@13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-13.0.0.tgz#263dc341b19b4d755eb8fe36b78d95a6b65707e8" - integrity sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w== - -uuid@9.0.1, uuid@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" - integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== - -uuid@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.0.tgz#9549028be1753bb934fc96e2bca09bb4105ae912" - integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-to-istanbul@^9.0.1: - version "9.3.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" - integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^2.0.0" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -validator@13.15.15: - version "13.15.15" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.15.15.tgz#246594be5671dc09daa35caec5689fcd18c6e7e4" - integrity sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A== - -vanilla-colorful@^0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/vanilla-colorful/-/vanilla-colorful-0.7.2.tgz#3fb1f4b9f15b797e20fd1ce8e0364f33b073f4a2" - integrity sha512-z2YZusTFC6KnLERx1cgoIRX2CjPRP0W75N+3CC6gbvdX5Ch47rZkEMGO2Xnf+IEmi3RiFLxS18gayMA27iU7Kg== - -vary@^1, vary@^1.1.2, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -vfile-message@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.3.tgz#87b44dddd7b70f0641c2e3ed0864ba73e2ea8df4" - integrity sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw== - dependencies: - "@types/unist" "^3.0.0" - unist-util-stringify-position "^4.0.0" - -vfile@^6.0.0: - version "6.0.3" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.3.tgz#3652ab1c496531852bf55a6bac57af981ebc38ab" - integrity sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== - dependencies: - "@types/unist" "^3.0.0" - vfile-message "^4.0.0" - -"video.js@^7 || ^8", video.js@^8.23.7: - version "8.23.7" - resolved "https://registry.yarnpkg.com/video.js/-/video.js-8.23.7.tgz#f32be0689b0184e4d8b8b03fd150bac21e6db2ab" - integrity sha512-cG4HOygYt+Z8j6Sf5DuK6OgEOoM+g9oGP6vpqoZRaD13aHE4PMITbyjJUXZcIQbgB0wJEadBRaVm5lJIzo2jAA== - dependencies: - "@babel/runtime" "^7.28.4" - "@videojs/http-streaming" "^3.17.3" - "@videojs/vhs-utils" "^4.1.1" - "@videojs/xhr" "2.7.0" - aes-decrypter "^4.0.2" - global "4.4.0" - m3u8-parser "^7.2.0" - mpd-parser "^1.3.1" - mux.js "^7.0.1" - videojs-contrib-quality-levels "4.1.0" - videojs-font "4.2.0" - videojs-vtt.js "0.15.5" - -videojs-contrib-quality-levels@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-4.1.0.tgz#44c2d2167114a5c8418548b10a25cb409d6cba51" - integrity sha512-TfrXJJg1Bv4t6TOCMEVMwF/CoS8iENYsWNKip8zfhB5kTcegiFYezEA0eHAJPU64ZC8NQbxQgOwAsYU8VXbOWA== - dependencies: - global "^4.4.0" - -videojs-font@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/videojs-font/-/videojs-font-4.2.0.tgz#fbce803d347c565816e296f527e208dc65c9f235" - integrity sha512-YPq+wiKoGy2/M7ccjmlvwi58z2xsykkkfNMyIg4xb7EZQQNwB71hcSsB3o75CqQV7/y5lXkXhI/rsGAS7jfEmQ== - -videojs-vtt.js@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz#567776eaf2a7a928d88b148a8b401ade2406f2ca" - integrity sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ== - dependencies: - global "^4.3.1" - -vite-node@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.6.1.tgz#fff3ef309296ea03ceaa6ca4bb660922f5416c57" - integrity sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA== - dependencies: - cac "^6.7.14" - debug "^4.3.4" - pathe "^1.1.1" - picocolors "^1.0.0" - vite "^5.0.0" - -vite-plugin-checker@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/vite-plugin-checker/-/vite-plugin-checker-0.11.0.tgz#063ce180c3751b790a6472e19c5d1a352b215070" - integrity sha512-iUdO9Pl9UIBRPAragwi3as/BXXTtRu4G12L3CMrjx+WVTd9g/MsqNakreib9M/2YRVkhZYiTEwdH2j4Dm0w7lw== - dependencies: - "@babel/code-frame" "^7.27.1" - chokidar "^4.0.3" - npm-run-path "^6.0.0" - picocolors "^1.1.1" - picomatch "^4.0.3" - tiny-invariant "^1.3.3" - tinyglobby "^0.2.14" - vscode-uri "^3.1.0" - -vite-plugin-dts@~4.5.0: - version "4.5.4" - resolved "https://registry.yarnpkg.com/vite-plugin-dts/-/vite-plugin-dts-4.5.4.tgz#51b60aaaa760d9cf5c2bb3676c69d81910d6b08c" - integrity sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg== - dependencies: - "@microsoft/api-extractor" "^7.50.1" - "@rollup/pluginutils" "^5.1.4" - "@volar/typescript" "^2.4.11" - "@vue/language-core" "2.2.0" - compare-versions "^6.1.1" - debug "^4.4.0" - kolorist "^1.8.0" - local-pkg "^1.0.0" - magic-string "^0.30.17" - -vite@^5.0.0, vite@^5.4.19: - version "5.4.21" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.21.tgz#84a4f7c5d860b071676d39ba513c0d598fdc7027" - integrity sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw== - dependencies: - esbuild "^0.21.3" - postcss "^8.4.43" - rollup "^4.20.0" - optionalDependencies: - fsevents "~2.3.3" - -vitest@^1.6: - version "1.6.1" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.6.1.tgz#b4a3097adf8f79ac18bc2e2e0024c534a7a78d2f" - integrity sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag== - dependencies: - "@vitest/expect" "1.6.1" - "@vitest/runner" "1.6.1" - "@vitest/snapshot" "1.6.1" - "@vitest/spy" "1.6.1" - "@vitest/utils" "1.6.1" - acorn-walk "^8.3.2" - chai "^4.3.10" - debug "^4.3.4" - execa "^8.0.1" - local-pkg "^0.5.0" - magic-string "^0.30.5" - pathe "^1.1.1" - picocolors "^1.0.0" - std-env "^3.5.0" - strip-literal "^2.0.0" - tinybench "^2.5.1" - tinypool "^0.8.3" - vite "^5.0.0" - vite-node "1.6.1" - why-is-node-running "^2.2.2" - -void-elements@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" - integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== - -vscode-languageserver-textdocument@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz#457ee04271ab38998a093c68c2342f53f6e4a631" - integrity sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA== - -vscode-uri@^3.0.8, vscode-uri@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.1.0.tgz#dd09ec5a66a38b5c3fffc774015713496d14e09c" - integrity sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ== - -w3c-keyname@^2.2.0: - version "2.2.8" - resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" - integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== - -w3c-xmlserializer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" - integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== - dependencies: - xml-name-validator "^4.0.0" - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -watchpack@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.5.1.tgz#dd38b601f669e0cbf567cb802e75cead82cde102" - integrity sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wcwidth@^1.0.0, wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webidl-conversions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" - integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== - -webpack-cli@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-6.0.1.tgz#a1ce25da5ba077151afd73adfa12e208e5089207" - integrity sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw== - dependencies: - "@discoveryjs/json-ext" "^0.6.1" - "@webpack-cli/configtest" "^3.0.1" - "@webpack-cli/info" "^3.0.1" - "@webpack-cli/serve" "^3.0.1" - colorette "^2.0.14" - commander "^12.1.0" - cross-spawn "^7.0.3" - envinfo "^7.14.0" - fastest-levenshtein "^1.0.12" - import-local "^3.0.2" - interpret "^3.1.1" - rechoir "^0.8.0" - webpack-merge "^6.0.1" - -webpack-merge@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-6.0.1.tgz#50c776868e080574725abc5869bd6e4ef0a16c6a" - integrity sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg== - dependencies: - clone-deep "^4.0.1" - flat "^5.0.2" - wildcard "^2.0.1" - -webpack-sources@^3.3.3: - version "3.3.4" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.4.tgz#a338b95eb484ecc75fbb196cbe8a2890618b4891" - integrity sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q== - -webpack-virtual-modules@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz#057faa9065c8acf48f24cb57ac0e77739ab9a7e8" - integrity sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ== - -webpack@^5.101.3, webpack@^5.104.0: - version "5.105.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.105.2.tgz#f3b76f9fc36f1152e156e63ffda3bbb82e6739ea" - integrity sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw== - dependencies: - "@types/eslint-scope" "^3.7.7" - "@types/estree" "^1.0.8" - "@types/json-schema" "^7.0.15" - "@webassemblyjs/ast" "^1.14.1" - "@webassemblyjs/wasm-edit" "^1.14.1" - "@webassemblyjs/wasm-parser" "^1.14.1" - acorn "^8.15.0" - acorn-import-phases "^1.0.3" - browserslist "^4.28.1" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.19.0" - es-module-lexer "^2.0.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.11" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.3.1" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^4.3.3" - tapable "^2.3.0" - terser-webpack-plugin "^5.3.16" - watchpack "^2.5.1" - webpack-sources "^3.3.3" - -whatwg-encoding@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" - integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== - dependencies: - iconv-lite "0.6.3" - -whatwg-mimetype@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" - integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== - -whatwg-url@^12.0.0, whatwg-url@^12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-12.0.1.tgz#fd7bcc71192e7c3a2a97b9a8d6b094853ed8773c" - integrity sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ== - dependencies: - tr46 "^4.1.1" - webidl-conversions "^7.0.0" - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" - integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== - dependencies: - is-bigint "^1.1.0" - is-boolean-object "^1.2.1" - is-number-object "^1.1.1" - is-string "^1.1.1" - is-symbol "^1.1.1" - -which-builtin-type@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" - integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== - dependencies: - call-bound "^1.0.2" - function.prototype.name "^1.1.6" - has-tostringtag "^1.0.2" - is-async-function "^2.0.0" - is-date-object "^1.1.0" - is-finalizationregistry "^1.1.0" - is-generator-function "^1.0.10" - is-regex "^1.2.1" - is-weakref "^1.0.2" - isarray "^2.0.5" - which-boxed-primitive "^1.1.0" - which-collection "^1.0.2" - which-typed-array "^1.1.16" - -which-collection@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" - integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== - dependencies: - is-map "^2.0.3" - is-set "^2.0.3" - is-weakmap "^2.0.2" - is-weakset "^2.0.3" - -which-typed-array@^1.1.16, which-typed-array@^1.1.19: - version "1.1.20" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.20.tgz#3fdb7adfafe0ea69157b1509f3a1cd892bd1d122" - integrity sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - call-bound "^1.0.4" - for-each "^0.3.5" - get-proto "^1.0.1" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - -which@^1.2.14: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -why-is-node-running@^2.2.2: - version "2.3.0" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" - integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== - dependencies: - siginfo "^2.0.0" - stackback "0.0.2" - -wildcard@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" - integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@7.0.0, wrap-ansi@^7.0.0, wrap-ansi@^8.1.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -write-file-atomic@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" - integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^4.0.1" - -ws@8.18.0: - version "8.18.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" - integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== - -ws@^8.13.0, ws@^8.18.0: - version "8.19.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.19.0.tgz#ddc2bdfa5b9ad860204f5a72a4863a8895fd8c8b" - integrity sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg== - -wsl-utils@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/wsl-utils/-/wsl-utils-0.1.0.tgz#8783d4df671d4d50365be2ee4c71917a0557baab" - integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw== - dependencies: - is-wsl "^3.1.0" - -xdg-basedir@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" - integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== - -xml-name-validator@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" - integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yaml@^2.5.1, yaml@^2.6.0, yaml@^2.8.2: - version "2.8.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.2.tgz#5694f25eca0ce9c3e7a9d9e00ce0ddabbd9e35c5" - integrity sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A== - -yargs-parser@21.1.1, yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@17.7.2, yargs@^17.3.1, yargs@^17.6.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -yocto-queue@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.2.2.tgz#3e09c95d3f1aa89a58c114c99223edf639152c00" - integrity sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ== - -"zod-validation-error@^3.5.0 || ^4.0.0": - version "4.0.2" - resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-4.0.2.tgz#bc605eba49ce0fcd598c127fee1c236be3f22918" - integrity sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ== - -"zod@^3.25.0 || ^4.0.0", zod@^4.3.5: - version "4.3.6" - resolved "https://registry.yarnpkg.com/zod/-/zod-4.3.6.tgz#89c56e0aa7d2b05107d894412227087885ab112a" - integrity sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg== - -zwitch@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" - integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== diff --git a/tutorials/vonage_video_react_app-feature-config/steps/01-backend-setup/index.html b/tutorials/vonage_video_react_app-feature-config/steps/01-backend-setup/index.html new file mode 100644 index 00000000..1f4a231a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/01-backend-setup/index.html @@ -0,0 +1,68 @@ + Backend Credentials | Vonage Coding Exercise + Skip to content

Backend Credentials

Before configuring any features, the backend needs to know your Vonage application credentials. These are stored in a .env file inside the backend/ folder that you must create manually — they cannot be generated for you.

The repo includes a backend/.env.example with all the required variables already listed. Copy it to create your own .env:

Terminal window
cp backend/.env.example backend/.env

Then open backend/.env and replace the placeholder values with your own:

backend/.env
VONAGE_APP_ID=your-vonage-application-id
VONAGE_PRIVATE_KEY=./private.key
VariableWhere to find it
VONAGE_APP_IDVonage Dashboard → Your Applications → the app you created for this project
VONAGE_PRIVATE_KEYThe private.key file downloaded when you created the Vonage Application. Place it in the backend/ folder and set the path to ./private.key

Once the file is saved, confirm its contents look correct:

Terminal window
cat backend/.env

You should see your App ID and the key path. With credentials in place, let's look at the frontend configuration file.

\ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/01-config-file-overview/index.html b/tutorials/vonage_video_react_app-feature-config/steps/01-config-file-overview/index.html new file mode 100644 index 00000000..3af42978 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/01-config-file-overview/index.html @@ -0,0 +1,68 @@ + The Config File | Vonage Coding Exercise + Skip to content

The Config File

All frontend settings for the Vonage Video React App live in a single file at the project root: vcrBuild.env.sh. This is the one place you need to go to control features, display defaults, and other frontend behaviour.

  • vcrBuild.env.sh ← All frontend configuration goes here
  • Directorybackend/
    • .env ← Backend credentials (separate)
  • Directoryfrontend/
  • Directorylibs/

vcrBuild.env.sh is a shell script that exports environment variables. It is loaded automatically every time you run the app or trigger a build — you never need to source it manually.

vcrBuild.env.sh
export ALLOW_CHAT=true
export ALLOW_ARCHIVING=true
export DEFAULT_LAYOUT_MODE='active-speaker'

Open vcrBuild.env.sh in your editor:

Terminal window
code vcrBuild.env.sh

The defaults work out of the box — all major features are enabled and the resolution is set to 1280×720. You only need to edit the file when you want to change a specific behaviour.

Now let's look at the feature flags you can control.

\ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/02-feature-flags/index.html b/tutorials/vonage_video_react_app-feature-config/steps/02-feature-flags/index.html new file mode 100644 index 00000000..4ea29b01 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/02-feature-flags/index.html @@ -0,0 +1,68 @@ + Feature Flags | Vonage Coding Exercise + Skip to content

Feature Flags

Feature flags let you enable or disable specific capabilities of the app without changing any source code. Each flag is a boolean true / false value in vcrBuild.env.sh.

VariableDefaultDescription
ALLOW_CAMERA_CONTROLtrueShow the camera on/off toggle
ALLOW_VIDEO_ON_JOINtrueStart with camera enabled when joining
ALLOW_MICROPHONE_CONTROLtrueShow the microphone on/off toggle
ALLOW_AUDIO_ON_JOINtrueStart with microphone enabled when joining
ALLOW_ADVANCED_NOISE_SUPPRESSIONtrueEnable the advanced noise-suppression toggle
ALLOW_BACKGROUND_EFFECTStrueEnable virtual background and blur effects
VariableDefaultDescription
WAITING_ROOM_ALLOW_DEVICE_SELECTIONtrueShow device selectors in the waiting room
MEETING_ROOM_ALLOW_DEVICE_SELECTIONtrueShow device selectors inside the meeting room
VariableDefaultDescription
ALLOW_ARCHIVINGtrueEnable meeting recording
ALLOW_CAPTIONStrueEnable live captions
ALLOW_CHATtrueEnable the in-call group chat
ALLOW_EMOJIStrueEnable emoji reactions
ALLOW_SCREEN_SHAREtrueEnable screen sharing
SHOW_PARTICIPANT_LISTtrueShow the participant list panel
VariableDefaultDescription
ENABLE_REPORT_ISSUEfalseShow the in-call issue reporting tool
BYPASS_WAITING_ROOMfalseSkip the waiting room and join directly
AVOID_FETCHING_APP_CONFIGtrueSkip fetching remote app configuration on startup

To create a stripped-down experience with no interactive tools, you might disable several flags at once:

vcrBuild.env.sh
export ALLOW_CHAT=false
export ALLOW_EMOJIS=false
export ALLOW_SCREEN_SHARE=false
export ALLOW_ARCHIVING=false
export ALLOW_CAPTIONS=false
export ENABLE_REPORT_ISSUE=false
export SHOW_PARTICIPANT_LIST=false

You have reviewed all the feature flags. Next, you will look at display defaults like resolution and room layout.

\ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/03-display-defaults/index.html b/tutorials/vonage_video_react_app-feature-config/steps/03-display-defaults/index.html new file mode 100644 index 00000000..17af5f0f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/03-display-defaults/index.html @@ -0,0 +1,68 @@ + Display Defaults | Vonage Coding Exercise + Skip to content

Display Defaults

Beyond feature flags, vcrBuild.env.sh also controls the default visual and performance settings of the video room — the starting resolution, room layout, bitrate limits, and available frame rates.

DEFAULT_RESOLUTION sets the outgoing video resolution when a participant joins.

ValueDescription
1920x1080Full HD
1280x960HD (4:3)
1280x720HD 720p (default)
640x480SD (4:3)
640x360SD 360p
320x240Low (4:3)
320x180Low 180p
Terminal window
export DEFAULT_RESOLUTION='1280x720'

DEFAULT_LAYOUT_MODE controls which layout is shown when a participant first enters the room.

ValueDescription
active-speakerHighlights the current speaker (default)
gridShows all participants in an equal grid
Terminal window
export DEFAULT_LAYOUT_MODE='active-speaker'

These settings control the minimum and maximum selectable bitrate in the Advanced Settings dialog.

VariableDefaultDescription
MIN_CUSTOM_VIDEO_BITRATE_BPS5000Minimum selectable bitrate in bps
MAX_CUSTOM_VIDEO_BITRATE_BPS10000000Maximum selectable bitrate in bps
Terminal window
export MIN_CUSTOM_VIDEO_BITRATE_BPS=5000
export MAX_CUSTOM_VIDEO_BITRATE_BPS=10000000

SUPPORTED_FRAME_RATES defines the frame rate options shown in the Advanced Settings video tab. Values are positive integers separated by |.

Terminal window
export SUPPORTED_FRAME_RATES='30|15|7|1'

You have configured the display defaults. In the next step, you will apply all your changes and verify them.

\ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/04-apply-changes/index.html b/tutorials/vonage_video_react_app-feature-config/steps/04-apply-changes/index.html new file mode 100644 index 00000000..f224d649 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/04-apply-changes/index.html @@ -0,0 +1,68 @@ + Apply Your Changes | Vonage Coding Exercise + Skip to content

Apply Your Changes

With your feature flags and display defaults configured, this step shows you how to apply the changes and confirm they are working in the running app.

After editing vcrBuild.env.sh, save the file and restart the development server:

Terminal window
yarn dev

This reloads both the backend server (port 3345) and the frontend Vite dev server (port 5173) with the updated configuration.

Open http://localhost:5173 and check that your changes are reflected:

  1. Navigate to the waiting room — confirm device selectors appear or are hidden based on WAITING_ROOM_ALLOW_DEVICE_SELECTION.

  2. Join a meeting room — confirm the initial layout matches DEFAULT_LAYOUT_MODE.

  3. Check the toolbar — verify that toggles for chat, screen share, emojis, and archiving match your flag settings.

  4. Open Advanced Settings — confirm the resolution options and bitrate range reflect your DEFAULT_RESOLUTION and bitrate values.

Some settings only take effect when a participant rejoins the room (not on live reload):

  • DEFAULT_LAYOUT_MODE
  • ALLOW_AUDIO_ON_JOIN
  • ALLOW_VIDEO_ON_JOIN

If you changed any of these, leave the room and re-enter to see the updated behaviour.

A typical configure-test cycle:

  1. Edit vcrBuild.env.sh.

  2. Stop the server with Ctrl+C.

  3. Run yarn dev to restart.

  4. Open the app and verify.

Your configuration is live. Head to the final step for further resources.

\ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/05-whats-next/index.html b/tutorials/vonage_video_react_app-feature-config/steps/05-whats-next/index.html new file mode 100644 index 00000000..e5e8b23d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/05-whats-next/index.html @@ -0,0 +1,68 @@ + What's Next | Vonage Coding Exercise + Skip to content

What's Next

Congratulations! You have successfully configured the Vonage Video React App's features and display defaults using vcrBuild.env.sh. The app is now tailored to your specific use case.

  • Understood how all frontend configuration flows through vcrBuild.env.sh
  • Enabled and disabled feature flags for media controls, in-call tools, and room behaviour
  • Configured display defaults including resolution, layout mode, bitrate, and frame rates
  • Applied your changes by restarting the dev server and verified them in the browser
\ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/404.html b/tutorials/vonage_video_react_app-feature-config/steps/404.html new file mode 100644 index 00000000..71f8eb98 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/404.html @@ -0,0 +1,36 @@ + 404 | Vonage Coding Exercise + Skip to content

404

Page not found. Check the URL or try using the search bar.
\ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js b/tutorials/vonage_video_react_app-feature-config/steps/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js new file mode 100644 index 00000000..b2fd2978 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js @@ -0,0 +1 @@ +import{S as r}from"./TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js";class c extends r{set current(e){super.current=e;const t=this.querySelector(".display-current");t&&(t.textContent=e.textContent)}constructor(){super();const e=this.querySelector("details");if(!e)return;const t=()=>{e.open=!1};e.querySelectorAll("a").forEach(s=>{s.addEventListener("click",t)}),window.addEventListener("click",s=>{e.contains(s.target)||t()}),window.addEventListener("keydown",s=>{if(s.key==="Escape"&&e.open){const o=e.contains(document.activeElement);if(t(),o){const n=e.querySelector("summary");n&&n.focus()}}})}}customElements.define("mobile-starlight-toc",c); diff --git a/tutorials/vonage_video_react_app-feature-config/steps/_astro/Search.astro_astro_type_script_index_0_lang.EjmW2doR.js b/tutorials/vonage_video_react_app-feature-config/steps/_astro/Search.astro_astro_type_script_index_0_lang.EjmW2doR.js new file mode 100644 index 00000000..3e69e3a3 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/_astro/Search.astro_astro_type_script_index_0_lang.EjmW2doR.js @@ -0,0 +1 @@ +const w="modulepreload",y=function(f){return"/"+f},g={},E=function(m,l,c){let h=Promise.resolve();if(l&&l.length>0){let o=function(n){return Promise.all(n.map(a=>Promise.resolve(a).then(r=>({status:"fulfilled",value:r}),r=>({status:"rejected",reason:r}))))};document.getElementsByTagName("link");const t=document.querySelector("meta[property=csp-nonce]"),u=t?.nonce||t?.getAttribute("nonce");h=o(l.map(n=>{if(n=y(n),n in g)return;g[n]=!0;const a=n.endsWith(".css"),r=a?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${n}"]${r}`))return;const e=document.createElement("link");if(e.rel=a?"stylesheet":w,a||(e.as="script"),e.crossOrigin="",e.href=n,u&&e.setAttribute("nonce",u),document.head.appendChild(e),a)return new Promise((i,s)=>{e.addEventListener("load",i),e.addEventListener("error",()=>s(new Error(`Unable to preload CSS for ${n}`)))})}))}function d(o){const t=new Event("vite:preloadError",{cancelable:!0});if(t.payload=o,window.dispatchEvent(t),!t.defaultPrevented)throw o}return h.then(o=>{for(const t of o||[])t.status==="rejected"&&d(t.reason);return m().catch(d)})},S={};class v extends HTMLElement{constructor(){super();const m=this.querySelector("button[data-open-modal]"),l=this.querySelector("button[data-close-modal]"),c=this.querySelector("dialog"),h=this.querySelector(".dialog-frame"),d=e=>{("href"in(e.target||{})||document.body.contains(e.target)&&!h.contains(e.target))&&t()},o=e=>{c.showModal(),document.body.toggleAttribute("data-search-modal-open",!0),this.querySelector("input")?.focus(),e?.stopPropagation(),window.addEventListener("click",d)},t=()=>c.close();m.addEventListener("click",o),m.disabled=!1,l.addEventListener("click",t),c.addEventListener("close",()=>{document.body.toggleAttribute("data-search-modal-open",!1),window.removeEventListener("click",d)}),window.addEventListener("keydown",e=>{(e.metaKey===!0||e.ctrlKey===!0)&&e.key==="k"&&(c.open?t():o(),e.preventDefault())});let u={};try{u=JSON.parse(this.dataset.translations||"{}")}catch{}const r=this.dataset.stripTrailingSlash!==void 0?e=>e.replace(/(.)\/(#.*)?$/,"$1$2"):e=>e;window.addEventListener("DOMContentLoaded",()=>{(window.requestIdleCallback||(i=>setTimeout(i,1)))(async()=>{const{PagefindUI:i}=await E(async()=>{const{PagefindUI:s}=await import("./ui-core.CJyTyO9Y.js");return{PagefindUI:s}},[]);new i({...S,element:"#starlight__search",baseUrl:"/",bundlePath:"/".replace(/\/$/,"")+"/pagefind/",showImages:!1,translations:u,showSubResults:!0,processResult:s=>{s.url=r(s.url),s.sub_results=s.sub_results.map(p=>(p.url=r(p.url),p))}})})})}}customElements.define("site-search",v);export{E as _}; diff --git a/tutorials/vonage_video_react_app-feature-config/steps/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js b/tutorials/vonage_video_react_app-feature-config/steps/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js new file mode 100644 index 00000000..53de038b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js @@ -0,0 +1 @@ +const m="_top";class H extends HTMLElement{constructor(){super(),this._current=this.querySelector('a[aria-current="true"]'),this.minH=parseInt(this.dataset.minH||"2",10),this.maxH=parseInt(this.dataset.maxH||"3",10),this.tocHeadingSelector=`h1#${m},:where(${[...Array.from({length:1+this.maxH-this.minH}).map((e,n)=>`h${this.minH+n}`)].join()})[id]`,this.onIdle=e=>(window.requestIdleCallback||(n=>setTimeout(n,1)))(e),this.init=()=>{const e=[...this.querySelectorAll("a")],n=t=>t.matches(this.tocHeadingSelector),i=t=>{if(!t)return null;const h=t;for(;t;){if(t.matches(".sl-markdown-content, main > *"))return document.getElementById(m);if(n(t))return t;const s=t.querySelector(this.tocHeadingSelector);if(s)return s;for(t=t.previousElementSibling;t?.lastElementChild;)t=t.lastElementChild;const o=i(t);if(o)return o}return i(h.parentElement)},c=t=>{for(const{isIntersecting:h,target:s}of t){if(!h)continue;const o=i(s);if(!o)continue;const l=e.find(g=>g.hash==="#"+encodeURIComponent(o.id));if(l){this.current=l;break}}},a=document.querySelectorAll([`main :where(${this.tocHeadingSelector})`,`main :where(${this.tocHeadingSelector}, .sl-heading-wrapper) ~ *:not(:has(${this.tocHeadingSelector}))`,`main .sl-markdown-content > *:not(:has(${this.tocHeadingSelector}))`,`main > *:not(:has(${this.tocHeadingSelector}))`].join());let r;const u=()=>{r||(r=new IntersectionObserver(c,{rootMargin:this.getRootMargin()}),a.forEach(t=>r.observe(t)))};u();let d;window.addEventListener("resize",()=>{r&&(r.disconnect(),r=void 0),clearTimeout(d),d=setTimeout(()=>this.onIdle(u),200)})},this.onIdle(()=>this.init())}set current(e){e!==this._current&&(this._current&&this._current.removeAttribute("aria-current"),e.setAttribute("aria-current","true"),this._current=e)}getRootMargin(){const e=document.querySelector("header")?.getBoundingClientRect().height||0,n=this.querySelector("summary")?.getBoundingClientRect().height||0,i=e+n+32,c=i+53,a=document.documentElement.clientHeight;return`-${i}px 0% ${c-a}px`}}customElements.define("starlight-toc",H);export{H as S}; diff --git a/tutorials/vonage_video_react_app-feature-config/steps/_astro/ec.0vx5m.js b/tutorials/vonage_video_react_app-feature-config/steps/_astro/ec.0vx5m.js new file mode 100644 index 00000000..2350adcd --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/_astro/ec.0vx5m.js @@ -0,0 +1,3 @@ +try{(()=>{function a(e){if(!e)return;let t=e.getAttribute("tabindex")!==null,r=e.scrollWidth>e.clientWidth;r&&!t?(e.setAttribute("tabindex","0"),e.setAttribute("role","region")):!r&&t&&(e.removeAttribute("tabindex"),e.removeAttribute("role"))}var u=window.requestIdleCallback||(e=>setTimeout(e,1)),s=window.cancelIdleCallback||clearTimeout;function l(e){let t=new Set,r,n;return new ResizeObserver(c=>{c.forEach(o=>t.add(o.target)),r&&clearTimeout(r),n&&s(n),r=setTimeout(()=>{n&&s(n),n=u(()=>{t.forEach(o=>e(o)),t.clear()})},250)})}function i(e,t){e.querySelectorAll?.(".expressive-code pre > code").forEach(r=>{let n=r.parentElement;n&&t.observe(n)})}var d=l(a);i(document,d);var b=new MutationObserver(e=>e.forEach(t=>t.addedNodes.forEach(r=>{i(r,d)})));b.observe(document.body,{childList:!0,subtree:!0});document.addEventListener("astro:page-load",()=>{i(document,d)});})();}catch(e){console.error("[EC] tabindex-js-module failed:",e)} +try{(()=>{function l(o){let e=document.createElement("pre");Object.assign(e.style,{opacity:"0",pointerEvents:"none",position:"absolute",overflow:"hidden",left:"0",top:"0",width:"20px",height:"20px",webkitUserSelect:"auto",userSelect:"all"}),e.ariaHidden="true",e.textContent=o,document.body.appendChild(e);let a=document.createRange();a.selectNode(e);let n=getSelection();if(!n)return!1;n.removeAllRanges(),n.addRange(a);let r=!1;try{r=document.execCommand("copy")}finally{n.removeAllRanges(),document.body.removeChild(e)}return r}async function u(o){let e=o.currentTarget,a=e.dataset,n=!1,r=a.code.replace(/\u007f/g,` +`);try{await navigator.clipboard.writeText(r),n=!0}catch{n=l(r)}if(!n||e.parentNode?.querySelector(".feedback"))return;let c=e.parentNode?.querySelector("[aria-live]"),t=document.createElement("div");t.classList.add("feedback"),t.append(a.copied),c.append(t),t.offsetWidth,requestAnimationFrame(()=>t?.classList.add("show"));let s=()=>!t||t.classList.remove("show"),d=()=>{!t||parseFloat(getComputedStyle(t).opacity)>0||(t.remove(),t=void 0)};setTimeout(s,1500),setTimeout(d,2500),e.addEventListener("blur",s),t.addEventListener("transitioncancel",d),t.addEventListener("transitionend",d)}function i(o){o.querySelectorAll?.(".expressive-code .copy button").forEach(e=>e.addEventListener("click",u))}i(document);var m=new MutationObserver(o=>o.forEach(e=>e.addedNodes.forEach(a=>{i(a)})));m.observe(document.body,{childList:!0,subtree:!0});document.addEventListener("astro:page-load",()=>{i(document)});})();}catch(e){console.error("[EC] copy-js-module failed:",e)} \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/_astro/ec.v4551.css b/tutorials/vonage_video_react_app-feature-config/steps/_astro/ec.v4551.css new file mode 100644 index 00000000..06a90681 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/_astro/ec.v4551.css @@ -0,0 +1 @@ +@layer starlight.components{.expressive-code{font-family:var(--ec-uiFontFml);font-size:var(--ec-uiFontSize);font-weight:var(--ec-uiFontWg);line-height:var(--ec-uiLineHt);text-size-adjust:none;-webkit-text-size-adjust:none}.expressive-code *:not(:is(svg, svg *)){all:revert;box-sizing:border-box}.expressive-code pre{display:flex;margin:0;padding:0;border:var(--ec-brdWd) solid var(--ec-brdCol);border-radius:calc(var(--ec-brdRad) + var(--ec-brdWd));background:var(--ec-codeBg)}.expressive-code pre:focus-visible{outline:3px solid var(--ec-focusBrd);outline-offset:-3px}.expressive-code pre > code{all:unset;display:block;flex:1 0 100%;padding:var(--ec-codePadBlk) 0;color:var(--ec-codeFg);font-family:var(--ec-codeFontFml);font-size:var(--ec-codeFontSize);font-weight:var(--ec-codeFontWg);line-height:var(--ec-codeLineHt)}.expressive-code pre{overflow-x:auto}.expressive-code pre.wrap .ec-line .code{white-space:pre-wrap;overflow-wrap:break-word;min-width:min(20ch, var(--ecMaxLine, 20ch))}.expressive-code pre.wrap .ec-line .code span.indent{white-space:pre}.expressive-code pre::-webkit-scrollbar,.expressive-code pre::-webkit-scrollbar-track{background-color:inherit;border-radius:calc(var(--ec-brdRad) + var(--ec-brdWd));border-top-left-radius:0;border-top-right-radius:0}.expressive-code pre::-webkit-scrollbar-thumb{background-color:var(--ec-sbThumbCol);border:4px solid transparent;background-clip:content-box;border-radius:10px}.expressive-code pre::-webkit-scrollbar-thumb:hover{background-color:var(--ec-sbThumbHoverCol)}.expressive-code .ec-line{direction:ltr;unicode-bidi:isolate;display:grid;grid-template-areas:'gutter code';grid-template-columns:auto 1fr;position:relative}.expressive-code .ec-line .gutter{grid-area:gutter;color:var(--ec-gtrFg)}.expressive-code .ec-line .gutter > *{pointer-events:none;user-select:none;-webkit-user-select:none}.expressive-code .ec-line .gutter ~ .code{--ecLineBrdCol:var(--ec-gtrBrdCol)}.expressive-code .ec-line.highlight .gutter{color:var(--ec-gtrHlFg)}.expressive-code .ec-line .code{grid-area:code;position:relative;box-sizing:content-box;padding-inline-start:calc(var(--ecIndent, 0ch) + var(--ec-codePadInl) - var(--ecGtrBrdWd));padding-inline-end:var(--ec-codePadInl);text-indent:calc(var(--ecIndent, 0ch) * -1)}.expressive-code .ec-line .code::before,.expressive-code .ec-line .code::after,.expressive-code .ec-line .code :where(*){text-indent:0}.expressive-code .ec-line .code{--ecGtrBrdWd:var(--ec-gtrBrdWd);border-inline-start:var(--ecGtrBrdWd) solid var(--ecLineBrdCol, transparent)}.expressive-code .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0}.expressive-code .ec-line.mark{--tmLineBgCol:var(--ec-tm-markBg)}.expressive-code .ec-line.mark .code{--ecLineBrdCol:var(--ec-tm-markBrdCol)}.expressive-code .ec-line.ins{--tmLineBgCol:var(--ec-tm-insBg);--tmLabel:var(--ec-tm-insDiffIndContent)}.expressive-code .ec-line.ins .code{--ecLineBrdCol:var(--ec-tm-insBrdCol)}.expressive-code .ec-line.ins .code::before{color:var(--ec-tm-insDiffIndCol)}.expressive-code .ec-line.del{--tmLineBgCol:var(--ec-tm-delBg);--tmLabel:var(--ec-tm-delDiffIndContent)}.expressive-code .ec-line.del .code{--ecLineBrdCol:var(--ec-tm-delBrdCol)}.expressive-code .ec-line.del .code::before{color:var(--ec-tm-delDiffIndCol)}.expressive-code .ec-line.mark,.expressive-code .ec-line.ins,.expressive-code .ec-line.del{background:var(--tmLineBgCol)}.expressive-code .ec-line.mark .code,.expressive-code .ec-line.ins .code,.expressive-code .ec-line.del .code{--ecGtrBrdWd:var(--ec-tm-lineMarkerAccentWd)}.expressive-code .ec-line.mark .code::before,.expressive-code .ec-line.ins .code::before,.expressive-code .ec-line.del .code::before{display:block;position:absolute;left:0;box-sizing:border-box;content:var(--tmLabel, ' ');padding-inline-start:var(--ec-tm-lineDiffIndMargLeft);text-align:center;white-space:pre}.expressive-code .ec-line.mark.tm-label .code::before,.expressive-code .ec-line.ins.tm-label .code::before,.expressive-code .ec-line.del.tm-label .code::before{background:var(--ecLineBrdCol);padding:0 calc(var(--ec-tm-lineMarkerLabelPadInl) + var(--ec-tm-lineMarkerAccentWd)) 0 var(--ec-tm-lineMarkerLabelPadInl);color:var(--ec-tm-lineMarkerLabelCol)}.expressive-code .ec-line mark{--tmInlineBgCol:var(--ec-tm-markBg);--tmInlineBrdCol:var(--ec-tm-markBrdCol)}.expressive-code .ec-line ins{--tmInlineBgCol:var(--ec-tm-insBg);--tmInlineBrdCol:var(--ec-tm-insBrdCol)}.expressive-code .ec-line del{--tmInlineBgCol:var(--ec-tm-delBg);--tmInlineBrdCol:var(--ec-tm-delBrdCol)}.expressive-code .ec-line mark,.expressive-code .ec-line ins,.expressive-code .ec-line del{all:unset;display:inline-block;position:relative;--tmBrdL:var(--ec-tm-inlMarkerBrdWd);--tmBrdR:var(--ec-tm-inlMarkerBrdWd);--tmRadL:var(--ec-tm-inlMarkerBrdRad);--tmRadR:var(--ec-tm-inlMarkerBrdRad);margin-inline:0.025rem;padding-inline:var(--ec-tm-inlMarkerPad);border-radius:var(--tmRadL) var(--tmRadR) var(--tmRadR) var(--tmRadL);background:var(--tmInlineBgCol);background-clip:padding-box}.expressive-code .ec-line mark.open-start,.expressive-code .ec-line ins.open-start,.expressive-code .ec-line del.open-start{margin-inline-start:0;padding-inline-start:0;--tmBrdL:0px;--tmRadL:0}.expressive-code .ec-line mark.open-end,.expressive-code .ec-line ins.open-end,.expressive-code .ec-line del.open-end{margin-inline-end:0;padding-inline-end:0;--tmBrdR:0px;--tmRadR:0}.expressive-code .ec-line mark::before,.expressive-code .ec-line ins::before,.expressive-code .ec-line del::before{content:'';position:absolute;pointer-events:none;display:inline-block;inset:0;border-radius:var(--tmRadL) var(--tmRadR) var(--tmRadR) var(--tmRadL);border:var(--ec-tm-inlMarkerBrdWd) solid var(--tmInlineBrdCol);border-inline-width:var(--tmBrdL) var(--tmBrdR)}.expressive-code .frame{all:unset;position:relative;display:block;--header-border-radius:calc(var(--ec-brdRad) + var(--ec-brdWd));--tab-border-radius:calc(var(--ec-frm-edTabBrdRad) + var(--ec-brdWd));--button-spacing:0.4rem;--code-background:var(--ec-frm-edBg);border-radius:var(--header-border-radius);box-shadow:var(--ec-frm-frameBoxShdCssVal)}.expressive-code .frame .header{display:none;z-index:1;position:relative;border-radius:var(--header-border-radius) var(--header-border-radius) 0 0}.expressive-code .frame.has-title pre,.expressive-code .frame.has-title code,.expressive-code .frame.is-terminal pre,.expressive-code .frame.is-terminal code{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.expressive-code .frame .title:empty:before{content:'\a0'}.expressive-code .frame.has-title:not(.is-terminal){--button-spacing:calc(1.9rem + 2 * (var(--ec-uiPadBlk) + var(--ec-frm-edActTabIndHt)))}.expressive-code .frame.has-title:not(.is-terminal) .title{position:relative;color:var(--ec-frm-edActTabFg);background:var(--ec-frm-edActTabBg);background-clip:padding-box;margin-block-start:var(--ec-frm-edTabsMargBlkStart);padding:calc(var(--ec-uiPadBlk) + var(--ec-frm-edActTabIndHt)) var(--ec-uiPadInl);border:var(--ec-brdWd) solid var(--ec-frm-edActTabBrdCol);border-radius:var(--tab-border-radius) var(--tab-border-radius) 0 0;border-bottom:none;overflow:hidden}.expressive-code .frame.has-title:not(.is-terminal) .title::after{content:'';position:absolute;pointer-events:none;inset:0;border-top:var(--ec-frm-edActTabIndHt) solid var(--ec-frm-edActTabIndTopCol);border-bottom:var(--ec-frm-edActTabIndHt) solid var(--ec-frm-edActTabIndBtmCol)}.expressive-code .frame.has-title:not(.is-terminal) .header{display:flex;background:linear-gradient(to top, var(--ec-frm-edTabBarBrdBtmCol) var(--ec-brdWd), transparent var(--ec-brdWd)),linear-gradient(var(--ec-frm-edTabBarBg), var(--ec-frm-edTabBarBg));background-repeat:no-repeat;padding-inline-start:var(--ec-frm-edTabsMargInlStart)}.expressive-code .frame.has-title:not(.is-terminal) .header::before{content:'';position:absolute;pointer-events:none;inset:0;border:var(--ec-brdWd) solid var(--ec-frm-edTabBarBrdCol);border-radius:inherit;border-bottom:none}.expressive-code .frame.is-terminal{--button-spacing:calc(1.9rem + var(--ec-brdWd) + 2 * var(--ec-uiPadBlk));--code-background:var(--ec-frm-trmBg)}.expressive-code .frame.is-terminal .header{display:flex;align-items:center;justify-content:center;padding-block:var(--ec-uiPadBlk);padding-block-end:calc(var(--ec-uiPadBlk) + var(--ec-brdWd));position:relative;font-weight:500;letter-spacing:0.025ch;color:var(--ec-frm-trmTtbFg);background:var(--ec-frm-trmTtbBg);border:var(--ec-brdWd) solid var(--ec-brdCol);border-bottom:none}.expressive-code .frame.is-terminal .header::before{content:'';position:absolute;pointer-events:none;left:var(--ec-uiPadInl);width:2.1rem;height:0.56rem;line-height:0;background-color:var(--ec-frm-trmTtbDotsFg);opacity:var(--ec-frm-trmTtbDotsOpa);-webkit-mask-image:var(--ec-frm-trmIcon);-webkit-mask-repeat:no-repeat;mask-image:var(--ec-frm-trmIcon);mask-repeat:no-repeat}.expressive-code .frame.is-terminal .header::after{content:'';position:absolute;pointer-events:none;inset:0;border-bottom:var(--ec-brdWd) solid var(--ec-frm-trmTtbBrdBtmCol)}.expressive-code .frame pre{background:var(--code-background)}.expressive-code .copy{display:flex;gap:0.25rem;flex-direction:row;position:absolute;inset-block-start:calc(var(--ec-brdWd) + var(--button-spacing));inset-inline-end:calc(var(--ec-brdWd) + var(--ec-uiPadInl) / 2)}@media (scripting: none){.expressive-code .copy{display:none}}.expressive-code .copy{direction:ltr;unicode-bidi:isolate}.expressive-code .copy button{position:relative;align-self:flex-end;margin:0;padding:0;border:none;border-radius:0.2rem;z-index:1;cursor:pointer;transition-property:opacity, background, border-color;transition-duration:0.2s;transition-timing-function:cubic-bezier(0.25, 0.46, 0.45, 0.94);width:2.5rem;height:2.5rem;background:var(--code-background);opacity:0.75}.expressive-code .copy button div{position:absolute;inset:0;border-radius:inherit;background:var(--ec-frm-inlBtnBg);opacity:var(--ec-frm-inlBtnBgIdleOpa);transition-property:inherit;transition-duration:inherit;transition-timing-function:inherit}.expressive-code .copy button::before{content:'';position:absolute;pointer-events:none;inset:0;border-radius:inherit;border:var(--ec-brdWd) solid var(--ec-frm-inlBtnBrd);opacity:var(--ec-frm-inlBtnBrdOpa)}.expressive-code .copy button::after{content:'';position:absolute;pointer-events:none;inset:0;background-color:var(--ec-frm-inlBtnFg);-webkit-mask-image:var(--ec-frm-copyIcon);-webkit-mask-repeat:no-repeat;mask-image:var(--ec-frm-copyIcon);mask-repeat:no-repeat;margin:0.475rem;line-height:0}.expressive-code .copy button:hover,.expressive-code .copy button:focus:focus-visible{opacity:1}.expressive-code .copy button:hover div,.expressive-code .copy button:focus:focus-visible div{opacity:var(--ec-frm-inlBtnBgHoverOrFocusOpa)}.expressive-code .copy button:active{opacity:1}.expressive-code .copy button:active div{opacity:var(--ec-frm-inlBtnBgActOpa)}.expressive-code .copy .feedback{--tooltip-arrow-size:0.35rem;--tooltip-bg:var(--ec-frm-tooltipSuccessBg);color:var(--ec-frm-tooltipSuccessFg);pointer-events:none;user-select:none;-webkit-user-select:none;position:relative;align-self:center;background-color:var(--tooltip-bg);z-index:99;padding:0.125rem 0.75rem;border-radius:0.2rem;margin-inline-end:var(--tooltip-arrow-size);opacity:0;transition-property:opacity, transform;transition-duration:0.2s;transition-timing-function:ease-in-out;transform:translate3d(0, 0.25rem, 0)}.expressive-code .copy .feedback::after{content:'';position:absolute;pointer-events:none;top:calc(50% - var(--tooltip-arrow-size));inset-inline-end:calc(-2 * (var(--tooltip-arrow-size) - 0.5px));border:var(--tooltip-arrow-size) solid transparent;border-inline-start-color:var(--tooltip-bg)}.expressive-code .copy .feedback.show{opacity:1;transform:translate3d(0, 0, 0)}@media (hover: hover){.expressive-code{}.expressive-code .copy button{opacity:0;width:2rem;height:2rem}.expressive-code .frame:hover .copy button:not(:hover),.expressive-code .frame:focus-within :focus-visible ~ .copy button:not(:hover),.expressive-code .frame .copy .feedback.show ~ button:not(:hover){opacity:0.75}}.expressive-code :nth-child(1 of .ec-line) .code{padding-inline-end:calc(2rem + var(--ec-codePadInl))}}@layer starlight.components{:root,:root:not([data-theme='dark']) .expressive-code[data-theme='dark']{--ec-brdRad:0px;--ec-brdWd:1px;--ec-brdCol:color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);--ec-codeFontFml:var(--__sl-font-mono);--ec-codeFontSize:var(--sl-text-code);--ec-codeFontWg:400;--ec-codeLineHt:var(--sl-line-height);--ec-codePadBlk:0.75rem;--ec-codePadInl:1rem;--ec-codeBg:#23262f;--ec-codeFg:#d6deeb;--ec-codeSelBg:#1d3b53;--ec-gtrFg:#63798b;--ec-gtrBrdCol:#63798b33;--ec-gtrBrdWd:1.5px;--ec-gtrHlFg:#c5e4fd97;--ec-uiFontFml:var(--__sl-font);--ec-uiFontSize:0.9rem;--ec-uiFontWg:400;--ec-uiLineHt:1.65;--ec-uiPadBlk:0.25rem;--ec-uiPadInl:1rem;--ec-uiSelBg:#234d708c;--ec-uiSelFg:#ffffff;--ec-focusBrd:#122d42;--ec-sbThumbCol:#ffffff17;--ec-sbThumbHoverCol:#ffffff47;--ec-tm-lineMarkerAccentMarg:0rem;--ec-tm-lineMarkerAccentWd:0.15rem;--ec-tm-lineMarkerLabelPadInl:0.2rem;--ec-tm-lineMarkerLabelCol:white;--ec-tm-lineDiffIndMargLeft:0.25rem;--ec-tm-inlMarkerBrdWd:1.5px;--ec-tm-inlMarkerBrdRad:0.2rem;--ec-tm-inlMarkerPad:0.15rem;--ec-tm-insDiffIndContent:'+';--ec-tm-delDiffIndContent:'-';--ec-tm-markBg:#ffffff17;--ec-tm-markBrdCol:#ffffff40;--ec-tm-insBg:#1e571599;--ec-tm-insBrdCol:#487f3bd0;--ec-tm-insDiffIndCol:#79b169d0;--ec-tm-delBg:#862d2799;--ec-tm-delBrdCol:#b4554bd0;--ec-tm-delDiffIndCol:#ed8779d0;--ec-frm-shdCol:#011627;--ec-frm-frameBoxShdCssVal:none;--ec-frm-edActTabBg:var(--sl-color-gray-6);--ec-frm-edActTabFg:var(--sl-color-text);--ec-frm-edActTabBrdCol:transparent;--ec-frm-edActTabIndHt:1px;--ec-frm-edActTabIndTopCol:var(--sl-color-accent-high);--ec-frm-edActTabIndBtmCol:transparent;--ec-frm-edTabsMargInlStart:0;--ec-frm-edTabsMargBlkStart:0;--ec-frm-edTabBrdRad:0px;--ec-frm-edTabBarBg:var(--sl-color-black);--ec-frm-edTabBarBrdCol:color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);--ec-frm-edTabBarBrdBtmCol:color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);--ec-frm-edBg:var(--sl-color-gray-6);--ec-frm-trmTtbDotsFg:color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);--ec-frm-trmTtbDotsOpa:0.75;--ec-frm-trmTtbBg:var(--sl-color-black);--ec-frm-trmTtbFg:var(--sl-color-text);--ec-frm-trmTtbBrdBtmCol:color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);--ec-frm-trmBg:var(--sl-color-gray-6);--ec-frm-inlBtnFg:var(--sl-color-text);--ec-frm-inlBtnBg:var(--sl-color-text);--ec-frm-inlBtnBgIdleOpa:0;--ec-frm-inlBtnBgHoverOrFocusOpa:0.2;--ec-frm-inlBtnBgActOpa:0.3;--ec-frm-inlBtnBrd:var(--sl-color-text);--ec-frm-inlBtnBrdOpa:0.4;--ec-frm-tooltipSuccessBg:#158744;--ec-frm-tooltipSuccessFg:white;--ec-frm-copyIcon:url("data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2024%2024'%20fill%3D'none'%20stroke%3D'black'%20stroke-width%3D'1.75'%3E%3Cpath%20d%3D'M3%2019a2%202%200%200%201-1-2V2a2%202%200%200%201%201-1h13a2%202%200%200%201%202%201'%2F%3E%3Crect%20x%3D'6'%20y%3D'5'%20width%3D'16'%20height%3D'18'%20rx%3D'1.5'%20ry%3D'1.5'%2F%3E%3C%2Fsvg%3E");--ec-frm-trmIcon:url("data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2060%2016'%20preserveAspectRatio%3D'xMidYMid%20meet'%3E%3Ccircle%20cx%3D'8'%20cy%3D'8'%20r%3D'8'%2F%3E%3Ccircle%20cx%3D'30'%20cy%3D'8'%20r%3D'8'%2F%3E%3Ccircle%20cx%3D'52'%20cy%3D'8'%20r%3D'8'%2F%3E%3C%2Fsvg%3E")}.expressive-code .ec-line :where(span[style^='--']:not([class])),:root:not([data-theme='dark']) .expressive-code[data-theme='dark'] .ec-line :where(span[style^='--']:not([class])){color:var(--0, inherit);background-color:var(--0bg, transparent);font-style:var(--0fs, inherit);font-weight:var(--0fw, inherit);text-decoration:var(--0td, inherit)}@media (prefers-color-scheme: light){:root:not([data-theme='dark']){--ec-codeBg:#f6f7f9;--ec-codeFg:#403f53;--ec-codeSelBg:#e0e0e0;--ec-gtrFg:#788b94;--ec-gtrBrdCol:#788b9433;--ec-gtrHlFg:#403f53c4;--ec-uiSelBg:#d3e8f8;--ec-uiSelFg:#403f53;--ec-focusBrd:#93a1a1;--ec-sbThumbCol:#0000001a;--ec-sbThumbHoverCol:#0000005c;--ec-tm-markBg:#0000001a;--ec-tm-markBrdCol:#00000055;--ec-tm-insBg:#8ec77d99;--ec-tm-insDiffIndCol:#336a28d0;--ec-tm-delBg:#ff9c8e99;--ec-tm-delDiffIndCol:#9d4138d0;--ec-frm-shdCol:#d9d9d9;--ec-frm-edActTabBg:var(--sl-color-gray-7);--ec-frm-edActTabIndTopCol:var(--sl-color-accent);--ec-frm-edTabBarBg:var(--sl-color-gray-6);--ec-frm-edBg:var(--sl-color-gray-7);--ec-frm-trmTtbBg:var(--sl-color-gray-6);--ec-frm-trmBg:var(--sl-color-gray-7);--ec-frm-tooltipSuccessBg:#078662}:root:not([data-theme='dark']) .expressive-code .ec-line :where(span[style^='--']:not([class])){color:var(--1, inherit);background-color:var(--1bg, transparent);font-style:var(--1fs, inherit);font-weight:var(--1fw, inherit);text-decoration:var(--1td, inherit)}}:root[data-theme='light'] .expressive-code:not([data-theme='dark']),.expressive-code[data-theme='light']{--ec-codeBg:#f6f7f9;--ec-codeFg:#403f53;--ec-codeSelBg:#e0e0e0;--ec-gtrFg:#788b94;--ec-gtrBrdCol:#788b9433;--ec-gtrHlFg:#403f53c4;--ec-uiSelBg:#d3e8f8;--ec-uiSelFg:#403f53;--ec-focusBrd:#93a1a1;--ec-sbThumbCol:#0000001a;--ec-sbThumbHoverCol:#0000005c;--ec-tm-markBg:#0000001a;--ec-tm-markBrdCol:#00000055;--ec-tm-insBg:#8ec77d99;--ec-tm-insDiffIndCol:#336a28d0;--ec-tm-delBg:#ff9c8e99;--ec-tm-delDiffIndCol:#9d4138d0;--ec-frm-shdCol:#d9d9d9;--ec-frm-edActTabBg:var(--sl-color-gray-7);--ec-frm-edActTabIndTopCol:var(--sl-color-accent);--ec-frm-edTabBarBg:var(--sl-color-gray-6);--ec-frm-edBg:var(--sl-color-gray-7);--ec-frm-trmTtbBg:var(--sl-color-gray-6);--ec-frm-trmBg:var(--sl-color-gray-7);--ec-frm-tooltipSuccessBg:#078662}:root[data-theme='light'] .expressive-code:not([data-theme='dark']) .ec-line :where(span[style^='--']:not([class])),.expressive-code[data-theme='light'] .ec-line :where(span[style^='--']:not([class])){color:var(--1, inherit);background-color:var(--1bg, transparent);font-style:var(--1fs, inherit);font-weight:var(--1fw, inherit);text-decoration:var(--1td, inherit)}} \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/_astro/index.BsKNCfOq.css b/tutorials/vonage_video_react_app-feature-config/steps/_astro/index.BsKNCfOq.css new file mode 100644 index 00000000..332596bc --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/_astro/index.BsKNCfOq.css @@ -0,0 +1 @@ +@layer starlight.base,starlight.reset,starlight.core,starlight.content,starlight.components,starlight.utils;@layer starlight.base{:root,::backdrop{--sl-color-white: hsl(0, 0%, 100%);--sl-color-gray-1: hsl(224, 20%, 94%);--sl-color-gray-2: hsl(224, 6%, 77%);--sl-color-gray-3: hsl(224, 6%, 56%);--sl-color-gray-4: hsl(224, 7%, 36%);--sl-color-gray-5: hsl(224, 10%, 23%);--sl-color-gray-6: hsl(224, 14%, 16%);--sl-color-black: hsl(224, 10%, 10%);--sl-hue-orange: 41;--sl-color-orange-low: hsl(var(--sl-hue-orange), 39%, 22%);--sl-color-orange: hsl(var(--sl-hue-orange), 82%, 63%);--sl-color-orange-high: hsl(var(--sl-hue-orange), 82%, 87%);--sl-hue-green: 101;--sl-color-green-low: hsl(var(--sl-hue-green), 39%, 22%);--sl-color-green: hsl(var(--sl-hue-green), 82%, 63%);--sl-color-green-high: hsl(var(--sl-hue-green), 82%, 80%);--sl-hue-blue: 234;--sl-color-blue-low: hsl(var(--sl-hue-blue), 54%, 20%);--sl-color-blue: hsl(var(--sl-hue-blue), 100%, 60%);--sl-color-blue-high: hsl(var(--sl-hue-blue), 100%, 87%);--sl-hue-purple: 281;--sl-color-purple-low: hsl(var(--sl-hue-purple), 39%, 22%);--sl-color-purple: hsl(var(--sl-hue-purple), 82%, 63%);--sl-color-purple-high: hsl(var(--sl-hue-purple), 82%, 89%);--sl-hue-red: 339;--sl-color-red-low: hsl(var(--sl-hue-red), 39%, 22%);--sl-color-red: hsl(var(--sl-hue-red), 82%, 63%);--sl-color-red-high: hsl(var(--sl-hue-red), 82%, 87%);--sl-color-accent-low: hsl(224, 54%, 20%);--sl-color-accent: hsl(224, 100%, 60%);--sl-color-accent-high: hsl(224, 100%, 85%);--sl-color-text: var(--sl-color-gray-2);--sl-color-text-accent: var(--sl-color-accent-high);--sl-color-text-invert: var(--sl-color-accent-low);--sl-color-bg: var(--sl-color-black);--sl-color-bg-nav: var(--sl-color-gray-6);--sl-color-bg-sidebar: var(--sl-color-gray-6);--sl-color-bg-inline-code: var(--sl-color-gray-5);--sl-color-bg-accent: var(--sl-color-accent-high);--sl-color-hairline-light: var(--sl-color-gray-5);--sl-color-hairline: var(--sl-color-gray-6);--sl-color-hairline-shade: var(--sl-color-black);--sl-color-backdrop-overlay: hsla(223, 13%, 10%, .66);--sl-shadow-sm: 0px 1px 1px hsla(0, 0%, 0%, .12), 0px 2px 1px hsla(0, 0%, 0%, .24);--sl-shadow-md: 0px 8px 4px hsla(0, 0%, 0%, .08), 0px 5px 2px hsla(0, 0%, 0%, .08), 0px 3px 2px hsla(0, 0%, 0%, .12), 0px 1px 1px hsla(0, 0%, 0%, .15);--sl-shadow-lg: 0px 25px 7px hsla(0, 0%, 0%, .03), 0px 16px 6px hsla(0, 0%, 0%, .1), 0px 9px 5px hsla(223, 13%, 10%, .33), 0px 4px 4px hsla(0, 0%, 0%, .75), 0px 4px 2px hsla(0, 0%, 0%, .25);--sl-text-2xs: .75rem;--sl-text-xs: .8125rem;--sl-text-sm: .875rem;--sl-text-base: 1rem;--sl-text-lg: 1.125rem;--sl-text-xl: 1.25rem;--sl-text-2xl: 1.5rem;--sl-text-3xl: 1.8125rem;--sl-text-4xl: 2.1875rem;--sl-text-5xl: 2.625rem;--sl-text-6xl: 4rem;--sl-text-body: var(--sl-text-base);--sl-text-body-sm: var(--sl-text-xs);--sl-text-code: var(--sl-text-sm);--sl-text-code-sm: var(--sl-text-xs);--sl-text-h1: var(--sl-text-4xl);--sl-text-h2: var(--sl-text-3xl);--sl-text-h3: var(--sl-text-2xl);--sl-text-h4: var(--sl-text-xl);--sl-text-h5: var(--sl-text-lg);--sl-line-height: 1.75;--sl-line-height-headings: 1.2;--sl-font-system: ui-sans-serif, system-ui, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--sl-font-system-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--__sl-font: var(--sl-font, var(--sl-font-system)), var(--sl-font-system);--__sl-font-mono: var(--sl-font-mono, var(--sl-font-system-mono)), var(--sl-font-system-mono);--sl-nav-height: 3.5rem;--sl-nav-pad-x: 1rem;--sl-nav-pad-y: .75rem;--sl-mobile-toc-height: 3rem;--sl-sidebar-width: 18.75rem;--sl-sidebar-pad-x: 1rem;--sl-content-width: 45rem;--sl-content-pad-x: 1rem;--sl-content-gap-y: 1rem;--sl-main-pad: 0 0 3vh 0;--sl-menu-button-size: 2rem;--sl-nav-gap: var(--sl-content-pad-x);--sl-outline-offset-inside: -.1875rem;--sl-z-index-toc: 4;--sl-z-index-menu: 5;--sl-z-index-navbar: 10;--sl-z-index-skiplink: 20}:root[data-theme=light],[data-theme=light] ::backdrop{--sl-color-white: hsl(224, 10%, 10%);--sl-color-gray-1: hsl(224, 14%, 16%);--sl-color-gray-2: hsl(224, 10%, 23%);--sl-color-gray-3: hsl(224, 7%, 36%);--sl-color-gray-4: hsl(224, 6%, 56%);--sl-color-gray-5: hsl(224, 6%, 77%);--sl-color-gray-6: hsl(224, 20%, 94%);--sl-color-gray-7: hsl(224, 19%, 97%);--sl-color-black: hsl(0, 0%, 100%);--sl-color-orange-high: hsl(var(--sl-hue-orange), 80%, 25%);--sl-color-orange: hsl(var(--sl-hue-orange), 90%, 60%);--sl-color-orange-low: hsl(var(--sl-hue-orange), 90%, 88%);--sl-color-green-high: hsl(var(--sl-hue-green), 80%, 22%);--sl-color-green: hsl(var(--sl-hue-green), 90%, 46%);--sl-color-green-low: hsl(var(--sl-hue-green), 85%, 90%);--sl-color-blue-high: hsl(var(--sl-hue-blue), 80%, 30%);--sl-color-blue: hsl(var(--sl-hue-blue), 90%, 60%);--sl-color-blue-low: hsl(var(--sl-hue-blue), 88%, 90%);--sl-color-purple-high: hsl(var(--sl-hue-purple), 90%, 30%);--sl-color-purple: hsl(var(--sl-hue-purple), 90%, 60%);--sl-color-purple-low: hsl(var(--sl-hue-purple), 80%, 90%);--sl-color-red-high: hsl(var(--sl-hue-red), 80%, 30%);--sl-color-red: hsl(var(--sl-hue-red), 90%, 60%);--sl-color-red-low: hsl(var(--sl-hue-red), 80%, 90%);--sl-color-accent-high: hsl(234, 80%, 30%);--sl-color-accent: hsl(234, 90%, 60%);--sl-color-accent-low: hsl(234, 88%, 90%);--sl-color-text-accent: var(--sl-color-accent);--sl-color-text-invert: var(--sl-color-black);--sl-color-bg-nav: var(--sl-color-gray-7);--sl-color-bg-sidebar: var(--sl-color-bg);--sl-color-bg-inline-code: var(--sl-color-gray-6);--sl-color-bg-accent: var(--sl-color-accent);--sl-color-hairline-light: var(--sl-color-gray-6);--sl-color-hairline-shade: var(--sl-color-gray-6);--sl-color-backdrop-overlay: hsla(225, 9%, 36%, .66);--sl-shadow-sm: 0px 1px 1px hsla(0, 0%, 0%, .06), 0px 2px 1px hsla(0, 0%, 0%, .06);--sl-shadow-md: 0px 8px 4px hsla(0, 0%, 0%, .03), 0px 5px 2px hsla(0, 0%, 0%, .03), 0px 3px 2px hsla(0, 0%, 0%, .06), 0px 1px 1px hsla(0, 0%, 0%, .06);--sl-shadow-lg: 0px 25px 7px rgba(0, 0, 0, .01), 0px 16px 6px hsla(0, 0%, 0%, .03), 0px 9px 5px hsla(223, 13%, 10%, .08), 0px 4px 4px hsla(0, 0%, 0%, .16), 0px 4px 2px hsla(0, 0%, 0%, .04)}@media(min-width:50em){:root{--sl-nav-height: 4rem;--sl-nav-pad-x: 1.5rem;--sl-text-h1: var(--sl-text-5xl);--sl-text-h2: var(--sl-text-4xl);--sl-text-h3: var(--sl-text-3xl);--sl-text-h4: var(--sl-text-2xl)}}@media(min-width:72rem){:root{--sl-content-pad-x: 1.5rem;--sl-mobile-toc-height: 0rem}}}@layer starlight.reset{*,*:before,*:after{box-sizing:border-box}*{margin:0}html{color-scheme:dark;accent-color:var(--sl-color-accent);-webkit-text-size-adjust:100%;text-size-adjust:100%}html[data-theme=light]{color-scheme:light}body{font-family:var(--__sl-font);line-height:var(--sl-line-height);-webkit-font-smoothing:antialiased;color:var(--sl-color-text);background-color:var(--sl-color-bg)}input,button,textarea,select{font:inherit}p,h1,h2,h3,h4,h5,h6,code{overflow-wrap:break-word}code{font-family:var(--__sl-font-mono)}}@layer starlight.components{.starlight-aside{padding:1rem;border-inline-start:.25rem solid var(--sl-color-asides-border);color:var(--sl-color-white)}.starlight-aside--note{--sl-color-asides-text-accent: var(--sl-color-blue-high);--sl-color-asides-border: var(--sl-color-blue);background-color:var(--sl-color-blue-low)}.starlight-aside--tip{--sl-color-asides-text-accent: var(--sl-color-purple-high);--sl-color-asides-border: var(--sl-color-purple);background-color:var(--sl-color-purple-low)}.starlight-aside--caution{--sl-color-asides-text-accent: var(--sl-color-orange-high);--sl-color-asides-border: var(--sl-color-orange);background-color:var(--sl-color-orange-low)}.starlight-aside--danger{--sl-color-asides-text-accent: var(--sl-color-red-high);--sl-color-asides-border: var(--sl-color-red);background-color:var(--sl-color-red-low)}.starlight-aside__title{display:flex;gap:.5rem;align-items:center;font-size:var(--sl-text-h5);font-weight:600;line-height:var(--sl-line-height-headings);color:var(--sl-color-asides-text-accent)}.starlight-aside__icon{font-size:1.333em;width:1em;height:1em}.starlight-aside__title+.starlight-aside__content{margin-top:.5rem}.starlight-aside__content a{color:var(--sl-color-asides-text-accent)}}@layer starlight.utils{.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sl-hidden{display:none}.sl-flex{display:flex}.sl-block{display:block}@media(min-width:50rem){.md\:sl-hidden{display:none}.md\:sl-flex{display:flex}.md\:sl-block{display:block}}@media(min-width:72rem){.lg\:sl-hidden{display:none}.lg\:sl-flex{display:flex}.lg\:sl-block{display:block}}[data-theme=light] .light\:sl-hidden,[data-theme=dark] .dark\:sl-hidden{display:none}[dir=rtl] .rtl\:flip:not(:where([dir=rtl] [dir=ltr] *)){transform:scaleX(-1)}}@layer starlight.core{.sl-banner:where(.astro-laz2plt2){--__sl-banner-text: var(--sl-color-banner-text, var(--sl-color-text-invert));padding:var(--sl-nav-pad-y) var(--sl-nav-pad-x);background-color:var(--sl-color-banner-bg, var(--sl-color-bg-accent));color:var(--__sl-banner-text);line-height:var(--sl-line-height-headings);text-align:center;text-wrap:balance;box-shadow:var(--sl-shadow-sm)}.sl-banner:where(.astro-laz2plt2) a{color:var(--__sl-banner-text)}}@layer starlight.core{.content-panel:where(.astro-7nkwcw3z){padding:1.5rem var(--sl-content-pad-x)}.content-panel:where(.astro-7nkwcw3z)+.content-panel:where(.astro-7nkwcw3z){border-top:1px solid var(--sl-color-hairline)}.sl-container:where(.astro-7nkwcw3z){max-width:var(--sl-content-width)}.sl-container:where(.astro-7nkwcw3z)>*+*{margin-top:1.5rem}@media(min-width:72rem){.sl-container:where(.astro-7nkwcw3z){margin-inline:var(--sl-content-margin-inline, auto)}}}@layer starlight.core{p:where(.astro-opzsrvew){border:1px solid var(--sl-color-orange);padding:.75em 1em;background-color:var(--sl-color-orange-low);color:var(--sl-color-orange-high);width:max-content;max-width:100%;align-items:center;gap:.75em;font-size:var(--sl-text-body-sm);line-height:var(--sl-line-height-headings)}}@layer starlight.core{a:where(.astro-eez2twj6){gap:.5rem;align-items:center;text-decoration:none;color:var(--sl-color-gray-3)}a:where(.astro-eez2twj6):hover{color:var(--sl-color-white)}}@layer starlight.core{.pagination-links:where(.astro-u2l5gyhi){display:grid;grid-template-columns:repeat(auto-fit,minmax(min(18rem,100%),1fr));gap:1rem}a:where(.astro-u2l5gyhi){display:flex;align-items:center;justify-content:flex-start;gap:.5rem;width:100%;flex-basis:calc(50% - .5rem);flex-grow:1;border:1px solid var(--sl-color-gray-5);border-radius:.5rem;padding:1rem;text-decoration:none;color:var(--sl-color-gray-2);box-shadow:var(--sl-shadow-md);overflow-wrap:anywhere}:where(.astro-u2l5gyhi)[rel=next]{justify-content:end;text-align:end;flex-direction:row-reverse}a:where(.astro-u2l5gyhi):hover{border-color:var(--sl-color-gray-2)}.link-title:where(.astro-u2l5gyhi){color:var(--sl-color-white);font-size:var(--sl-text-2xl);line-height:var(--sl-line-height-headings)}svg:where(.astro-u2l5gyhi){flex-shrink:0}}@layer starlight.core{footer:where(.astro-3yyafb3n){flex-direction:column;gap:1.5rem}.meta:where(.astro-3yyafb3n){gap:.75rem 3rem;justify-content:space-between;flex-wrap:wrap;margin-top:3rem;font-size:var(--sl-text-sm);color:var(--sl-color-gray-3)}.meta:where(.astro-3yyafb3n)>p:only-child{margin-inline-start:auto}.kudos:where(.astro-3yyafb3n){align-items:center;gap:.5em;margin:1.5rem auto;font-size:var(--sl-text-xs);text-decoration:none;color:var(--sl-color-gray-3)}.kudos:where(.astro-3yyafb3n):hover{color:var(--sl-color-white)}}@layer starlight.components{.kudos:where(.astro-3yyafb3n) svg{color:var(--sl-color-orange)}}@layer starlight.core{label:where(.astro-4yphtoen){--sl-label-icon-size: .875rem;--sl-caret-size: 1.25rem;--sl-inline-padding: .5rem;position:relative;display:flex;align-items:center;gap:.25rem;color:var(--sl-color-gray-1)}label:where(.astro-4yphtoen):hover{color:var(--sl-color-gray-2)}.icon:where(.astro-4yphtoen){position:absolute;top:50%;transform:translateY(-50%);pointer-events:none}select:where(.astro-4yphtoen){border:0;padding-block:.625rem;padding-inline:calc(var(--sl-label-icon-size) + var(--sl-inline-padding) + .25rem) calc(var(--sl-caret-size) + var(--sl-inline-padding) + .25rem);margin-inline:calc(var(--sl-inline-padding) * -1);width:calc(var(--sl-select-width) + var(--sl-inline-padding) * 2);background-color:transparent;text-overflow:ellipsis;color:inherit;cursor:pointer;appearance:none}option:where(.astro-4yphtoen){background-color:var(--sl-color-bg-nav);color:var(--sl-color-gray-1)}@media(min-width:50rem){select:where(.astro-4yphtoen){font-size:var(--sl-text-sm)}}}@layer starlight.components{.label-icon:where(.astro-4yphtoen){font-size:var(--sl-label-icon-size);inset-inline-start:0}.caret:where(.astro-4yphtoen){font-size:var(--sl-caret-size);inset-inline-end:0}}@layer starlight.core{site-search:where(.astro-v37mnknz){display:contents}button:where(.astro-v37mnknz)[data-open-modal]{display:flex;align-items:center;gap:.5rem;border:0;background-color:transparent;color:var(--sl-color-gray-1);cursor:pointer;height:2.5rem;font-size:var(--sl-text-xl)}@media(min-width:50rem){button:where(.astro-v37mnknz)[data-open-modal]{border:1px solid var(--sl-color-gray-5);border-radius:.5rem;padding-inline-start:.75rem;padding-inline-end:.5rem;background-color:var(--sl-color-black);color:var(--sl-color-gray-2);font-size:var(--sl-text-sm);width:100%;max-width:22rem}button:where(.astro-v37mnknz)[data-open-modal]:hover{border-color:var(--sl-color-gray-2);color:var(--sl-color-white)}button:where(.astro-v37mnknz)[data-open-modal]>:where(.astro-v37mnknz):last-child{margin-inline-start:auto}}button:where(.astro-v37mnknz)>kbd:where(.astro-v37mnknz){border-radius:.25rem;font-size:var(--sl-text-2xs);gap:.25em;padding-inline:.375rem;background-color:var(--sl-color-gray-6)}kbd:where(.astro-v37mnknz){font-family:var(--__sl-font)}dialog:where(.astro-v37mnknz){margin:0;background-color:var(--sl-color-gray-6);border:1px solid var(--sl-color-gray-5);width:100%;max-width:100%;height:100%;max-height:100%;box-shadow:var(--sl-shadow-lg)}dialog:where(.astro-v37mnknz)[open]{display:flex}dialog:where(.astro-v37mnknz)::backdrop{background-color:var(--sl-color-backdrop-overlay);-webkit-backdrop-filter:blur(.25rem);backdrop-filter:blur(.25rem)}.dialog-frame:where(.astro-v37mnknz){position:relative;overflow:auto;flex-direction:column;flex-grow:1;gap:1rem;padding:1rem}button:where(.astro-v37mnknz)[data-close-modal]{position:absolute;z-index:1;align-items:center;align-self:flex-end;height:calc(64px * var(--pagefind-ui-scale));padding:.25rem;border:0;background:transparent;cursor:pointer;color:var(--sl-color-text-accent)}#starlight__search:where(.astro-v37mnknz){--pagefind-ui-primary: var(--sl-color-text);--pagefind-ui-text: var(--sl-color-gray-2);--pagefind-ui-font: var(--__sl-font);--pagefind-ui-background: var(--sl-color-black);--pagefind-ui-border: var(--sl-color-gray-5);--pagefind-ui-border-width: 1px;--pagefind-ui-tag: var(--sl-color-gray-5);--sl-search-cancel-space: 5rem}:root[data-theme=light] #starlight__search:where(.astro-v37mnknz){--pagefind-ui-tag: var(--sl-color-gray-6)}@media(min-width:50rem){#starlight__search:where(.astro-v37mnknz){--sl-search-cancel-space: 0px}dialog:where(.astro-v37mnknz){margin:4rem auto auto;border-radius:.5rem;width:90%;max-width:40rem;height:max-content;min-height:15rem;max-height:calc(100% - 8rem)}.dialog-frame:where(.astro-v37mnknz){padding:1.5rem}}}@layer starlight.core{.site-title:where(.astro-m46x6ez3){align-items:center;gap:var(--sl-nav-gap);font-size:var(--sl-text-h4);font-weight:600;color:var(--sl-color-text-accent);text-decoration:none;white-space:nowrap;min-width:0}span:where(.astro-m46x6ez3){overflow:hidden}img:where(.astro-m46x6ez3){height:calc(var(--sl-nav-height) - 2 * var(--sl-nav-pad-y));width:auto;max-width:100%;object-fit:contain;object-position:0 50%}}@layer starlight.core{a:where(.astro-wy4te6ga){color:var(--sl-color-text-accent);padding:.5em;margin:-.5em}a:where(.astro-wy4te6ga):hover{opacity:.66}}@layer starlight.core{.header:where(.astro-kmkmnagf){display:flex;gap:var(--sl-nav-gap);justify-content:space-between;align-items:center;height:100%}.title-wrapper:where(.astro-kmkmnagf){overflow:clip;padding:.25rem;margin:-.25rem;min-width:0}.right-group:where(.astro-kmkmnagf),.social-icons:where(.astro-kmkmnagf){gap:1rem;align-items:center}.social-icons:where(.astro-kmkmnagf):after{content:"";height:2rem;border-inline-end:1px solid var(--sl-color-gray-5)}@media(min-width:50rem){:root[data-has-sidebar]{--__sidebar-pad: calc(2 * var(--sl-nav-pad-x))}:root:not([data-has-toc]){--__toc-width: 0rem}.header:where(.astro-kmkmnagf){--__sidebar-width: max(0rem, var(--sl-content-inline-start, 0rem) - var(--sl-nav-pad-x));--__main-column-fr: calc( ( 100% + var(--__sidebar-pad, 0rem) - var(--__toc-width, var(--sl-sidebar-width)) - (2 * var(--__toc-width, var(--sl-nav-pad-x))) - var(--sl-content-inline-start, 0rem) - var(--sl-content-width) ) / 2 );display:grid;grid-template-columns:minmax(calc(var(--__sidebar-width) + max(0rem,var(--__main-column-fr) - var(--sl-nav-gap))),auto) 1fr auto;align-content:center}}}@layer starlight.core{.hero:where(.astro-jbfsktt5){display:grid;align-items:center;gap:1rem;padding-bottom:1rem}.hero:where(.astro-jbfsktt5)>img:where(.astro-jbfsktt5),.hero:where(.astro-jbfsktt5)>.hero-html:where(.astro-jbfsktt5){object-fit:contain;width:min(70%,20rem);height:auto;margin-inline:auto}.stack:where(.astro-jbfsktt5){flex-direction:column;gap:clamp(1.5rem,calc(1.5rem + 1vw),2rem);text-align:center}.copy:where(.astro-jbfsktt5){flex-direction:column;gap:1rem;align-items:center}.copy:where(.astro-jbfsktt5)>:where(.astro-jbfsktt5){max-width:50ch}h1:where(.astro-jbfsktt5){font-size:clamp(var(--sl-text-3xl),calc(.25rem + 5vw),var(--sl-text-6xl));line-height:var(--sl-line-height-headings);font-weight:600;color:var(--sl-color-white)}.tagline:where(.astro-jbfsktt5){font-size:clamp(var(--sl-text-base),calc(.0625rem + 2vw),var(--sl-text-xl));color:var(--sl-color-gray-2)}.actions:where(.astro-jbfsktt5){gap:1rem 2rem;flex-wrap:wrap;justify-content:center}@media(min-width:50rem){.hero:where(.astro-jbfsktt5){grid-template-columns:7fr 4fr;gap:3%;padding-block:clamp(2.5rem,calc(1rem + 10vmin),10rem)}.hero:where(.astro-jbfsktt5)>img:where(.astro-jbfsktt5),.hero:where(.astro-jbfsktt5)>.hero-html:where(.astro-jbfsktt5){order:2;width:min(100%,25rem)}.stack:where(.astro-jbfsktt5){text-align:start}.copy:where(.astro-jbfsktt5){align-items:flex-start}.actions:where(.astro-jbfsktt5){justify-content:flex-start}}}@layer starlight.content{.sl-markdown-content :not(a,strong,em,del,span,input,code,br)+:not(a,strong,em,del,span,input,code,br,:where(.not-content *)){margin-top:var(--sl-content-gap-y)}.sl-markdown-content :not(a,strong,em,del,span,input,code,br)+:is(astro-island,astro-slot)>:not(a,strong,em,del,span,input,code,br,:where(.not-content *)):first-child{margin-top:var(--sl-content-gap-y)}.sl-markdown-content :not(h1,h2,h3,h4,h5,h6)+:is(h1,h2,h3,h4,h5,h6):not(:where(.not-content *)){margin-top:1.5em}.sl-markdown-content li+li:not(:where(.not-content *)),.sl-markdown-content dt+dt:not(:where(.not-content *)),.sl-markdown-content dt+dd:not(:where(.not-content *)),.sl-markdown-content dd+dd:not(:where(.not-content *)){margin-top:.25rem}.sl-markdown-content li:not(:where(.not-content *)){overflow-wrap:anywhere}.sl-markdown-content li>:is(:last-child:not(li,ul,ol,a,strong,em,del,span,input,code,br,script,:where(.not-content *)),:not(script):has(~script:last-child):not(:has(~:not(script)))){margin-bottom:1.25rem}.sl-markdown-content dt:not(:where(.not-content *)){font-weight:700}.sl-markdown-content dd:not(:where(.not-content *)){padding-inline-start:1rem}.sl-markdown-content :is(h1,h2,h3,h4,h5,h6):not(:where(.not-content *)){color:var(--sl-color-white);line-height:var(--sl-line-height-headings);font-weight:600}.sl-markdown-content :is(img,picture,video,canvas,svg,iframe):not(:where(.not-content *)){display:block;max-width:100%;height:auto}.sl-markdown-content h1:not(:where(.not-content *)){font-size:var(--sl-text-h1)}.sl-markdown-content h2:not(:where(.not-content *)){font-size:var(--sl-text-h2)}.sl-markdown-content h3:not(:where(.not-content *)){font-size:var(--sl-text-h3)}.sl-markdown-content h4:not(:where(.not-content *)){font-size:var(--sl-text-h4)}.sl-markdown-content h5:not(:where(.not-content *)){font-size:var(--sl-text-h5)}.sl-markdown-content h6:not(:where(.not-content *)){font-size:var(--sl-text-h6)}.sl-markdown-content a:not(:where(.not-content *)){color:var(--sl-color-text-accent)}.sl-markdown-content a:hover:not(:where(.not-content *)){color:var(--sl-color-white)}.sl-markdown-content code:not(:where(.not-content *)){background-color:var(--sl-color-bg-inline-code);margin-block:-.125rem;padding:.125rem .375rem;font-size:var(--sl-text-code-sm)}.sl-markdown-content :is(h1,h2,h3,h4,h5,h6) code{font-size:inherit}.sl-markdown-content pre:not(:where(.not-content *)){border:1px solid var(--sl-color-gray-5);padding:.75rem 1rem;font-size:var(--sl-text-code);tab-size:2}.sl-markdown-content pre code:not(:where(.not-content *)){all:unset;font-family:var(--__sl-font-mono)}.sl-markdown-content blockquote:not(:where(.not-content *)){border-inline-start:1px solid var(--sl-color-gray-5);padding-inline-start:1rem}.sl-markdown-content table:not(:where(.not-content *)){display:block;overflow:auto;border-spacing:0}.sl-markdown-content :is(th,td):not(:where(.not-content *)){border-bottom:1px solid var(--sl-color-gray-5);padding:.5rem 1rem;vertical-align:baseline}.sl-markdown-content :is(th:first-child,td:first-child):not(:where(.not-content *)){padding-inline-start:0}.sl-markdown-content :is(th:last-child,td:last-child):not(:where(.not-content *)){padding-inline-end:0}.sl-markdown-content th:not(:where(.not-content *)){color:var(--sl-color-white);font-weight:600}.sl-markdown-content th:not([align]):not(:where(.not-content *)){text-align:start}.sl-markdown-content .starlight-aside :is(th,td,hr,blockquote):not(:where(.not-content *)){border-color:var(--sl-color-gray-4)}@supports (border-color: color-mix(in srgb,var(--sl-color-asides-text-accent) 30%,transparent)){.sl-markdown-content .starlight-aside :is(th,td,hr,blockquote):not(:where(.not-content *)){border-color:color-mix(in srgb,var(--sl-color-asides-text-accent) 30%,transparent)}}@supports (border-color: color-mix(in srgb,var(--sl-color-asides-text-accent) 12%,transparent)){.sl-markdown-content .starlight-aside code:not(:where(.not-content *)){background-color:color-mix(in srgb,var(--sl-color-asides-text-accent) 12%,transparent)}}.sl-markdown-content hr:not(:where(.not-content *)){border:0;border-bottom:1px solid var(--sl-color-hairline)}.sl-markdown-content details:not(:where(.not-content *)){--sl-details-border-color: var(--sl-color-gray-5);--sl-details-border-color--hover: var(--sl-color-text-accent);border-inline-start:2px solid var(--sl-details-border-color);padding-inline-start:1rem}.sl-markdown-content details:not([open]):hover:not(:where(.not-content *)),.sl-markdown-content details:has(>summary:hover):not(:where(.not-content *)){border-color:var(--sl-details-border-color--hover)}.sl-markdown-content summary:not(:where(.not-content *)){color:var(--sl-color-white);cursor:pointer;display:block;font-weight:600;margin-inline-start:-.5rem;padding-inline-start:.5rem}.sl-markdown-content details[open]>summary:not(:where(.not-content *)){margin-bottom:1rem}.sl-markdown-content summary:not(:where(.not-content *))::marker,.sl-markdown-content summary:not(:where(.not-content *))::-webkit-details-marker{display:none}.sl-markdown-content summary:not(:where(.not-content *)):before{--sl-details-marker-size: 1.25rem;background-color:currentColor;content:"";display:inline-block;height:var(--sl-details-marker-size);width:var(--sl-details-marker-size);margin-inline:calc((var(--sl-details-marker-size) / 4) * -1) .25rem;vertical-align:middle;-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M14.8 11.3 10.6 7a1 1 0 1 0-1.4 1.5l3.5 3.5-3.5 3.5a1 1 0 0 0 0 1.4 1 1 0 0 0 .7.3 1 1 0 0 0 .7-.3l4.2-4.2a1 1 0 0 0 0-1.4Z'/%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M14.8 11.3 10.6 7a1 1 0 1 0-1.4 1.5l3.5 3.5-3.5 3.5a1 1 0 0 0 0 1.4 1 1 0 0 0 .7.3 1 1 0 0 0 .7-.3l4.2-4.2a1 1 0 0 0 0-1.4Z'/%3E%3C/svg%3E%0A");-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}@media(prefers-reduced-motion:no-preference){.sl-markdown-content summary:not(:where(.not-content *)):before{transition:transform .2s ease-in-out}}.sl-markdown-content details[open]>summary:not(:where(.not-content *)):before{transform:rotate(90deg)}[dir=rtl] .sl-markdown-content summary:not(:where(.not-content *)):before,.sl-markdown-content [dir=rtl] summary:not(:where(.not-content *)):before{transform:rotate(180deg)}.sl-markdown-content summary:not(:where(.not-content *)) p:only-child{display:inline}.sl-markdown-content .starlight-aside details:not(:where(.not-content *)){--sl-details-border-color: var(--sl-color-asides-border);--sl-details-border-color--hover: var(--sl-color-asides-text-accent)}}@layer starlight.core{[data-mobile-menu-expanded]{overflow:hidden}@media(min-width:50rem){[data-mobile-menu-expanded]{overflow:auto}}}@layer starlight.core{button:where(.astro-jif73yzw){position:fixed;top:calc((var(--sl-nav-height) - var(--sl-menu-button-size)) / 2);inset-inline-end:var(--sl-nav-pad-x);z-index:var(--sl-z-index-navbar);border:0;border-radius:50%;width:var(--sl-menu-button-size);height:var(--sl-menu-button-size);padding:.5rem;background-color:var(--sl-color-white);color:var(--sl-color-black);box-shadow:var(--sl-shadow-md);cursor:pointer}:where(.astro-jif73yzw)[aria-expanded=true] button:where(.astro-jif73yzw){background-color:var(--sl-color-gray-2);box-shadow:none}:where(.astro-jif73yzw)[aria-expanded=true] button:where(.astro-jif73yzw) .open-menu:where(.astro-jif73yzw){display:none}:where(.astro-jif73yzw):not([aria-expanded=true]) button:where(.astro-jif73yzw) .close-menu:where(.astro-jif73yzw){display:none}[data-theme=light] button:where(.astro-jif73yzw){background-color:var(--sl-color-black);color:var(--sl-color-white)}[data-theme=light] :where(.astro-jif73yzw)[aria-expanded=true] button:where(.astro-jif73yzw){background-color:var(--sl-color-gray-5)}}@layer starlight.core{.page:where(.astro-vrdttmbt){flex-direction:column;min-height:100vh}.header:where(.astro-vrdttmbt){z-index:var(--sl-z-index-navbar);position:fixed;inset-inline-start:0;inset-block-start:0;width:100%;height:var(--sl-nav-height);border-bottom:1px solid var(--sl-color-hairline-shade);padding:var(--sl-nav-pad-y) var(--sl-nav-pad-x);padding-inline-end:var(--sl-nav-pad-x);background-color:var(--sl-color-bg-nav)}[data-has-sidebar] .header:where(.astro-vrdttmbt){padding-inline-end:calc(var(--sl-nav-gap) + var(--sl-nav-pad-x) + var(--sl-menu-button-size))}.sidebar-pane:where(.astro-vrdttmbt){visibility:var(--sl-sidebar-visibility, hidden);position:fixed;z-index:var(--sl-z-index-menu);inset-block:var(--sl-nav-height) 0;inset-inline-start:0;width:100%;background-color:var(--sl-color-black);overflow-y:auto}[aria-expanded=true]~.sidebar-pane:where(.astro-vrdttmbt){--sl-sidebar-visibility: visible}.sidebar-content:where(.astro-vrdttmbt){height:100%;min-height:max-content;padding:1rem var(--sl-sidebar-pad-x) 0;flex-direction:column;gap:1rem}@media(min-width:50rem){.sidebar-content:where(.astro-vrdttmbt):after{content:"";padding-bottom:1px}}.main-frame:where(.astro-vrdttmbt){padding-top:calc(var(--sl-nav-height) + var(--sl-mobile-toc-height));padding-inline-start:var(--sl-content-inline-start)}@media(min-width:50rem){[data-has-sidebar] .header:where(.astro-vrdttmbt){padding-inline-end:var(--sl-nav-pad-x)}.sidebar-pane:where(.astro-vrdttmbt){--sl-sidebar-visibility: visible;width:var(--sl-sidebar-width);background-color:var(--sl-color-bg-sidebar);border-inline-end:1px solid var(--sl-color-hairline-shade)}}}@layer starlight.core{ul:where(.astro-g2bywc46){padding:0;list-style:none}a:where(.astro-g2bywc46){--pad-inline: .5rem;display:block;border-radius:.25rem;padding-block:.25rem;padding-inline:calc(1rem * var(--depth) + var(--pad-inline)) var(--pad-inline);line-height:1.25}a:where(.astro-g2bywc46)[aria-current=true]{color:var(--sl-color-text-accent)}.isMobile:where(.astro-g2bywc46) a:where(.astro-g2bywc46){--pad-inline: 1rem;display:flex;justify-content:space-between;gap:var(--pad-inline);border-top:1px solid var(--sl-color-gray-6);border-radius:0;padding-block:.5rem;color:var(--sl-color-text);font-size:var(--sl-text-sm);text-decoration:none;outline-offset:var(--sl-outline-offset-inside)}.isMobile:where(.astro-g2bywc46):first-child>li:where(.astro-g2bywc46):first-child>a:where(.astro-g2bywc46){border-top:0}.isMobile:where(.astro-g2bywc46) a:where(.astro-g2bywc46)[aria-current=true],.isMobile:where(.astro-g2bywc46) a:where(.astro-g2bywc46)[aria-current=true]:hover,.isMobile:where(.astro-g2bywc46) a:where(.astro-g2bywc46)[aria-current=true]:focus{color:var(--sl-color-white);background-color:unset}.isMobile:where(.astro-g2bywc46) a:where(.astro-g2bywc46)[aria-current=true]:after{content:"";width:1rem;background-color:var(--sl-color-text-accent);-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxNCAxNCc+PHBhdGggZD0nTTEwLjkxNCA0LjIwNmEuNTgzLjU4MyAwIDAgMC0uODI4IDBMNS43NCA4LjU1NyAzLjkxNCA2LjcyNmEuNTk2LjU5NiAwIDAgMC0uODI4Ljg1N2wyLjI0IDIuMjRhLjU4My41ODMgMCAwIDAgLjgyOCAwbDQuNzYtNC43NmEuNTgzLjU4MyAwIDAgMCAwLS44NTdaJy8+PC9zdmc+Cg==);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxNCAxNCc+PHBhdGggZD0nTTEwLjkxNCA0LjIwNmEuNTgzLjU4MyAwIDAgMC0uODI4IDBMNS43NCA4LjU1NyAzLjkxNCA2LjcyNmEuNTk2LjU5NiAwIDAgMC0uODI4Ljg1N2wyLjI0IDIuMjRhLjU4My41ODMgMCAwIDAgLjgyOCAwbDQuNzYtNC43NmEuNTgzLjU4MyAwIDAgMCAwLS44NTdaJy8+PC9zdmc+Cg==);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;flex-shrink:0}}@layer starlight.core{nav:where(.astro-doynk5tl){position:fixed;z-index:var(--sl-z-index-toc);top:calc(var(--sl-nav-height) - 1px);inset-inline:0;border-top:1px solid var(--sl-color-gray-5);background-color:var(--sl-color-bg-nav)}@media(min-width:50rem){nav:where(.astro-doynk5tl){inset-inline-start:var(--sl-content-inline-start, 0)}}summary:where(.astro-doynk5tl){gap:.5rem;align-items:center;height:var(--sl-mobile-toc-height);border-bottom:1px solid var(--sl-color-hairline-shade);padding:.5rem 1rem;font-size:var(--sl-text-xs);outline-offset:var(--sl-outline-offset-inside)}summary:where(.astro-doynk5tl)::marker,summary:where(.astro-doynk5tl)::-webkit-details-marker{display:none}.toggle:where(.astro-doynk5tl){flex-shrink:0;gap:1rem;align-items:center;justify-content:space-between;border:1px solid var(--sl-color-gray-5);border-radius:.5rem;padding-block:.5rem;padding-inline-start:.75rem;padding-inline-end:.5rem;line-height:1;background-color:var(--sl-color-black);user-select:none;cursor:pointer}details:where(.astro-doynk5tl)[open] .toggle:where(.astro-doynk5tl){color:var(--sl-color-white);border-color:var(--sl-color-accent)}details:where(.astro-doynk5tl) .toggle:where(.astro-doynk5tl):hover{color:var(--sl-color-white);border-color:var(--sl-color-gray-2)}[dir=rtl] .caret:where(.astro-doynk5tl){transform:rotate(180deg)}details:where(.astro-doynk5tl)[open] .caret:where(.astro-doynk5tl){transform:rotate(90deg)}.display-current:where(.astro-doynk5tl){white-space:nowrap;text-overflow:ellipsis;overflow:hidden;color:var(--sl-color-white)}.dropdown:where(.astro-doynk5tl){--border-top: 1px;margin-top:calc(-1 * var(--border-top));border:var(--border-top) solid var(--sl-color-gray-6);border-top-color:var(--sl-color-hairline-shade);max-height:calc(85vh - var(--sl-nav-height) - var(--sl-mobile-toc-height));overflow-y:auto;background-color:var(--sl-color-black);box-shadow:var(--sl-shadow-md);overscroll-behavior:contain}}@layer starlight.core{.right-sidebar-panel:where(.astro-pb3aqygn){padding:1rem var(--sl-sidebar-pad-x)}.sl-container:where(.astro-pb3aqygn){width:calc(var(--sl-sidebar-width) - 2 * var(--sl-sidebar-pad-x))}.right-sidebar-panel:where(.astro-pb3aqygn) h2{color:var(--sl-color-white);font-size:var(--sl-text-h5);font-weight:600;line-height:var(--sl-line-height-headings);margin-bottom:.5rem}.right-sidebar-panel:where(.astro-pb3aqygn) :where(a){display:block;font-size:var(--sl-text-xs);text-decoration:none;color:var(--sl-color-gray-3);overflow-wrap:anywhere}.right-sidebar-panel:where(.astro-pb3aqygn) :where(a):hover{color:var(--sl-color-white)}@media(min-width:72rem){.sl-container:where(.astro-pb3aqygn){max-width:calc(((100vw - var(--sl-sidebar-width) - 2 * var(--sl-content-pad-x) - 2 * var(--sl-sidebar-pad-x)) * .25))}}}@layer starlight.core{h1:where(.astro-j6tvhyss){margin-top:1rem;font-size:var(--sl-text-h1);line-height:var(--sl-line-height-headings);font-weight:600;color:var(--sl-color-white)}}@layer starlight.core{.social-icons:where(.astro-wu23bvmt){display:flex;margin-inline-end:auto;gap:1rem;align-items:center;padding-block:1rem}.social-icons:where(.astro-wu23bvmt):empty{display:none}.mobile-preferences:where(.astro-wu23bvmt){justify-content:space-between;flex-wrap:wrap;border-top:1px solid var(--sl-color-gray-6);column-gap:1rem;padding:.5rem 0}}@layer starlight.core{sl-sidebar-state-persist:where(.astro-kku4brbg){display:contents}}@layer starlight.core{ul:where(.astro-3ii7xxms){--sl-sidebar-item-padding-inline: .5rem;list-style:none;padding:0}li:where(.astro-3ii7xxms){overflow-wrap:anywhere}ul:where(.astro-3ii7xxms) ul:where(.astro-3ii7xxms) li:where(.astro-3ii7xxms){margin-inline-start:var(--sl-sidebar-item-padding-inline);border-inline-start:1px solid var(--sl-color-hairline-light);padding-inline-start:var(--sl-sidebar-item-padding-inline)}.large:where(.astro-3ii7xxms){font-size:var(--sl-text-lg);font-weight:600;color:var(--sl-color-white)}.top-level:where(.astro-3ii7xxms)>li:where(.astro-3ii7xxms)+li:where(.astro-3ii7xxms){margin-top:.75rem}summary:where(.astro-3ii7xxms){display:flex;align-items:center;justify-content:space-between;padding:.2em var(--sl-sidebar-item-padding-inline);line-height:1.4;cursor:pointer;user-select:none}summary:where(.astro-3ii7xxms)::marker,summary:where(.astro-3ii7xxms)::-webkit-details-marker{display:none}.caret:where(.astro-3ii7xxms){transition:transform .2s ease-in-out;flex-shrink:0}[dir=rtl] .caret:where(.astro-3ii7xxms){transform:rotate(180deg)}:where(.astro-3ii7xxms)[open]>summary:where(.astro-3ii7xxms) .caret:where(.astro-3ii7xxms){transform:rotate(90deg)}a:where(.astro-3ii7xxms){display:block;border-radius:.25rem;text-decoration:none;color:var(--sl-color-gray-2);padding:.3em var(--sl-sidebar-item-padding-inline);line-height:1.4}a:where(.astro-3ii7xxms):hover,a:where(.astro-3ii7xxms):focus{color:var(--sl-color-white)}:where(.astro-3ii7xxms)[aria-current=page],:where(.astro-3ii7xxms)[aria-current=page]:hover,:where(.astro-3ii7xxms)[aria-current=page]:focus{font-weight:600;color:var(--sl-color-text-invert);background-color:var(--sl-color-text-accent)}a:where(.astro-3ii7xxms)>:where(.astro-3ii7xxms):not(:last-child),.group-label:where(.astro-3ii7xxms)>:where(.astro-3ii7xxms):not(:last-child){margin-inline-end:.25em}@media(min-width:50rem){.top-level:where(.astro-3ii7xxms)>li:where(.astro-3ii7xxms)+li:where(.astro-3ii7xxms){margin-top:.5rem}.large:where(.astro-3ii7xxms){font-size:var(--sl-text-base)}a:where(.astro-3ii7xxms){font-size:var(--sl-text-sm)}}}@layer starlight.core{a:where(.astro-7q3lir66){clip:rect(0,0,0,0);position:fixed;top:.75rem;inset-inline-start:.75rem}a:where(.astro-7q3lir66):focus{clip:unset;z-index:var(--sl-z-index-skiplink);display:block;padding:.5rem 1rem;text-decoration:none;color:var(--sl-color-text-invert);background-color:var(--sl-color-text-accent);box-shadow:var(--sl-shadow-lg)}}@layer starlight.core{.main-pane:where(.astro-67yu43on){isolation:isolate}@media(min-width:72rem){.right-sidebar-container:where(.astro-67yu43on){order:2;position:relative;width:calc(var(--sl-sidebar-width) + (100% - var(--sl-content-width) - var(--sl-sidebar-width)) / 2)}.right-sidebar:where(.astro-67yu43on){position:fixed;top:0;border-inline-start:1px solid var(--sl-color-hairline);padding-top:var(--sl-nav-height);width:100%;height:100vh;overflow-y:auto;scrollbar-width:none}.main-pane:where(.astro-67yu43on){width:100%}[data-has-sidebar][data-has-toc] .main-pane:where(.astro-67yu43on){--sl-content-margin-inline: auto 0;order:1;width:calc(var(--sl-content-width) + (100% - var(--sl-content-width) - var(--sl-sidebar-width)) / 2)}}}html:not([data-has-toc]){--sl-mobile-toc-height: 0rem}html:not([data-has-sidebar]){--sl-content-width: 67.5rem}html{scroll-padding-top:calc(1.5rem + var(--sl-nav-height) + var(--sl-mobile-toc-height))}main:where(.astro-bguv2lll){padding:var(--sl-main-pad)}@media(min-width:50em){:where(.astro-bguv2lll)[data-has-sidebar]{--sl-content-inline-start: var(--sl-sidebar-width)}}@media(min-width:72em){html{scroll-padding-top:calc(1.5rem + var(--sl-nav-height))}} diff --git a/tutorials/vonage_video_react_app-feature-config/steps/_astro/page.B1D-nYk3.js b/tutorials/vonage_video_react_app-feature-config/steps/_astro/page.B1D-nYk3.js new file mode 100644 index 00000000..bb3de36b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/_astro/page.B1D-nYk3.js @@ -0,0 +1 @@ +const v={},d=new Set,s=new WeakSet;let f=!0,h,l=!1;function g(e){l||(l=!0,f??=!1,h??="hover",p(),w(),y(),S())}function p(){for(const e of["touchstart","mousedown"])document.addEventListener(e,t=>{a(t.target,"tap")&&c(t.target.href,{ignoreSlowConnection:!0})},{passive:!0})}function w(){let e;document.body.addEventListener("focusin",n=>{a(n.target,"hover")&&t(n)},{passive:!0}),document.body.addEventListener("focusout",o,{passive:!0}),u(()=>{for(const n of document.getElementsByTagName("a"))s.has(n)||a(n,"hover")&&(s.add(n),n.addEventListener("mouseenter",t,{passive:!0}),n.addEventListener("mouseleave",o,{passive:!0}))});function t(n){const r=n.target.href;e&&clearTimeout(e),e=setTimeout(()=>{c(r)},80)}function o(){e&&(clearTimeout(e),e=0)}}function y(){let e;u(()=>{for(const t of document.getElementsByTagName("a"))s.has(t)||a(t,"viewport")&&(s.add(t),e??=L(),e.observe(t))})}function L(){const e=new WeakMap;return new IntersectionObserver((t,o)=>{for(const n of t){const r=n.target,i=e.get(r);n.isIntersecting?(i&&clearTimeout(i),e.set(r,setTimeout(()=>{o.unobserve(r),e.delete(r),c(r.href)},300))):i&&(clearTimeout(i),e.delete(r))}})}function S(){u(()=>{for(const e of document.getElementsByTagName("a"))a(e,"load")&&c(e.href)})}function c(e,t){e=e.replace(/#.*/,"");const o=t?.ignoreSlowConnection??!1;if(E(e,o))if(d.add(e),document.createElement("link").relList?.supports?.("prefetch")&&t?.with!=="fetch"){const n=document.createElement("link");n.rel="prefetch",n.setAttribute("href",e),document.head.append(n)}else{const n=new Headers;for(const[r,i]of Object.entries(v))n.set(r,i);fetch(e,{priority:"low",headers:n})}}function E(e,t){if(!navigator.onLine||!t&&m())return!1;try{const o=new URL(e,location.href);return location.origin===o.origin&&(location.pathname!==o.pathname||location.search!==o.search)&&!d.has(e)}catch{}return!1}function a(e,t){if(e?.tagName!=="A")return!1;const o=e.dataset.astroPrefetch;return o==="false"?!1:t==="tap"&&(o!=null||f)&&m()?!0:o==null&&f||o===""?t===h:o===t}function m(){if("connection"in navigator){const e=navigator.connection;return e.saveData||/2g/.test(e.effectiveType)}return!1}function u(e){e();let t=!1;document.addEventListener("astro:page-load",()=>{if(!t){t=!0;return}e()})}g(); diff --git a/tutorials/vonage_video_react_app-feature-config/steps/_astro/print.DNXP8c50.css b/tutorials/vonage_video_react_app-feature-config/steps/_astro/print.DNXP8c50.css new file mode 100644 index 00000000..f721e686 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/_astro/print.DNXP8c50.css @@ -0,0 +1 @@ +@media print{:root{--sl-color-white: hsl(224, 10%, 10%);--sl-color-gray-1: hsl(224, 14%, 16%);--sl-color-gray-2: hsl(224, 10%, 23%);--sl-color-gray-3: hsl(224, 7%, 36%);--sl-color-gray-4: hsl(224, 6%, 56%);--sl-color-gray-5: hsl(224, 6%, 77%);--sl-color-gray-6: hsl(224, 20%, 94%);--sl-color-gray-7: hsl(224, 19%, 97%);--sl-color-black: hsl(0, 0%, 100%);--sl-color-orange-high: hsl(var(--sl-hue-orange), 80%, 25%);--sl-color-orange: hsl(var(--sl-hue-orange), 90%, 60%);--sl-color-orange-low: hsl(var(--sl-hue-orange), 90%, 88%);--sl-color-green-high: hsl(var(--sl-hue-green), 80%, 22%);--sl-color-green: hsl(var(--sl-hue-green), 90%, 46%);--sl-color-green-low: hsl(var(--sl-hue-green), 85%, 90%);--sl-color-blue-high: hsl(var(--sl-hue-blue), 80%, 30%);--sl-color-blue: hsl(var(--sl-hue-blue), 90%, 60%);--sl-color-blue-low: hsl(var(--sl-hue-blue), 88%, 90%);--sl-color-purple-high: hsl(var(--sl-hue-purple), 90%, 30%);--sl-color-purple: hsl(var(--sl-hue-purple), 90%, 60%);--sl-color-purple-low: hsl(var(--sl-hue-purple), 80%, 90%);--sl-color-red-high: hsl(var(--sl-hue-red), 80%, 30%);--sl-color-red: hsl(var(--sl-hue-red), 90%, 60%);--sl-color-red-low: hsl(var(--sl-hue-red), 80%, 90%);--sl-color-accent-high: hsl(234, 80%, 30%);--sl-color-accent: hsl(234, 90%, 60%);--sl-color-accent-low: hsl(234, 88%, 90%);--sl-color-text-accent: var(--sl-color-accent);--sl-color-text-invert: var(--sl-color-black);--sl-color-bg-nav: var(--sl-color-gray-7);--sl-color-bg-sidebar: var(--sl-color-bg);--sl-color-bg-inline-code: var(--sl-color-gray-6);--sl-color-bg-accent: var(--sl-color-accent);--sl-color-hairline-light: var(--sl-color-gray-6);--sl-color-hairline-shade: var(--sl-color-gray-6);--sl-color-backdrop-overlay: hsla(225, 9%, 36%, .66);--sl-shadow-sm: none;--sl-shadow-md: none;--sl-shadow-lg: none}.print\:hidden{display:none}.print\:flex{display:flex}.print\:block{display:block}main{padding-bottom:0}main>.content-panel{padding-block-start:0}.content-panel+.content-panel{border:0}.page>header{position:relative}.page>.main-frame{padding-top:0;padding-inline-start:0}.main-pane{--sl-sidebar-width: 0px;--sl-content-width: 100%}.sl-banner{--sl-color-banner-text: var(--sl-color-white);background-color:transparent}.sl-markdown-content :is(h1,h2,h3,h4,h5,h6){break-after:avoid}.sl-markdown-content :is(p,li){orphans:2;widows:2}.sl-markdown-content pre{overflow-x:hidden;white-space:pre-wrap}.sl-markdown-content .expressive-code,.sl-markdown-content figure,.sl-markdown-content pre{break-inside:avoid}.expressive-code .frame.is-terminal .header:before{box-shadow:inset 99rem 99rem var(--sl-color-gray-5)}.expressive-code .frame.has-title:not(.is-terminal) .header{background:transparent;border-bottom:1px solid var(--sl-color-gray-6)}.expressive-code .frame.has-title:not(.is-terminal) .title{background:transparent}.expressive-code .frame.has-title:not(.is-terminal) .title:after{border-top:0}.expressive-code .copy{display:none}.sl-markdown-content code:not(:where(.not-content *)){background-color:transparent;padding:0;margin-block:unset;font-size:.9375em}.sl-badge{background:transparent;color:var(--sl-color-white)}starlight-file-tree{break-inside:avoid}starlight-file-tree .highlight{outline:3px solid var(--sl-color-accent-low);color:var(--sl-color-text);background-color:transparent}.starlight-aside{break-inside:avoid}.sl-link-button.primary{background:transparent;border-color:var(--sl-color-white);color:var(--sl-color-white)}starlight-tabs{break-inside:avoid}.sl-steps>li:after{box-shadow:inset 99rem 99rem var(--sl-color-hairline-light)}} diff --git a/tutorials/vonage_video_react_app-feature-config/steps/_astro/ui-core.CJyTyO9Y.js b/tutorials/vonage_video_react_app-feature-config/steps/_astro/ui-core.CJyTyO9Y.js new file mode 100644 index 00000000..9be6715a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/_astro/ui-core.CJyTyO9Y.js @@ -0,0 +1,2 @@ +import{_ as is}from"./Search.astro_astro_type_script_index_0_lang.EjmW2doR.js";var os=Object.defineProperty,F=(e,u)=>{for(var t in u)os(e,t,{get:u[t],enumerable:!0})};function P(){}function hu(e){return e()}function ye(){return Object.create(null)}function W(e){e.forEach(hu)}function Cu(e){return typeof e=="function"}function fe(e,u){return e!=e?u==u:e!==u||e&&typeof e=="object"||typeof e=="function"}var oe;function ce(e,u){return oe||(oe=document.createElement("a")),oe.href=u,e===oe.href}function _s(e){return Object.keys(e).length===0}function B(e,u){e.appendChild(u)}function T(e,u,t){e.insertBefore(u,t||null)}function p(e){e.parentNode&&e.parentNode.removeChild(e)}function ie(e,u){for(let t=0;te.removeEventListener(u,t,r)}function g(e,u,t){t==null?e.removeAttribute(u):e.getAttribute(u)!==t&&e.setAttribute(u,t)}function fs(e){return Array.from(e.childNodes)}function j(e,u){u=""+u,e.data!==u&&(e.data=u)}function ze(e,u){e.value=u??""}function K(e,u,t){e.classList[t?"add":"remove"](u)}var Es=class{constructor(e=!1){this.is_svg=!1,this.is_svg=e,this.e=this.n=null}c(e){this.h(e)}m(e,u,t=null){this.e||(this.is_svg?this.e=cs(u.nodeName):this.e=v(u.nodeType===11?"TEMPLATE":u.nodeName),this.t=u.tagName!=="TEMPLATE"?u:u.content,this.c(e)),this.i(t)}h(e){this.e.innerHTML=e,this.n=Array.from(this.e.nodeName==="TEMPLATE"?this.e.content.childNodes:this.e.childNodes)}i(e){for(let u=0;ue.indexOf(r)===-1?u.push(r):t.push(r)),t.forEach(r=>r()),$=u}var _e=new Set,J;function le(){J={r:0,c:[],p:J}}function ne(){J.r||W(J.c),J=J.p}function z(e,u){e&&e.i&&(_e.delete(e),e.i(u))}function U(e,u,t,r){if(e&&e.o){if(_e.has(e))return;_e.add(e),J.c.push(()=>{_e.delete(e),r&&(t&&e.d(1),r())}),e.o(u)}else r&&r()}function Bs(e,u){U(e,1,1,()=>{u.delete(e.key)})}function vs(e,u,t,r,s,a,l,n,i,f,o,h){let C=e.length,E=a.length,c=C;const _={};for(;c--;)_[e[c].key]=c;const d=[],R=new Map,A=new Map,k=[];for(c=E;c--;){const D=h(s,a,c),S=t(D);let w=l.get(S);w?k.push(()=>w.p(D,u)):(w=f(S,D),w.c()),R.set(S,d[c]=w),S in _&&A.set(S,Math.abs(c-_[S]))}const y=new Set,q=new Set;function L(D){z(D,1),D.m(n,o),l.set(D.key,D),o=D.first,E--}for(;C&&E;){const D=d[E-1],S=e[C-1],w=D.key,x=S.key;D===S?(o=D.first,C--,E--):R.has(x)?!l.has(w)||y.has(w)?L(D):q.has(x)?C--:A.get(w)>A.get(x)?(q.add(w),L(D)):(y.add(x),C--):(i(S,l),C--)}for(;C--;){const D=e[C];R.has(D.key)||i(D,l)}for(;E;)L(d[E-1]);return W(k),d}function ps(e,u,t){const r=e.$$.props[u];r!==void 0&&(e.$$.bound[r]=t,t(e.$$.ctx[r]))}function ke(e){e&&e.c()}function Ee(e,u,t,r){const{fragment:s,after_update:a}=e.$$;s&&s.m(u,t),r||Te(()=>{const l=e.$$.on_mount.map(hu).filter(Cu);e.$$.on_destroy?e.$$.on_destroy.push(...l):W(l),e.$$.on_mount=[]}),a.forEach(Te)}function de(e,u){const t=e.$$;t.fragment!==null&&(Rs(t.after_update),W(t.on_destroy),t.fragment&&t.fragment.d(u),t.on_destroy=t.fragment=null,t.ctx=[])}function Ts(e,u){e.$$.dirty[0]===-1&&(X.push(e),ms(),e.$$.dirty.fill(0)),e.$$.dirty[u/31|0]|=1<{const c=E.length?E[0]:C;return f.ctx&&s(f.ctx[h],f.ctx[h]=c)&&(!f.skip_bound&&f.bound[h]&&f.bound[h](c),o&&Ts(e,h)),C}):[],f.update(),o=!0,W(f.before_update),f.fragment=r?r(f.ctx):!1,u.target){if(u.hydrate){const h=fs(u.target);f.fragment&&f.fragment.l(h),h.forEach(p)}else f.fragment&&f.fragment.c();u.intro&&z(e.$$.fragment),Ee(e,u.target,u.anchor,u.customElement),gu()}re(i)}var Ce=class{$destroy(){de(this,1),this.$destroy=P}$on(e,u){if(!Cu(u))return P;const t=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return t.push(u),()=>{const r=t.indexOf(u);r!==-1&&t.splice(r,1)}}$set(e){this.$$set&&!_s(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}};function O(e){const u=typeof e=="string"?e.charCodeAt(0):e;return u>=97&&u<=122||u>=65&&u<=90}function Q(e){const u=typeof e=="string"?e.charCodeAt(0):e;return u>=48&&u<=57}function V(e){return O(e)||Q(e)}var Fs=["art-lojban","cel-gaulish","no-bok","no-nyn","zh-guoyu","zh-hakka","zh-min","zh-min-nan","zh-xiang"],je={"en-gb-oed":"en-GB-oxendict","i-ami":"ami","i-bnn":"bnn","i-default":null,"i-enochian":null,"i-hak":"hak","i-klingon":"tlh","i-lux":"lb","i-mingo":null,"i-navajo":"nv","i-pwn":"pwn","i-tao":"tao","i-tay":"tay","i-tsu":"tsu","sgn-be-fr":"sfb","sgn-be-nl":"vgt","sgn-ch-de":"sgg","art-lojban":"jbo","cel-gaulish":null,"no-bok":"nb","no-nyn":"nn","zh-guoyu":"cmn","zh-hakka":"hak","zh-min":null,"zh-min-nan":"nan","zh-xiang":"hsn"},ks={}.hasOwnProperty;function Au(e,u={}){const t=Oe(),r=String(e),s=r.toLowerCase();let a=0;if(e==null)throw new Error("Expected string, got `"+e+"`");if(ks.call(je,s)){const n=je[s];return(u.normalize===void 0||u.normalize===null||u.normalize)&&typeof n=="string"?Au(n):(t[Fs.includes(s)?"regular":"irregular"]=r,t)}for(;O(s.charCodeAt(a))&&a<9;)a++;if(a>1&&a<9){if(t.language=r.slice(0,a),a<4){let n=0;for(;s.charCodeAt(a)===45&&O(s.charCodeAt(a+1))&&O(s.charCodeAt(a+2))&&O(s.charCodeAt(a+3))&&!O(s.charCodeAt(a+4));){if(n>2)return l(a,3,"Too many extended language subtags, expected at most 3 subtags");t.extendedLanguageSubtags.push(r.slice(a+1,a+4)),a+=4,n++}}for(s.charCodeAt(a)===45&&O(s.charCodeAt(a+1))&&O(s.charCodeAt(a+2))&&O(s.charCodeAt(a+3))&&O(s.charCodeAt(a+4))&&!O(s.charCodeAt(a+5))&&(t.script=r.slice(a+1,a+5),a+=5),s.charCodeAt(a)===45&&(O(s.charCodeAt(a+1))&&O(s.charCodeAt(a+2))&&!O(s.charCodeAt(a+3))?(t.region=r.slice(a+1,a+3),a+=3):Q(s.charCodeAt(a+1))&&Q(s.charCodeAt(a+2))&&Q(s.charCodeAt(a+3))&&!Q(s.charCodeAt(a+4))&&(t.region=r.slice(a+1,a+4),a+=4));s.charCodeAt(a)===45;){const n=a+1;let i=n;for(;V(s.charCodeAt(i));){if(i-n>7)return l(i,1,"Too long variant, expected at most 8 characters");i++}if(i-n>4||i-n>3&&Q(s.charCodeAt(n)))t.variants.push(r.slice(n,i)),a=i;else break}for(;s.charCodeAt(a)===45&&!(s.charCodeAt(a+1)===120||!V(s.charCodeAt(a+1))||s.charCodeAt(a+2)!==45||!V(s.charCodeAt(a+3)));){let n=a+2,i=0;for(;s.charCodeAt(n)===45&&V(s.charCodeAt(n+1))&&V(s.charCodeAt(n+2));){const f=n+1;for(n=f+2,i++;V(s.charCodeAt(n));){if(n-f>7)return l(n,2,"Too long extension, expected at most 8 characters");n++}}if(!i)return l(n,4,"Empty extension, extensions must have at least 2 characters of content");t.extensions.push({singleton:r.charAt(a+1),extensions:r.slice(a+3,n).split("-")}),a=n}}else a=0;if(a===0&&s.charCodeAt(a)===120||s.charCodeAt(a)===45&&s.charCodeAt(a+1)===120){a=a?a+2:1;let n=a;for(;s.charCodeAt(n)===45&&V(s.charCodeAt(n+1));){const i=a+1;for(n=i;V(s.charCodeAt(n));){if(n-i>7)return l(n,5,"Too long private-use area, expected at most 8 characters");n++}t.privateuse.push(r.slice(a+1,n)),a=n}}if(a!==r.length)return l(a,6,"Found superfluous content after tag");return t;function l(n,i,f){return u.warning&&u.warning(f,i,n),u.forgiving?t:Oe()}}function Oe(){return{language:null,extendedLanguageSubtags:[],script:null,region:null,variants:[],extensions:[],privateuse:[],irregular:null,regular:null}}function Ue(e,u,t){const r=e.slice();return r[8]=u[t][0],r[9]=u[t][1],r}function Ds(e){let u,t,r,s,a,l=e[0]&&Ie();return{c(){l&&l.c(),u=b(),t=v("div"),r=v("p"),r.textContent=`${e[3](30)}`,s=b(),a=v("p"),a.textContent=`${e[3](40)}`,g(r,"class","pagefind-ui__result-title pagefind-ui__loading svelte-j9e30"),g(a,"class","pagefind-ui__result-excerpt pagefind-ui__loading svelte-j9e30"),g(t,"class","pagefind-ui__result-inner svelte-j9e30")},m(n,i){l&&l.m(n,i),T(n,u,i),T(n,t,i),B(t,r),B(t,s),B(t,a)},p(n,i){n[0]?l||(l=Ie(),l.c(),l.m(u.parentNode,u)):l&&(l.d(1),l=null)},d(n){l&&l.d(n),n&&p(u),n&&p(t)}}}function bs(e){let u,t,r,s,a=e[1].meta?.title+"",l,n,i,f,o=e[1].excerpt+"",h,C=e[0]&&Pe(e),E=e[2].length&&xe(e);return{c(){C&&C.c(),u=b(),t=v("div"),r=v("p"),s=v("a"),l=M(a),i=b(),f=v("p"),h=b(),E&&E.c(),g(s,"class","pagefind-ui__result-link svelte-j9e30"),g(s,"href",n=e[1].meta?.url||e[1].url),g(r,"class","pagefind-ui__result-title svelte-j9e30"),g(f,"class","pagefind-ui__result-excerpt svelte-j9e30"),g(t,"class","pagefind-ui__result-inner svelte-j9e30")},m(c,_){C&&C.m(c,_),T(c,u,_),T(c,t,_),B(t,r),B(r,s),B(s,l),B(t,i),B(t,f),f.innerHTML=o,B(t,h),E&&E.m(t,null)},p(c,_){c[0]?C?C.p(c,_):(C=Pe(c),C.c(),C.m(u.parentNode,u)):C&&(C.d(1),C=null),_&2&&a!==(a=c[1].meta?.title+"")&&j(l,a),_&2&&n!==(n=c[1].meta?.url||c[1].url)&&g(s,"href",n),_&2&&o!==(o=c[1].excerpt+"")&&(f.innerHTML=o),c[2].length?E?E.p(c,_):(E=xe(c),E.c(),E.m(t,null)):E&&(E.d(1),E=null)},d(c){C&&C.d(c),c&&p(u),c&&p(t),E&&E.d()}}}function Ie(e){let u;return{c(){u=v("div"),g(u,"class","pagefind-ui__result-thumb pagefind-ui__loading svelte-j9e30")},m(t,r){T(t,u,r)},d(t){t&&p(u)}}}function Pe(e){let u,t=e[1].meta.image&&Le(e);return{c(){u=v("div"),t&&t.c(),g(u,"class","pagefind-ui__result-thumb svelte-j9e30")},m(r,s){T(r,u,s),t&&t.m(u,null)},p(r,s){r[1].meta.image?t?t.p(r,s):(t=Le(r),t.c(),t.m(u,null)):t&&(t.d(1),t=null)},d(r){r&&p(u),t&&t.d()}}}function Le(e){let u,t,r;return{c(){u=v("img"),g(u,"class","pagefind-ui__result-image svelte-j9e30"),ce(u.src,t=e[1].meta?.image)||g(u,"src",t),g(u,"alt",r=e[1].meta?.image_alt||e[1].meta?.title)},m(s,a){T(s,u,a)},p(s,a){a&2&&!ce(u.src,t=s[1].meta?.image)&&g(u,"src",t),a&2&&r!==(r=s[1].meta?.image_alt||s[1].meta?.title)&&g(u,"alt",r)},d(s){s&&p(u)}}}function xe(e){let u,t=e[2],r=[];for(let s=0;se.toLocaleUpperCase();function Ss(e,u,t){let{show_images:r=!0}=u,{process_result:s=null}=u,{result:a={data:async()=>{}}}=u;const l=["title","image","image_alt","url"];let n,i=[];const f=async h=>{t(1,n=await h.data()),t(1,n=s?.(n)??n),t(2,i=Object.entries(n.meta).filter(([C])=>!l.includes(C)))},o=(h=30)=>". ".repeat(Math.floor(10+Math.random()*h));return e.$$set=h=>{"show_images"in h&&t(0,r=h.show_images),"process_result"in h&&t(4,s=h.process_result),"result"in h&&t(5,a=h.result)},e.$$.update=()=>{e.$$.dirty&32&&f(a)},[r,n,i,o,s,a]}var Hs=class extends Ce{constructor(e){super(),he(this,e,Ss,Ms,fe,{show_images:0,process_result:4,result:5})}},ws=Hs;function Ke(e,u,t){const r=e.slice();return r[11]=u[t][0],r[12]=u[t][1],r}function Ge(e,u,t){const r=e.slice();return r[15]=u[t],r}function Ns(e){let u,t,r,s,a,l=e[0]&&Je();return{c(){l&&l.c(),u=b(),t=v("div"),r=v("p"),r.textContent=`${e[5](30)}`,s=b(),a=v("p"),a.textContent=`${e[5](40)}`,g(r,"class","pagefind-ui__result-title pagefind-ui__loading svelte-4xnkmf"),g(a,"class","pagefind-ui__result-excerpt pagefind-ui__loading svelte-4xnkmf"),g(t,"class","pagefind-ui__result-inner svelte-4xnkmf")},m(n,i){l&&l.m(n,i),T(n,u,i),T(n,t,i),B(t,r),B(t,s),B(t,a)},p(n,i){n[0]?l||(l=Je(),l.c(),l.m(u.parentNode,u)):l&&(l.d(1),l=null)},d(n){l&&l.d(n),n&&p(u),n&&p(t)}}}function ys(e){let u,t,r,s,a=e[1].meta?.title+"",l,n,i,f,o,h=e[0]&&We(e),C=e[4]&&Ye(e),E=e[3],c=[];for(let d=0;de.toLocaleUpperCase();function js(e,u,t){let{show_images:r=!0}=u,{process_result:s=null}=u,{result:a={data:async()=>{}}}=u;const l=["title","image","image_alt","url"];let n,i=[],f=[],o=!1;const h=(c,_)=>{if(c.length<=_)return c;const d=[...c].sort((R,A)=>A.locations.length-R.locations.length).slice(0,3).map(R=>R.url);return c.filter(R=>d.includes(R.url))},C=async c=>{t(1,n=await c.data()),t(1,n=s?.(n)??n),t(2,i=Object.entries(n.meta).filter(([_])=>!l.includes(_))),Array.isArray(n.sub_results)&&(t(4,o=n.sub_results?.[0]?.url===(n.meta?.url||n.url)),o?t(3,f=h(n.sub_results.slice(1),3)):t(3,f=h([...n.sub_results],3)))},E=(c=30)=>". ".repeat(Math.floor(10+Math.random()*c));return e.$$set=c=>{"show_images"in c&&t(0,r=c.show_images),"process_result"in c&&t(6,s=c.process_result),"result"in c&&t(7,a=c.result)},e.$$.update=()=>{e.$$.dirty&128&&C(a)},[r,n,i,f,o,E,s,a]}var Os=class extends Ce{constructor(e){super(),he(this,e,js,zs,fe,{show_images:0,process_result:6,result:7})}},Us=Os;function uu(e,u,t){const r=e.slice();return r[10]=u[t][0],r[11]=u[t][1],r[12]=u,r[13]=t,r}function tu(e,u,t){const r=e.slice();return r[14]=u[t][0],r[15]=u[t][1],r[16]=u,r[17]=t,r}function ru(e){let u,t,r=e[4]("filters_label",e[5],e[6])+"",s,a,l=Object.entries(e[1]),n=[];for(let i=0;ie.toLocaleUpperCase(),iu=e=>e.toLowerCase();function Ps(e,u,t){let{available_filters:r=null}=u,{show_empty_filters:s=!0}=u,{open_filters:a=[]}=u,{translate:l=()=>""}=u,{automatic_translations:n={}}=u,{translations:i={}}=u,{selected_filters:f={}}=u,o=!1,h=!1;function C(E,c){f[`${E}:${c}`]=this.checked,t(0,f)}return e.$$set=E=>{"available_filters"in E&&t(1,r=E.available_filters),"show_empty_filters"in E&&t(2,s=E.show_empty_filters),"open_filters"in E&&t(3,a=E.open_filters),"translate"in E&&t(4,l=E.translate),"automatic_translations"in E&&t(5,n=E.automatic_translations),"translations"in E&&t(6,i=E.translations),"selected_filters"in E&&t(0,f=E.selected_filters)},e.$$.update=()=>{if(e.$$.dirty&258&&r&&!o){t(8,o=!0);let E=Object.entries(r||{});E.length===1&&Object.entries(E[0][1])?.length<=6&&t(7,h=!0)}},[f,r,s,a,l,n,i,h,o,C]}var Ls=class extends Ce{constructor(e){super(),he(this,e,Ps,Is,fe,{available_filters:1,show_empty_filters:2,open_filters:3,translate:4,automatic_translations:5,translations:6,selected_filters:0})}},xs=Ls,Ru={};F(Ru,{comments:()=>vu,default:()=>qs,direction:()=>pu,strings:()=>Tu,thanks_to:()=>Bu});var Bu="Jan Claasen ",vu="",pu="ltr",Tu={placeholder:"Soek",clear_search:"Opruim",load_more:"Laai nog resultate",search_label:"Soek hierdie webwerf",filters_label:"Filters",zero_results:"Geen resultate vir [SEARCH_TERM]",many_results:"[COUNT] resultate vir [SEARCH_TERM]",one_result:"[COUNT] resultate vir [SEARCH_TERM]",alt_search:"Geen resultate vir [SEARCH_TERM]. Toon resultate vir [DIFFERENT_TERM] in plaas daarvan",search_suggestion:"Geen resultate vir [SEARCH_TERM]. Probeer eerder een van die volgende terme:",searching:"Soek vir [SEARCH_TERM]"},qs={thanks_to:Bu,comments:vu,direction:pu,strings:Tu},Fu={};F(Fu,{comments:()=>Du,default:()=>Vs,direction:()=>bu,strings:()=>Mu,thanks_to:()=>ku});var ku="Jermanuts",Du="",bu="rtl",Mu={placeholder:"بحث",clear_search:"امسح",load_more:"حمِّل المزيد من النتائج",search_label:"ابحث في هذا الموقع",filters_label:"تصفيات",zero_results:"لا توجد نتائج ل [SEARCH_TERM]",many_results:"[COUNT] نتائج ل [SEARCH_TERM]",one_result:"[COUNT] نتيجة ل [SEARCH_TERM]",alt_search:"لا توجد نتائج ل [SEARCH_TERM]. يعرض النتائج ل [DIFFERENT_TERM] بدلاً من ذلك",search_suggestion:"لا توجد نتائج ل [SEARCH_TERM]. جرب أحد عمليات البحث التالية:",searching:"يبحث عن [SEARCH_TERM]..."},Vs={thanks_to:ku,comments:Du,direction:bu,strings:Mu},Su={};F(Su,{comments:()=>wu,default:()=>Ks,direction:()=>Nu,strings:()=>yu,thanks_to:()=>Hu});var Hu="Maruf Alom ",wu="",Nu="ltr",yu={placeholder:"অনুসন্ধান করুন",clear_search:"মুছে ফেলুন",load_more:"আরো ফলাফল দেখুন",search_label:"এই ওয়েবসাইটে অনুসন্ধান করুন",filters_label:"ফিল্টার",zero_results:"[SEARCH_TERM] এর জন্য কিছু খুঁজে পাওয়া যায়নি",many_results:"[COUNT]-টি ফলাফল পাওয়া গিয়েছে [SEARCH_TERM] এর জন্য",one_result:"[COUNT]-টি ফলাফল পাওয়া গিয়েছে [SEARCH_TERM] এর জন্য",alt_search:"কোন কিছু খুঁজে পাওয়া যায়নি [SEARCH_TERM] এর জন্য. পরিবর্তে [DIFFERENT_TERM] এর জন্য দেখানো হচ্ছে",search_suggestion:"কোন কিছু খুঁজে পাওয়া যায়নি [SEARCH_TERM] এর বিষয়ে. নিন্মের বিষয়বস্তু খুঁজে দেখুন:",searching:"অনুসন্ধান চলছে [SEARCH_TERM]..."},Ks={thanks_to:Hu,comments:wu,direction:Nu,strings:yu},zu={};F(zu,{comments:()=>Ou,default:()=>Gs,direction:()=>Uu,strings:()=>Iu,thanks_to:()=>ju});var ju="Pablo Villaverde ",Ou="",Uu="ltr",Iu={placeholder:"Cerca",clear_search:"Netejar",load_more:"Veure més resultats",search_label:"Cerca en aquest lloc",filters_label:"Filtres",zero_results:"No es van trobar resultats per [SEARCH_TERM]",many_results:"[COUNT] resultats trobats per [SEARCH_TERM]",one_result:"[COUNT] resultat trobat per [SEARCH_TERM]",alt_search:"No es van trobar resultats per [SEARCH_TERM]. Mostrant al seu lloc resultats per [DIFFERENT_TERM]",search_suggestion:"No es van trobar resultats per [SEARCH_TERM]. Proveu una de les cerques següents:",searching:"Cercant [SEARCH_TERM]..."},Gs={thanks_to:ju,comments:Ou,direction:Uu,strings:Iu},Pu={};F(Pu,{comments:()=>xu,default:()=>Js,direction:()=>qu,strings:()=>Vu,thanks_to:()=>Lu});var Lu="Dalibor Hon ",xu="",qu="ltr",Vu={placeholder:"Hledat",clear_search:"Smazat",load_more:"Načíst další výsledky",search_label:"Prohledat tuto stránku",filters_label:"Filtry",zero_results:"Žádné výsledky pro [SEARCH_TERM]",many_results:"[COUNT] výsledků pro [SEARCH_TERM]",one_result:"[COUNT] výsledek pro [SEARCH_TERM]",alt_search:"Žádné výsledky pro [SEARCH_TERM]. Zobrazují se výsledky pro [DIFFERENT_TERM]",search_suggestion:"Žádné výsledky pro [SEARCH_TERM]. Související výsledky hledání:",searching:"Hledám [SEARCH_TERM]..."},Js={thanks_to:Lu,comments:xu,direction:qu,strings:Vu},Ku={};F(Ku,{comments:()=>Ju,default:()=>Ws,direction:()=>Wu,strings:()=>Zu,thanks_to:()=>Gu});var Gu="Jonas Smedegaard ",Ju="",Wu="ltr",Zu={placeholder:"Søg",clear_search:"Nulstil",load_more:"Indlæs flere resultater",search_label:"Søg på dette website",filters_label:"Filtre",zero_results:"Ingen resultater for [SEARCH_TERM]",many_results:"[COUNT] resultater for [SEARCH_TERM]",one_result:"[COUNT] resultat for [SEARCH_TERM]",alt_search:"Ingen resultater for [SEARCH_TERM]. Viser resultater for [DIFFERENT_TERM] i stedet",search_suggestion:"Ingen resultater for [SEARCH_TERM]. Prøv et af disse søgeord i stedet:",searching:"Søger efter [SEARCH_TERM]..."},Ws={thanks_to:Gu,comments:Ju,direction:Wu,strings:Zu},Yu={};F(Yu,{comments:()=>Qu,default:()=>Zs,direction:()=>$u,strings:()=>et,thanks_to:()=>Xu});var Xu="Jan Claasen ",Qu="",$u="ltr",et={placeholder:"Suche",clear_search:"Löschen",load_more:"Mehr Ergebnisse laden",search_label:"Suche diese Seite",filters_label:"Filter",zero_results:"Keine Ergebnisse für [SEARCH_TERM]",many_results:"[COUNT] Ergebnisse für [SEARCH_TERM]",one_result:"[COUNT] Ergebnis für [SEARCH_TERM]",alt_search:"Keine Ergebnisse für [SEARCH_TERM]. Stattdessen werden Ergebnisse für [DIFFERENT_TERM] angezeigt",search_suggestion:"Keine Ergebnisse für [SEARCH_TERM]. Versuchen Sie eine der folgenden Suchen:",searching:"Suche für [SEARCH_TERM]"},Zs={thanks_to:Xu,comments:Qu,direction:$u,strings:et},ut={};F(ut,{comments:()=>rt,default:()=>Ys,direction:()=>st,strings:()=>at,thanks_to:()=>tt});var tt="Liam Bigelow ",rt="",st="ltr",at={placeholder:"Search",clear_search:"Clear",load_more:"Load more results",search_label:"Search this site",filters_label:"Filters",zero_results:"No results for [SEARCH_TERM]",many_results:"[COUNT] results for [SEARCH_TERM]",one_result:"[COUNT] result for [SEARCH_TERM]",alt_search:"No results for [SEARCH_TERM]. Showing results for [DIFFERENT_TERM] instead",search_suggestion:"No results for [SEARCH_TERM]. Try one of the following searches:",searching:"Searching for [SEARCH_TERM]..."},Ys={thanks_to:tt,comments:rt,direction:st,strings:at},lt={};F(lt,{comments:()=>it,default:()=>Xs,direction:()=>ot,strings:()=>_t,thanks_to:()=>nt});var nt="Pablo Villaverde ",it="",ot="ltr",_t={placeholder:"Buscar",clear_search:"Limpiar",load_more:"Ver más resultados",search_label:"Buscar en este sitio",filters_label:"Filtros",zero_results:"No se encontraron resultados para [SEARCH_TERM]",many_results:"[COUNT] resultados encontrados para [SEARCH_TERM]",one_result:"[COUNT] resultado encontrado para [SEARCH_TERM]",alt_search:"No se encontraron resultados para [SEARCH_TERM]. Mostrando en su lugar resultados para [DIFFERENT_TERM]",search_suggestion:"No se encontraron resultados para [SEARCH_TERM]. Prueba una de las siguientes búsquedas:",searching:"Buscando [SEARCH_TERM]..."},Xs={thanks_to:nt,comments:it,direction:ot,strings:_t},ct={};F(ct,{comments:()=>Et,default:()=>Qs,direction:()=>dt,strings:()=>ht,thanks_to:()=>ft});var ft="Ali Khaleqi Yekta ",Et="",dt="rtl",ht={placeholder:"جستجو",clear_search:"پاکسازی",load_more:"بارگذاری نتایج بیشتر",search_label:"جستجو در سایت",filters_label:"فیلترها",zero_results:"نتیجه‌ای برای [SEARCH_TERM] یافت نشد",many_results:"[COUNT] نتیجه برای [SEARCH_TERM] یافت شد",one_result:"[COUNT] نتیجه برای [SEARCH_TERM] یافت شد",alt_search:"نتیجه‌ای برای [SEARCH_TERM] یافت نشد. در عوض نتایج برای [DIFFERENT_TERM] نمایش داده می‌شود",search_suggestion:"نتیجه‌ای برای [SEARCH_TERM] یافت نشد. یکی از جستجوهای زیر را امتحان کنید:",searching:"در حال جستجوی [SEARCH_TERM]..."},Qs={thanks_to:ft,comments:Et,direction:dt,strings:ht},Ct={};F(Ct,{comments:()=>gt,default:()=>$s,direction:()=>At,strings:()=>Rt,thanks_to:()=>mt});var mt="Valtteri Laitinen ",gt="",At="ltr",Rt={placeholder:"Haku",clear_search:"Tyhjennä",load_more:"Lataa lisää tuloksia",search_label:"Hae tältä sivustolta",filters_label:"Suodattimet",zero_results:"Ei tuloksia haulle [SEARCH_TERM]",many_results:"[COUNT] tulosta haulle [SEARCH_TERM]",one_result:"[COUNT] tulos haulle [SEARCH_TERM]",alt_search:"Ei tuloksia haulle [SEARCH_TERM]. Näytetään tulokset sen sijaan haulle [DIFFERENT_TERM]",search_suggestion:"Ei tuloksia haulle [SEARCH_TERM]. Kokeile jotain seuraavista:",searching:"Haetaan [SEARCH_TERM]..."},$s={thanks_to:mt,comments:gt,direction:At,strings:Rt},Bt={};F(Bt,{comments:()=>pt,default:()=>ea,direction:()=>Tt,strings:()=>Ft,thanks_to:()=>vt});var vt="Nicolas Friedli ",pt="",Tt="ltr",Ft={placeholder:"Rechercher",clear_search:"Nettoyer",load_more:"Charger plus de résultats",search_label:"Recherche sur ce site",filters_label:"Filtres",zero_results:"Pas de résultat pour [SEARCH_TERM]",many_results:"[COUNT] résultats pour [SEARCH_TERM]",one_result:"[COUNT] résultat pour [SEARCH_TERM]",alt_search:"Pas de résultat pour [SEARCH_TERM]. Montre les résultats pour [DIFFERENT_TERM] à la place",search_suggestion:"Pas de résultat pour [SEARCH_TERM]. Essayer une des recherches suivantes:",searching:"Recherche [SEARCH_TERM]..."},ea={thanks_to:vt,comments:pt,direction:Tt,strings:Ft},kt={};F(kt,{comments:()=>bt,default:()=>ua,direction:()=>Mt,strings:()=>St,thanks_to:()=>Dt});var Dt="Pablo Villaverde ",bt="",Mt="ltr",St={placeholder:"Buscar",clear_search:"Limpar",load_more:"Ver máis resultados",search_label:"Buscar neste sitio",filters_label:"Filtros",zero_results:"Non se atoparon resultados para [SEARCH_TERM]",many_results:"[COUNT] resultados atopados para [SEARCH_TERM]",one_result:"[COUNT] resultado atopado para [SEARCH_TERM]",alt_search:"Non se atoparon resultados para [SEARCH_TERM]. Amosando no seu lugar resultados para [DIFFERENT_TERM]",search_suggestion:"Non se atoparon resultados para [SEARCH_TERM]. Probe unha das seguintes pesquisas:",searching:"Buscando [SEARCH_TERM]..."},ua={thanks_to:Dt,comments:bt,direction:Mt,strings:St},Ht={};F(Ht,{comments:()=>Nt,default:()=>ta,direction:()=>yt,strings:()=>zt,thanks_to:()=>wt});var wt="Nir Tamir ",Nt="",yt="rtl",zt={placeholder:"חיפוש",clear_search:"ניקוי",load_more:"עוד תוצאות",search_label:"חיפוש באתר זה",filters_label:"מסננים",zero_results:"לא נמצאו תוצאות עבור [SEARCH_TERM]",many_results:"נמצאו [COUNT] תוצאות עבור [SEARCH_TERM]",one_result:"נמצאה תוצאה אחת עבור [SEARCH_TERM]",alt_search:"לא נמצאו תוצאות עבור [SEARCH_TERM]. מוצגות תוצאות עבור [DIFFERENT_TERM]",search_suggestion:"לא נמצאו תוצאות עבור [SEARCH_TERM]. נסו אחד מהחיפושים הבאים:",searching:"מחפש את [SEARCH_TERM]..."},ta={thanks_to:wt,comments:Nt,direction:yt,strings:zt},jt={};F(jt,{comments:()=>Ut,default:()=>ra,direction:()=>It,strings:()=>Pt,thanks_to:()=>Ot});var Ot="Amit Yadav ",Ut="",It="ltr",Pt={placeholder:"खोजें",clear_search:"साफ करें",load_more:"और अधिक परिणाम लोड करें",search_label:"इस साइट में खोजें",filters_label:"फ़िल्टर",zero_results:"कोई परिणाम [SEARCH_TERM] के लिए नहीं मिला",many_results:"[COUNT] परिणाम [SEARCH_TERM] के लिए मिले",one_result:"[COUNT] परिणाम [SEARCH_TERM] के लिए मिला",alt_search:"[SEARCH_TERM] के लिए कोई परिणाम नहीं मिला। इसके बजाय [DIFFERENT_TERM] के लिए परिणाम दिखा रहा है",search_suggestion:"[SEARCH_TERM] के लिए कोई परिणाम नहीं मिला। निम्नलिखित खोजों में से कोई एक आज़माएं:",searching:"[SEARCH_TERM] की खोज की जा रही है..."},ra={thanks_to:Ot,comments:Ut,direction:It,strings:Pt},Lt={};F(Lt,{comments:()=>qt,default:()=>sa,direction:()=>Vt,strings:()=>Kt,thanks_to:()=>xt});var xt="Diomed ",qt="",Vt="ltr",Kt={placeholder:"Traži",clear_search:"Očisti",load_more:"Učitaj više rezultata",search_label:"Pretraži ovu stranicu",filters_label:"Filteri",zero_results:"Nema rezultata za [SEARCH_TERM]",many_results:"[COUNT] rezultata za [SEARCH_TERM]",one_result:"[COUNT] rezultat za [SEARCH_TERM]",alt_search:"Nema rezultata za [SEARCH_TERM]. Prikazujem rezultate za [DIFFERENT_TERM]",search_suggestion:"Nema rezultata za [SEARCH_TERM]. Pokušaj s jednom od ovih pretraga:",searching:"Pretražujem [SEARCH_TERM]..."},sa={thanks_to:xt,comments:qt,direction:Vt,strings:Kt},Gt={};F(Gt,{comments:()=>Wt,default:()=>aa,direction:()=>Zt,strings:()=>Yt,thanks_to:()=>Jt});var Jt="Adam Laki ",Wt="",Zt="ltr",Yt={placeholder:"Keresés",clear_search:"Törlés",load_more:"További találatok betöltése",search_label:"Keresés az oldalon",filters_label:"Szűrés",zero_results:"Nincs találat a(z) [SEARCH_TERM] kifejezésre",many_results:"[COUNT] db találat a(z) [SEARCH_TERM] kifejezésre",one_result:"[COUNT] db találat a(z) [SEARCH_TERM] kifejezésre",alt_search:"Nincs találat a(z) [SEARCH_TERM] kifejezésre. Találatok mutatása inkább a(z) [DIFFERENT_TERM] kifejezésre",search_suggestion:"Nincs találat a(z) [SEARCH_TERM] kifejezésre. Próbáld meg a következő keresések egyikét:",searching:"Keresés a(z) [SEARCH_TERM] kifejezésre..."},aa={thanks_to:Jt,comments:Wt,direction:Zt,strings:Yt},Xt={};F(Xt,{comments:()=>$t,default:()=>la,direction:()=>er,strings:()=>ur,thanks_to:()=>Qt});var Qt="Nixentric",$t="",er="ltr",ur={placeholder:"Cari",clear_search:"Bersihkan",load_more:"Muat lebih banyak hasil",search_label:"Telusuri situs ini",filters_label:"Filter",zero_results:"[SEARCH_TERM] tidak ditemukan",many_results:"Ditemukan [COUNT] hasil untuk [SEARCH_TERM]",one_result:"Ditemukan [COUNT] hasil untuk [SEARCH_TERM]",alt_search:"[SEARCH_TERM] tidak ditemukan. Menampilkan hasil [DIFFERENT_TERM] sebagai gantinya",search_suggestion:"[SEARCH_TERM] tidak ditemukan. Coba salah satu pencarian berikut ini:",searching:"Mencari [SEARCH_TERM]..."},la={thanks_to:Qt,comments:$t,direction:er,strings:ur},tr={};F(tr,{comments:()=>sr,default:()=>na,direction:()=>ar,strings:()=>lr,thanks_to:()=>rr});var rr="Cosette Bruhns Alonso, Andrew Janco ",sr="",ar="ltr",lr={placeholder:"Cerca",clear_search:"Cancella la cronologia",load_more:"Mostra più risultati",search_label:"Cerca nel sito",filters_label:"Filtri di ricerca",zero_results:"Nessun risultato per [SEARCH_TERM]",many_results:"[COUNT] risultati per [SEARCH_TERM]",one_result:"[COUNT] risultato per [SEARCH_TERM]",alt_search:"Nessun risultato per [SEARCH_TERM]. Mostrando risultati per [DIFFERENT_TERM] come alternativa.",search_suggestion:"Nessun risultato per [SEARCH_TERM]. Prova una delle seguenti ricerche:",searching:"Cercando [SEARCH_TERM]..."},na={thanks_to:rr,comments:sr,direction:ar,strings:lr},nr={};F(nr,{comments:()=>or,default:()=>ia,direction:()=>_r,strings:()=>cr,thanks_to:()=>ir});var ir="Tate",or="",_r="ltr",cr={placeholder:"検索",clear_search:"クリア",load_more:"次を読み込む",search_label:"このサイトを検索",filters_label:"フィルタ",zero_results:"[SEARCH_TERM]の検索に一致する情報はありませんでした",many_results:"[SEARCH_TERM]の[COUNT]件の検索結果",one_result:"[SEARCH_TERM]の[COUNT]件の検索結果",alt_search:"[SEARCH_TERM]の検索に一致する情報はありませんでした。[DIFFERENT_TERM]の検索結果を表示しています",search_suggestion:"[SEARCH_TERM]の検索に一致する情報はありませんでした。次のいずれかの検索を試してください",searching:"[SEARCH_TERM]を検索しています"},ia={thanks_to:ir,comments:or,direction:_r,strings:cr},fr={};F(fr,{comments:()=>dr,default:()=>oa,direction:()=>hr,strings:()=>Cr,thanks_to:()=>Er});var Er="Seokho Son ",dr="",hr="ltr",Cr={placeholder:"검색어",clear_search:"비우기",load_more:"검색 결과 더 보기",search_label:"사이트 검색",filters_label:"필터",zero_results:"[SEARCH_TERM]에 대한 결과 없음",many_results:"[SEARCH_TERM]에 대한 결과 [COUNT]건",one_result:"[SEARCH_TERM]에 대한 결과 [COUNT]건",alt_search:"[SEARCH_TERM]에 대한 결과 없음. [DIFFERENT_TERM]에 대한 결과",search_suggestion:"[SEARCH_TERM]에 대한 결과 없음. 추천 검색어: ",searching:"[SEARCH_TERM] 검색 중..."},oa={thanks_to:Er,comments:dr,direction:hr,strings:Cr},mr={};F(mr,{comments:()=>Ar,default:()=>_a,direction:()=>Rr,strings:()=>Br,thanks_to:()=>gr});var gr="",Ar="",Rr="ltr",Br={placeholder:"Rapu",clear_search:"Whakakore",load_more:"Whakauta ētahi otinga kē",search_label:"Rapu",filters_label:"Tātari",zero_results:"Otinga kore ki [SEARCH_TERM]",many_results:"[COUNT] otinga ki [SEARCH_TERM]",one_result:"[COUNT] otinga ki [SEARCH_TERM]",alt_search:"Otinga kore ki [SEARCH_TERM]. Otinga kē ki [DIFFERENT_TERM]",search_suggestion:"Otinga kore ki [SEARCH_TERM]. whakamātau ki ngā mea atu:",searching:"Rapu ki [SEARCH_TERM]..."},_a={thanks_to:gr,comments:Ar,direction:Rr,strings:Br},vr={};F(vr,{comments:()=>Tr,default:()=>ca,direction:()=>Fr,strings:()=>kr,thanks_to:()=>pr});var pr="Paul van Brouwershaven",Tr="",Fr="ltr",kr={placeholder:"Zoeken",clear_search:"Reset",load_more:"Meer resultaten laden",search_label:"Doorzoek deze site",filters_label:"Filters",zero_results:"Geen resultaten voor [SEARCH_TERM]",many_results:"[COUNT] resultaten voor [SEARCH_TERM]",one_result:"[COUNT] resultaat voor [SEARCH_TERM]",alt_search:"Geen resultaten voor [SEARCH_TERM]. In plaats daarvan worden resultaten voor [DIFFERENT_TERM] weergegeven",search_suggestion:"Geen resultaten voor [SEARCH_TERM]. Probeer een van de volgende zoekopdrachten:",searching:"Zoeken naar [SEARCH_TERM]..."},ca={thanks_to:pr,comments:Tr,direction:Fr,strings:kr},Dr={};F(Dr,{comments:()=>Mr,default:()=>fa,direction:()=>Sr,strings:()=>Hr,thanks_to:()=>br});var br="Christopher Wingate",Mr="",Sr="ltr",Hr={placeholder:"Søk",clear_search:"Fjern",load_more:"Last flere resultater",search_label:"Søk på denne siden",filters_label:"Filtre",zero_results:"Ingen resultater for [SEARCH_TERM]",many_results:"[COUNT] resultater for [SEARCH_TERM]",one_result:"[COUNT] resultat for [SEARCH_TERM]",alt_search:"Ingen resultater for [SEARCH_TERM]. Viser resultater for [DIFFERENT_TERM] i stedet",search_suggestion:"Ingen resultater for [SEARCH_TERM]. Prøv en av disse søkeordene i stedet:",searching:"Søker etter [SEARCH_TERM]"},fa={thanks_to:br,comments:Mr,direction:Sr,strings:Hr},wr={};F(wr,{comments:()=>yr,default:()=>Ea,direction:()=>zr,strings:()=>jr,thanks_to:()=>Nr});var Nr="",yr="",zr="ltr",jr={placeholder:"Szukaj",clear_search:"Wyczyść",load_more:"Załaduj więcej",search_label:"Przeszukaj tę stronę",filters_label:"Filtry",zero_results:"Brak wyników dla [SEARCH_TERM]",many_results:"[COUNT] wyników dla [SEARCH_TERM]",one_result:"[COUNT] wynik dla [SEARCH_TERM]",alt_search:"Brak wyników dla [SEARCH_TERM]. Wyświetlam wyniki dla [DIFFERENT_TERM]",search_suggestion:"Brak wyników dla [SEARCH_TERM]. Pokrewne wyniki wyszukiwania:",searching:"Szukam [SEARCH_TERM]..."},Ea={thanks_to:Nr,comments:yr,direction:zr,strings:jr},Or={};F(Or,{comments:()=>Ir,default:()=>da,direction:()=>Pr,strings:()=>Lr,thanks_to:()=>Ur});var Ur="Jonatah",Ir="",Pr="ltr",Lr={placeholder:"Pesquisar",clear_search:"Limpar",load_more:"Ver mais resultados",search_label:"Pesquisar",filters_label:"Filtros",zero_results:"Nenhum resultado encontrado para [SEARCH_TERM]",many_results:"[COUNT] resultados encontrados para [SEARCH_TERM]",one_result:"[COUNT] resultado encontrado para [SEARCH_TERM]",alt_search:"Nenhum resultado encontrado para [SEARCH_TERM]. Exibindo resultados para [DIFFERENT_TERM]",search_suggestion:"Nenhum resultado encontrado para [SEARCH_TERM]. Tente uma das seguintes pesquisas:",searching:"Pesquisando por [SEARCH_TERM]..."},da={thanks_to:Ur,comments:Ir,direction:Pr,strings:Lr},xr={};F(xr,{comments:()=>Vr,default:()=>ha,direction:()=>Kr,strings:()=>Gr,thanks_to:()=>qr});var qr="Bogdan Mateescu ",Vr="",Kr="ltr",Gr={placeholder:"Căutare",clear_search:"Ştergeţi",load_more:"Încărcați mai multe rezultate",search_label:"Căutați în acest site",filters_label:"Filtre",zero_results:"Niciun rezultat pentru [SEARCH_TERM]",many_results:"[COUNT] rezultate pentru [SEARCH_TERM]",one_result:"[COUNT] rezultat pentru [SEARCH_TERM]",alt_search:"Niciun rezultat pentru [SEARCH_TERM]. Se afișează în schimb rezultatele pentru [DIFFERENT_TERM]",search_suggestion:"Niciun rezultat pentru [SEARCH_TERM]. Încercați una dintre următoarele căutări:",searching:"Se caută după: [SEARCH_TERM]..."},ha={thanks_to:qr,comments:Vr,direction:Kr,strings:Gr},Jr={};F(Jr,{comments:()=>Zr,default:()=>Ca,direction:()=>Yr,strings:()=>Xr,thanks_to:()=>Wr});var Wr="Aleksandr Gordeev",Zr="",Yr="ltr",Xr={placeholder:"Поиск",clear_search:"Очистить поле",load_more:"Загрузить еще",search_label:"Поиск по сайту",filters_label:"Фильтры",zero_results:"Ничего не найдено по запросу: [SEARCH_TERM]",many_results:"[COUNT] результатов по запросу: [SEARCH_TERM]",one_result:"[COUNT] результат по запросу: [SEARCH_TERM]",alt_search:"Ничего не найдено по запросу: [SEARCH_TERM]. Показаны результаты по запросу: [DIFFERENT_TERM]",search_suggestion:"Ничего не найдено по запросу: [SEARCH_TERM]. Попробуйте один из следующих вариантов",searching:"Поиск по запросу: [SEARCH_TERM]"},Ca={thanks_to:Wr,comments:Zr,direction:Yr,strings:Xr},Qr={};F(Qr,{comments:()=>e0,default:()=>ma,direction:()=>u0,strings:()=>t0,thanks_to:()=>$r});var $r="Andrija Sagicc",e0="",u0="ltr",t0={placeholder:"Претрага",clear_search:"Брисање",load_more:"Приказ више резултата",search_label:"Претрага сајта",filters_label:"Филтери",zero_results:"Нема резултата за [SEARCH_TERM]",many_results:"[COUNT] резултата за [SEARCH_TERM]",one_result:"[COUNT] резултата за [SEARCH_TERM]",alt_search:"Нема резултата за [SEARCH_TERM]. Приказ додатник резултата за [DIFFERENT_TERM]",search_suggestion:"Нема резултата за [SEARCH_TERM]. Покушајте са неком од следећих претрага:",searching:"Претрага термина [SEARCH_TERM]..."},ma={thanks_to:$r,comments:e0,direction:u0,strings:t0},r0={};F(r0,{comments:()=>a0,default:()=>ga,direction:()=>l0,strings:()=>n0,thanks_to:()=>s0});var s0="Montazar Al-Jaber ",a0="",l0="ltr",n0={placeholder:"Sök",clear_search:"Rensa",load_more:"Visa fler träffar",search_label:"Sök på denna sida",filters_label:"Filter",zero_results:"[SEARCH_TERM] gav inga träffar",many_results:"[SEARCH_TERM] gav [COUNT] träffar",one_result:"[SEARCH_TERM] gav [COUNT] träff",alt_search:"[SEARCH_TERM] gav inga träffar. Visar resultat för [DIFFERENT_TERM] istället",search_suggestion:"[SEARCH_TERM] gav inga träffar. Försök igen med en av följande sökord:",searching:"Söker efter [SEARCH_TERM]..."},ga={thanks_to:s0,comments:a0,direction:l0,strings:n0},i0={};F(i0,{comments:()=>_0,default:()=>Aa,direction:()=>c0,strings:()=>f0,thanks_to:()=>o0});var o0="Anonymous",_0="",c0="ltr",f0={placeholder:"Tafuta",clear_search:"Futa",load_more:"Pakia matokeo zaidi",search_label:"Tafuta tovuti hii",filters_label:"Vichujio",zero_results:"Hakuna matokeo ya [SEARCH_TERM]",many_results:"Matokeo [COUNT] ya [SEARCH_TERM]",one_result:"Tokeo [COUNT] la [SEARCH_TERM]",alt_search:"Hakuna mayokeo ya [SEARCH_TERM]. Badala yake, inaonyesha matokeo ya [DIFFERENT_TERM]",search_suggestion:"Hakuna matokeo ya [SEARCH_TERM]. Jaribu mojawapo ya utafutaji ufuatao:",searching:"Kutafuta [SEARCH_TERM]..."},Aa={thanks_to:o0,comments:_0,direction:c0,strings:f0},E0={};F(E0,{comments:()=>h0,default:()=>Ra,direction:()=>C0,strings:()=>m0,thanks_to:()=>d0});var d0="",h0="",C0="ltr",m0={placeholder:"தேடுக",clear_search:"அழிக்குக",load_more:"மேலும் முடிவுகளைக் காட்டுக",search_label:"இந்த தளத்தில் தேடுக",filters_label:"வடிகட்டல்கள்",zero_results:"[SEARCH_TERM] க்கான முடிவுகள் இல்லை",many_results:"[SEARCH_TERM] க்கான [COUNT] முடிவுகள்",one_result:"[SEARCH_TERM] க்கான முடிவு",alt_search:"[SEARCH_TERM] இத்தேடலுக்கான முடிவுகள் இல்லை, இந்த தேடல்களுக்கான ஒத்த முடிவுகள் [DIFFERENT_TERM]",search_suggestion:"[SEARCH_TERM] இத் தேடலுக்கான முடிவுகள் இல்லை.இதற்கு பதிலீடான தேடல்களை தேடுக:",searching:"[SEARCH_TERM] தேடப்படுகின்றது"},Ra={thanks_to:d0,comments:h0,direction:C0,strings:m0},g0={};F(g0,{comments:()=>R0,default:()=>Ba,direction:()=>B0,strings:()=>v0,thanks_to:()=>A0});var A0="Taylan Özgür Bildik",R0="",B0="ltr",v0={placeholder:"Araştır",clear_search:"Temizle",load_more:"Daha fazla sonuç",search_label:"Site genelinde arama",filters_label:"Filtreler",zero_results:"[SEARCH_TERM] için sonuç yok",many_results:"[SEARCH_TERM] için [COUNT] sonuç bulundu",one_result:"[SEARCH_TERM] için [COUNT] sonuç bulundu",alt_search:"[SEARCH_TERM] için sonuç yok. Bunun yerine [DIFFERENT_TERM] için sonuçlar gösteriliyor",search_suggestion:"[SEARCH_TERM] için sonuç yok. Alternatif olarak aşağıdaki kelimelerden birini deneyebilirsiniz:",searching:"[SEARCH_TERM] araştırılıyor..."},Ba={thanks_to:A0,comments:R0,direction:B0,strings:v0},p0={};F(p0,{comments:()=>F0,default:()=>va,direction:()=>k0,strings:()=>D0,thanks_to:()=>T0});var T0="Vladyslav Lyshenko ",F0="",k0="ltr",D0={placeholder:"Пошук",clear_search:"Очистити поле",load_more:"Завантажити ще",search_label:"Пошук по сайту",filters_label:"Фільтри",zero_results:"Нічого не знайдено за запитом: [SEARCH_TERM]",many_results:"[COUNT] результатів на запит: [SEARCH_TERM]",one_result:"[COUNT] результат за запитом: [SEARCH_TERM]",alt_search:"Нічого не знайдено на запит: [SEARCH_TERM]. Показано результати на запит: [DIFFERENT_TERM]",search_suggestion:"Нічого не знайдено на запит: [SEARCH_TERM]. Спробуйте один із таких варіантів",searching:"Пошук за запитом: [SEARCH_TERM]"},va={thanks_to:T0,comments:F0,direction:k0,strings:D0},b0={};F(b0,{comments:()=>S0,default:()=>pa,direction:()=>H0,strings:()=>w0,thanks_to:()=>M0});var M0="Long Nhat Nguyen",S0="",H0="ltr",w0={placeholder:"Tìm kiếm",clear_search:"Xóa",load_more:"Nhiều kết quả hơn",search_label:"Tìm kiếm trong trang này",filters_label:"Bộ lọc",zero_results:"Không tìm thấy kết quả cho [SEARCH_TERM]",many_results:"[COUNT] kết quả cho [SEARCH_TERM]",one_result:"[COUNT] kết quả cho [SEARCH_TERM]",alt_search:"Không tìm thấy kết quả cho [SEARCH_TERM]. Kiểm thị kết quả thay thế với [DIFFERENT_TERM]",search_suggestion:"Không tìm thấy kết quả cho [SEARCH_TERM]. Thử một trong các tìm kiếm:",searching:"Đang tìm kiếm cho [SEARCH_TERM]..."},pa={thanks_to:M0,comments:S0,direction:H0,strings:w0},N0={};F(N0,{comments:()=>z0,default:()=>Ta,direction:()=>j0,strings:()=>O0,thanks_to:()=>y0});var y0="Amber Song",z0="",j0="ltr",O0={placeholder:"搜索",clear_search:"清除",load_more:"加载更多结果",search_label:"站内搜索",filters_label:"筛选",zero_results:"未找到 [SEARCH_TERM] 的相关结果",many_results:"找到 [COUNT] 个 [SEARCH_TERM] 的相关结果",one_result:"找到 [COUNT] 个 [SEARCH_TERM] 的相关结果",alt_search:"未找到 [SEARCH_TERM] 的相关结果。改为显示 [DIFFERENT_TERM] 的相关结果",search_suggestion:"未找到 [SEARCH_TERM] 的相关结果。请尝试以下搜索。",searching:"正在搜索 [SEARCH_TERM]..."},Ta={thanks_to:y0,comments:z0,direction:j0,strings:O0},U0={};F(U0,{comments:()=>P0,default:()=>Fa,direction:()=>L0,strings:()=>x0,thanks_to:()=>I0});var I0="Amber Song",P0="",L0="ltr",x0={placeholder:"搜索",clear_search:"清除",load_more:"加載更多結果",search_label:"站內搜索",filters_label:"篩選",zero_results:"未找到 [SEARCH_TERM] 的相關結果",many_results:"找到 [COUNT] 個 [SEARCH_TERM] 的相關結果",one_result:"找到 [COUNT] 個 [SEARCH_TERM] 的相關結果",alt_search:"未找到 [SEARCH_TERM] 的相關結果。改為顯示 [DIFFERENT_TERM] 的相關結果",search_suggestion:"未找到 [SEARCH_TERM] 的相關結果。請嘗試以下搜索。",searching:"正在搜索 [SEARCH_TERM]..."},Fa={thanks_to:I0,comments:P0,direction:L0,strings:x0},q0={};F(q0,{comments:()=>K0,default:()=>ka,direction:()=>G0,strings:()=>J0,thanks_to:()=>V0});var V0="Amber Song",K0="",G0="ltr",J0={placeholder:"搜索",clear_search:"清除",load_more:"加载更多结果",search_label:"站内搜索",filters_label:"筛选",zero_results:"未找到 [SEARCH_TERM] 的相关结果",many_results:"找到 [COUNT] 个 [SEARCH_TERM] 的相关结果",one_result:"找到 [COUNT] 个 [SEARCH_TERM] 的相关结果",alt_search:"未找到 [SEARCH_TERM] 的相关结果。改为显示 [DIFFERENT_TERM] 的相关结果",search_suggestion:"未找到 [SEARCH_TERM] 的相关结果。请尝试以下搜索。",searching:"正在搜索 [SEARCH_TERM]..."},ka={thanks_to:V0,comments:K0,direction:G0,strings:J0},Da=[Ru,Fu,Su,zu,Pu,Ku,Yu,ut,lt,ct,Ct,Bt,kt,Ht,jt,Lt,Gt,Xt,tr,nr,fr,mr,vr,Dr,wr,Or,xr,Jr,Qr,r0,i0,E0,g0,p0,b0,N0,U0,q0],ba=Da,Ma=["../../translations/af.json","../../translations/ar.json","../../translations/bn.json","../../translations/ca.json","../../translations/cs.json","../../translations/da.json","../../translations/de.json","../../translations/en.json","../../translations/es.json","../../translations/fa.json","../../translations/fi.json","../../translations/fr.json","../../translations/gl.json","../../translations/he.json","../../translations/hi.json","../../translations/hr.json","../../translations/hu.json","../../translations/id.json","../../translations/it.json","../../translations/ja.json","../../translations/ko.json","../../translations/mi.json","../../translations/nl.json","../../translations/no.json","../../translations/pl.json","../../translations/pt.json","../../translations/ro.json","../../translations/ru.json","../../translations/sr.json","../../translations/sv.json","../../translations/sw.json","../../translations/ta.json","../../translations/tr.json","../../translations/uk.json","../../translations/vi.json","../../translations/zh-cn.json","../../translations/zh-tw.json","../../translations/zh.json"];function ou(e,u,t){const r=e.slice();return r[51]=u[t],r}function _u(e){let u,t,r;function s(l){e[37](l)}let a={show_empty_filters:e[5],open_filters:e[6],available_filters:e[18],translate:e[20],automatic_translations:e[19],translations:e[7]};return e[0]!==void 0&&(a.selected_filters=e[0]),u=new xs({props:a}),ae.push(()=>ps(u,"selected_filters",s)),{c(){ke(u.$$.fragment)},m(l,n){Ee(u,l,n),r=!0},p(l,n){const i={};n[0]&32&&(i.show_empty_filters=l[5]),n[0]&64&&(i.open_filters=l[6]),n[0]&262144&&(i.available_filters=l[18]),n[0]&524288&&(i.automatic_translations=l[19]),n[0]&128&&(i.translations=l[7]),!t&&n[0]&1&&(t=!0,i.selected_filters=l[0],gs(()=>t=!1)),u.$set(i)},i(l){r||(z(u.$$.fragment,l),r=!0)},o(l){U(u.$$.fragment,l),r=!1},d(l){de(u,l)}}}function cu(e){let u,t,r,s;const a=[Ha,Sa],l=[];function n(i,f){return i[14]?0:1}return t=n(e),r=l[t]=a[t](e),{c(){u=v("div"),r.c(),g(u,"class","pagefind-ui__results-area svelte-e9gkc3")},m(i,f){T(i,u,f),l[t].m(u,null),s=!0},p(i,f){let o=t;t=n(i),t===o?l[t].p(i,f):(le(),U(l[o],1,1,()=>{l[o]=null}),ne(),r=l[t],r?r.p(i,f):(r=l[t]=a[t](i),r.c()),z(r,1),r.m(u,null))},i(i){s||(z(r),s=!0)},o(i){U(r),s=!1},d(i){i&&p(u),l[t].d()}}}function Sa(e){let u,t,r,s=[],a=new Map,l,n,i;function f(_,d){return _[13].results.length===0?ya:_[13].results.length===1?Na:wa}let o=f(e),h=o(e),C=e[13].results.slice(0,e[17]);const E=_=>_[51].id;for(let _=0;_e[17]&&Eu(e);return{c(){u=v("p"),h.c(),t=b(),r=v("ol");for(let _=0;__[17]?c?c.p(_,d):(c=Eu(_),c.c(),c.m(n.parentNode,n)):c&&(c.d(1),c=null)},i(_){if(!i){for(let d=0;d{i[C]=null}),ne(),s=i[r],s?s.p(u,h):(s=i[r]=n[r](u),s.c()),z(s,1),s.m(a.parentNode,a))},i(o){l||(z(s),l=!0)},o(o){U(s),l=!1},d(o){o&&p(t),i[r].d(o),o&&p(a)}}}function Eu(e){let u,t=e[20]("load_more",e[19],e[7])+"",r,s,a;return{c(){u=v("button"),r=M(t),g(u,"type","button"),g(u,"class","pagefind-ui__button svelte-e9gkc3")},m(l,n){T(l,u,n),B(u,r),s||(a=G(u,"click",e[22]),s=!0)},p(l,n){n[0]&524416&&t!==(t=l[20]("load_more",l[19],l[7])+"")&&j(r,t)},d(l){l&&p(u),s=!1,a()}}}function du(e){let u,t=e[20]("searching",e[19],e[7]).replace(/\[SEARCH_TERM\]/,e[16])+"",r;return{c(){u=v("p"),r=M(t),g(u,"class","pagefind-ui__message svelte-e9gkc3")},m(s,a){T(s,u,a),B(u,r)},p(s,a){a[0]&589952&&t!==(t=s[20]("searching",s[19],s[7]).replace(/\[SEARCH_TERM\]/,s[16])+"")&&j(r,t)},d(s){s&&p(u)}}}function Oa(e){let u,t,r,s,a,l,n=e[20]("clear_search",e[19],e[7])+"",i,f,o,h,C,E,c,_,d=e[12]&&_u(e),R=e[15]&&cu(e);return{c(){u=v("div"),t=v("form"),r=v("input"),a=b(),l=v("button"),i=M(n),f=b(),o=v("div"),d&&d.c(),h=b(),R&&R.c(),g(r,"class","pagefind-ui__search-input svelte-e9gkc3"),g(r,"type","text"),g(r,"placeholder",s=e[20]("placeholder",e[19],e[7])),g(r,"autocapitalize","none"),g(r,"enterkeyhint","search"),r.autofocus=e[8],g(l,"class","pagefind-ui__search-clear svelte-e9gkc3"),K(l,"pagefind-ui__suppressed",!e[9]),g(o,"class","pagefind-ui__drawer svelte-e9gkc3"),K(o,"pagefind-ui__hidden",!e[15]),g(t,"class","pagefind-ui__form svelte-e9gkc3"),g(t,"role","search"),g(t,"aria-label",C=e[20]("search_label",e[19],e[7])),g(t,"action","javascript:void(0);"),g(u,"class","pagefind-ui svelte-e9gkc3"),K(u,"pagefind-ui--reset",e[1])},m(A,k){T(A,u,k),B(u,t),B(t,r),ze(r,e[9]),e[34](r),B(t,a),B(t,l),B(l,i),e[35](l),B(t,f),B(t,o),d&&d.m(o,null),B(o,h),R&&R.m(o,null),E=!0,e[8]&&r.focus(),c||(_=[G(r,"focus",e[21]),G(r,"keydown",e[32]),G(r,"input",e[33]),G(l,"click",e[36]),G(t,"submit",Ua)],c=!0)},p(A,k){(!E||k[0]&524416&&s!==(s=A[20]("placeholder",A[19],A[7])))&&g(r,"placeholder",s),(!E||k[0]&256)&&(r.autofocus=A[8]),k[0]&512&&r.value!==A[9]&&ze(r,A[9]),(!E||k[0]&524416)&&n!==(n=A[20]("clear_search",A[19],A[7])+"")&&j(i,n),(!E||k[0]&512)&&K(l,"pagefind-ui__suppressed",!A[9]),A[12]?d?(d.p(A,k),k[0]&4096&&z(d,1)):(d=_u(A),d.c(),z(d,1),d.m(o,h)):d&&(le(),U(d,1,1,()=>{d=null}),ne()),A[15]?R?(R.p(A,k),k[0]&32768&&z(R,1)):(R=cu(A),R.c(),z(R,1),R.m(o,null)):R&&(le(),U(R,1,1,()=>{R=null}),ne()),(!E||k[0]&32768)&&K(o,"pagefind-ui__hidden",!A[15]),(!E||k[0]&524416&&C!==(C=A[20]("search_label",A[19],A[7])))&&g(t,"aria-label",C),(!E||k[0]&2)&&K(u,"pagefind-ui--reset",A[1])},i(A){E||(z(d),z(R),E=!0)},o(A){U(d),U(R),E=!1},d(A){A&&p(u),e[34](null),e[35](null),d&&d.d(),R&&R.d(),c=!1,W(_)}}}var Ua=e=>e.preventDefault();function Ia(e,u,t){const r={},s=Ma.map(m=>m.match(/([^\/]+)\.json$/)[1]);for(let m=0;mN[m]??H[m]??"";ds(()=>{let m=document?.querySelector?.("html")?.getAttribute?.("lang")||"en",H=Au(m.toLocaleLowerCase());t(19,He=r[`${H.language}-${H.script}-${H.region}`]||r[`${H.language}-${H.region}`]||r[`${H.language}`]||r.en)}),hs(()=>{S?.destroy?.(),S=null});const we=async()=>{if(!me&&(t(12,me=!0),!S)){let m;try{m=await is(()=>import(`${a}pagefind.js`),[])}catch(N){console.error(N),console.error([`Pagefind couldn't be loaded from ${this.options.bundlePath}pagefind.js`,"You can configure this by passing a bundlePath option to PagefindUI"].join(` +`)),document?.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?console.error(`[DEBUG: Loaded from ${document.currentScript.src??"bad script location"}]`):console.error("no known script location")}o||t(24,o=f?12:30);let H={...d||{},excerptLength:o};await m.options(H);for(const N of R){if(!N.bundlePath)throw new Error("mergeIndex requires a bundlePath parameter");const I=N.bundlePath;delete N.bundlePath,await m.mergeIndex(I,N)}S=m,Y0()}},Y0=async()=>{S&&(Se=await S.filters(),(!ue||!Object.keys(ue).length)&&t(18,ue=Se))},X0=m=>{let H={};return Object.entries(m).filter(([,N])=>N).forEach(([N])=>{let[I,Z]=N.split(/:(.*)$/);H[I]=H[I]||[],H[I].push(Z)}),H};let te;const Q0=async(m,H)=>{if(!m){t(15,Ae=!1),te&&clearTimeout(te);return}const N=X0(H),I=()=>$0(m,N);_>0&&m?(te&&clearTimeout(te),te=setTimeout(I,_),await Ne(),S.preload(m,{filters:N})):I(),es()},Ne=async()=>{for(;!S;)we(),await new Promise(m=>setTimeout(m,50))},$0=async(m,H)=>{t(16,Me=m||""),typeof C=="function"&&(m=C(m)),t(14,ge=!0),t(15,Ae=!0),await Ne();const N=++be,I={filters:H};q&&typeof q=="object"&&(I.sort=q);const Z=await S.search(m,I);be===N&&(Z.filters&&Object.keys(Z.filters)?.length&&t(18,ue=Z.filters),t(13,De=Z),t(14,ge=!1),t(17,Re=l))},es=()=>{const m=x.offsetWidth;m!=W0&&t(10,w.style.paddingRight=`${m+2}px`,w)},us=m=>{m?.preventDefault(),t(17,Re+=l)},ts=m=>{m.key==="Escape"&&(t(9,D=""),w.blur()),m.key==="Enter"&&m.preventDefault()};function rs(){D=this.value,t(9,D),t(23,A)}function ss(m){ae[m?"unshift":"push"](()=>{w=m,t(10,w)})}function as(m){ae[m?"unshift":"push"](()=>{x=m,t(11,x)})}const ls=()=>{t(9,D=""),w.blur()};function ns(m){L=m,t(0,L)}return e.$$set=m=>{"base_path"in m&&t(25,a=m.base_path),"page_size"in m&&t(26,l=m.page_size),"reset_styles"in m&&t(1,n=m.reset_styles),"show_images"in m&&t(2,i=m.show_images),"show_sub_results"in m&&t(3,f=m.show_sub_results),"excerpt_length"in m&&t(24,o=m.excerpt_length),"process_result"in m&&t(4,h=m.process_result),"process_term"in m&&t(27,C=m.process_term),"show_empty_filters"in m&&t(5,E=m.show_empty_filters),"open_filters"in m&&t(6,c=m.open_filters),"debounce_timeout_ms"in m&&t(28,_=m.debounce_timeout_ms),"pagefind_options"in m&&t(29,d=m.pagefind_options),"merge_index"in m&&t(30,R=m.merge_index),"trigger_search_term"in m&&t(23,A=m.trigger_search_term),"translations"in m&&t(7,k=m.translations),"autofocus"in m&&t(8,y=m.autofocus),"sort"in m&&t(31,q=m.sort),"selected_filters"in m&&t(0,L=m.selected_filters)},e.$$.update=()=>{e.$$.dirty[0]&8388608&&A&&(t(9,D=A),t(23,A="")),e.$$.dirty[0]&513&&Q0(D,L)},[L,n,i,f,h,E,c,k,y,D,w,x,me,De,ge,Ae,Me,Re,ue,He,Z0,we,us,A,o,a,l,C,_,d,R,q,ts,rs,ss,as,ls,ns]}var Pa=class extends Ce{constructor(e){super(),he(this,e,Ia,Oa,fe,{base_path:25,page_size:26,reset_styles:1,show_images:2,show_sub_results:3,excerpt_length:24,process_result:4,process_term:27,show_empty_filters:5,open_filters:6,debounce_timeout_ms:28,pagefind_options:29,merge_index:30,trigger_search_term:23,translations:7,autofocus:8,sort:31,selected_filters:0},null,[-1,-1])}},La=Pa,Fe;try{document?.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"&&(Fe=new URL(document.currentScript.src).pathname.match(/^(.*\/)(?:pagefind-)?ui.js.*$/)[1])}catch{Fe="/pagefind/"}var qa=class{constructor(e){this._pfs=null;let u=e.element??"[data-pagefind-ui]",t=e.bundlePath??Fe,r=e.pageSize??5,s=e.resetStyles??!0,a=e.showImages??!0,l=e.showSubResults??!1,n=e.excerptLength??0,i=e.processResult??null,f=e.processTerm??null,o=e.showEmptyFilters??!0,h=e.openFilters??[],C=e.debounceTimeoutMs??300,E=e.mergeIndex??[],c=e.translations??[],_=e.autofocus??!1,d=e.sort??null;delete e.element,delete e.bundlePath,delete e.pageSize,delete e.resetStyles,delete e.showImages,delete e.showSubResults,delete e.excerptLength,delete e.processResult,delete e.processTerm,delete e.showEmptyFilters,delete e.openFilters,delete e.debounceTimeoutMs,delete e.mergeIndex,delete e.translations,delete e.autofocus,delete e.sort;const R=u instanceof HTMLElement?u:document.querySelector(u);R?this._pfs=new La({target:R,props:{base_path:t,page_size:r,reset_styles:s,show_images:a,show_sub_results:l,excerpt_length:n,process_result:i,process_term:f,show_empty_filters:o,open_filters:h,debounce_timeout_ms:C,merge_index:E,translations:c,autofocus:_,sort:d,pagefind_options:e}}):console.error(`Pagefind UI couldn't find the selector ${u}`)}triggerSearch(e){this._pfs.$$set({trigger_search_term:e})}triggerFilters(e){let u={};for(let[t,r]of Object.entries(e))if(Array.isArray(r))for(let s of r)u[`${t}:${s}`]=!0;else u[`${t}:${r}`]=!0;this._pfs.$$set({selected_filters:u})}destroy(){this._pfs.$destroy()}};export{qa as PagefindUI}; diff --git a/tutorials/vonage_video_react_app-feature-config/steps/favicon.svg b/tutorials/vonage_video_react_app-feature-config/steps/favicon.svg new file mode 100644 index 00000000..cba5ac14 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/index.html b/tutorials/vonage_video_react_app-feature-config/steps/index.html new file mode 100644 index 00000000..8122de81 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/index.html @@ -0,0 +1,81 @@ + Vonage Video React App | Vonage Coding Exercise + Skip to content

Vonage Video React App

Feature Config

The Vonage Video React App ships with a broad set of features — archiving, chat, screen sharing, emoji reactions, captions, and more. Every one of them can be turned on or off without touching any source code, using a single shell configuration file: vcrBuild.env.sh.

+

In this tutorial you will:

+
    +
  • Understand how frontend configuration works in the app
  • +
  • Enable and disable feature flags to tailor the experience for your use case
  • +
  • Adjust display defaults such as video resolution and room layout
  • +
  • Apply your changes and verify them in the running app
  • +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#PageWhat you’ll do
01Backend credentialsCreate backend/.env with your Vonage App ID and private key
02Configuration file overviewExplore vcrBuild.env.sh and understand its structure
03Feature flagsEnable and disable individual features
04Display settingsAdjust video resolution and default room layout
05Apply and verifyRebuild the app and confirm your changes in the browser
\ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/tutorial-config.json b/tutorials/vonage_video_react_app-feature-config/tutorial-config.json index abe45ac4..515af57d 100644 --- a/tutorials/vonage_video_react_app-feature-config/tutorial-config.json +++ b/tutorials/vonage_video_react_app-feature-config/tutorial-config.json @@ -5,7 +5,7 @@ "terminal", "browser" ], - "repository": "https://github.com/Vonage/vonage-video-react-app", + "repository": "https://github.com/VZaphod/vonage-video-react-app", "starterFiles": [], "capabilities": [], "version": "1.0.0", diff --git a/uploads/vonage_video_react_app-feature-config.zip b/uploads/vonage_video_react_app-feature-config.zip deleted file mode 100644 index 8eea7797..00000000 Binary files a/uploads/vonage_video_react_app-feature-config.zip and /dev/null differ