diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2920163 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.angular +node_modules/ +dist/ \ No newline at end of file diff --git a/angular.json b/angular.json index e4c7209..760733d 100644 --- a/angular.json +++ b/angular.json @@ -25,7 +25,8 @@ "src/styles.scss" ], "scripts": [ - "src/assets/vf-tabs/vf-tabs.js" + "node_modules/@visual-framework/vf-banner/vf-banner.js", + "node_modules/@visual-framework/vf-tabs/vf-tabs.js" ] }, "configurations": { @@ -37,6 +38,14 @@ "extractLicenses": true, "vendorChunk": false, "buildOptimizer": true + }, + "development": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true } } }, @@ -73,5 +82,8 @@ } } } + }, + "cli": { + "analytics": false } } diff --git a/package.json b/package.json index 155e238..46a9994 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "visual-framework", + "name": "vf-angular", "version": "0.0.0", "scripts": { "ng": "ng", @@ -9,12 +9,12 @@ "build:dev": "ng build --configuration development", "watch": "ng build --watch --configuration development", "test": "ng test", - "test:all": "gulp test:all", "test:component": "gulp test:component", "test:watch": "gulp test:watch", "test:ci": "gulp test:ci", "test:coverage": "ng test --no-watch --code-coverage", - "sonar": "sonar-scanner" + "sonar": "sonar-scanner", + "test:all": "ng test --watch --browsers=ChromeHeadless --code-coverage" }, "private": true, "dependencies": { @@ -28,17 +28,28 @@ "@angular/router": "^16.1.0", "@visual-framework/vf-back-to-top": "^1.0.1", "@visual-framework/vf-badge": "^3.0.3", - "@visual-framework/vf-banner": "2.0.3", + "@visual-framework/vf-banner": "^2.0.3", "@visual-framework/vf-blockquote": "^1.2.8", "@visual-framework/vf-body": "^1.2.0", "@visual-framework/vf-box": "^2.4.0", "@visual-framework/vf-button": "3.0.2", - "@visual-framework/vf-content": "1.6.16", + "@visual-framework/vf-chatbot": "^1.0.0", + "@visual-framework/vf-chatbot-action-prompt": "^1.0.0-beta.3", + "@visual-framework/vf-chatbot-dialog": "^1.0.0-beta.1", + "@visual-framework/vf-chatbot-fab": "^1.0.0-beta.3", + "@visual-framework/vf-chatbot-feedback": "^1.0.0-beta.4", + "@visual-framework/vf-chatbot-modal": "^1.0.0", + "@visual-framework/vf-chatbot-prompt": "^1.0.0-beta.3", + "@visual-framework/vf-chatbot-selector": "^1.0.0-beta.3", + "@visual-framework/vf-chatbot-sources": "^1.0.0-beta.3", + "@visual-framework/vf-chatbot-standalone": "^1.0.0", + "@visual-framework/vf-chatbot-welcome": "^1.0.0", + "@visual-framework/vf-content": "^1.6.16", "@visual-framework/vf-core": "2.2.47", "@visual-framework/vf-extensions-react": "^0.0.8", "@visual-framework/vf-font-plex-mono": "^1.1.3", "@visual-framework/vf-font-plex-sans": "^1.1.3", - "@visual-framework/vf-footer": "^1.2.1", + "@visual-framework/vf-footer": "^1.2.4", "@visual-framework/vf-global-header": "^3.1.6", "@visual-framework/vf-grid": "^1.4.1", "@visual-framework/vf-hero": "^4.0.3", @@ -53,6 +64,7 @@ "@visual-framework/vf-tabs": "^2.1.5", "@visual-framework/vf-text": "^1.1.1", "@visual-framework/vf-u-fullbleed": "^1.2.2", + "gulp": "^5.0.1", "@visual-framework/vf-utility-classes": "2.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", @@ -67,7 +79,14 @@ "@visual-framework/vf-config": "1.0.1-alpha.0", "@visual-framework/vf-core": "2.2.47", "glob": "^7.2.0", - "gulp": "^5.0.0", + "gulp": "^5.0.1", + "@visual-framework/vf-design-tokens": "^3.6.3", + "@visual-framework/vf-font-plex-mono": "^1.1.1", + "@visual-framework/vf-font-plex-sans": "^1.1.1", + "@visual-framework/vf-sass-config": "^2.7.1", + "@visual-framework/vf-sass-starter": "^0.1.28", + "@visual-framework/vf-sass-utilities": "^1.0.1", + "@visual-framework/vf-utility-classes": "^2.0.0", "gulp-shell": "^0.8.0", "jasmine-core": "~4.6.0", "karma": "~6.4.4", @@ -78,6 +97,6 @@ "karma-junit-reporter": "^2.0.1", "karma-sonarqube-unit-reporter": "^0.0.23", "karma-spec-reporter": "^0.0.36", - "typescript": "~5.1.3" + "typescript": "~5.1.6" } } diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 7dded3f..487104b 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -6,6 +6,8 @@ import { VfBlockquoteComponent } from './components/vf-blockquote/vf-blockquote. import { VfButtonComponent } from './components/vf-button/vf-button.component'; import { VfHeroComponent } from './components/vf-hero/vf-hero.component'; import { VfTabsComponent } from './components/vf-tabs/vf-tabs.component'; +import { VfChatbotComponent } from './components/vf-chatbot/vf-chatbot.component'; +import { VfChatbotStandalonePageComponent } from './components/vf-chatbot-standalone/vf-chatbot-standalone.angular.component'; import { VfBackToTopComponent } from './components/vf-back-to-top/vf-back-to-top.component'; import { HomeComponent } from './components/home/home.component'; import { SearchComponent } from './components/search/search.component'; @@ -20,6 +22,8 @@ const routes: Routes = [ { path: 'components/vf-button', component: VfButtonComponent }, { path: 'components/vf-hero', component: VfHeroComponent }, { path: 'components/vf-tabs', component: VfTabsComponent }, + { path: 'components/vf-chatbot', component: VfChatbotComponent }, + { path: 'components/vf-chatbot-standalone', component: VfChatbotStandalonePageComponent }, { path: '**', redirectTo: '' } ]; diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 3f7d083..a9f8e81 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -5,12 +5,116 @@ import { Component } from '@angular/core'; template: ` + ` }) export class AppComponent { title = 'visual-framework'; + config: any = { + type: "modal", + title: "AI Assistant", + welcome_logo: true, + welcome_message: "Welcome! I'm here to help", + welcome_logo_alt: "AI Assistant", + welcome_suggestions_title: "Try asking me:", + input_placeholder: "Ask me ...", + welcome_max_suggestions: 4, + disclaimer: + 'Disclaimer: This chatbot is designed to assist you with general information and basic inquiries. See our disclaimer notes.', + footnote: + 'Review AI generated content for accuracy. Leave feedback.', + icons: { + assistant_avatar: + "./assets/vf-chatbot/assets/vf-chatbot--icon-16x16-dark-green.svg", + user_avatar: + "./assets/vf-chatbot/assets/vf-chatbot--avatar-user.svg", + send_button: "./assets/vf-chatbot/assets/vf-chatbot--icon-send.svg", + main_logo_url: + "./assets/vf-chatbot/assets/vf-chatbot--icon-32x32-dark-green.svg", + minimize: + "./assets/vf-chatbot/assets/vf-chatbot--icon-minimize.svg", + close: "./assets/vf-chatbot/assets/vf-chatbot--icon-close.svg" + }, + api: { + chat_endpoint: false, //"/api/chat", // Disabled to use fallback responses + feedback_endpoint: false, //"/api/feedback", + qa_data_url: "../../assets/vf-chatbot/assets/vf-chatbot-qa.json", + headers: { + "Content-Type": "application/json", + Authorization: "Bearer your-token" + }, + timeout: 10000 + }, + + features: { + enable_welcome: true, + enable_feedback: true, + enable_sources: true, + enable_sources_custom_format: false, + enable_welcome_suggestions: true, + enable_typing_indicator: true, + enable_disclaimer: true, + enable_predefined_qa: true, + enable_fallback_responses: true, + enable_qa_data_loading: true, + enable_instant_feedback: false + }, + + behavior: { + auto_scroll: true, + typing_delay: 800, + show_scrollbar: false + }, + + selectorContext: { + chatbotRoutes: { + multiSelect: true, + maxMultiSelect: 3, + showSearch: true, + showSearchThreshold: 5, + showAllServices: true, + showAllServicesSelected: true, + routes: + "../../assets/vf-chatbot/assets/vf-chatbot-selector-services.json", + placeholder: "Select services", + title: "Services", + selector_logo_url: + "../../assets/vf-chatbot/assets/vf-chatbot--icon-24x24-dark-green.svg", + selector_logo_title: "AI Assistant" + } + }, + + handlers: { + on_message_send: "handleMessageSend", + on_response_receive: "handleResponseReceive", + on_feedback_submit: "handleFeedbackSubmit", + on_suggestion_click: "handleSuggestionClick", + on_error: "handleError", + on_conversation_start: "handleConversationStart", + on_conversation_end: "handleConversationEnd", + on_fab_click: "handleFabClick", + on_dialog_confirm: "handleDialogConfirm", + on_dialog_cancel: "handleDialogCancel", + on_minimize: "handleMinimize" + }, + + feedback_options: { + positive: [ + { id: "accurate", label: "Accurate" }, + { id: "easy", label: "Easy to understand" }, + { id: "formatted", label: "Well formatted" } + ], + negative: [ + { id: "inaccurate", label: "Inaccurate answer" }, + { id: "nocontext", label: "Did not use context" }, + { id: "poorformat", label: "Poorly formatted" } + ] + }, + enable_session_persistence: true, + restore_minimized_state: true // If true, restore minimized state after navigation + }; changeOfRoutes() { // Remove vf-mega-menu element when route changes const vfMegaMenuContent = document.querySelector('.vf-mega-menu__content'); diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 8f539e9..989e8e1 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,13 +1,13 @@ import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { FormsModule } from '@angular/forms'; - import { AppComponent } from './app.component'; import { HomeModule } from './components/home/home.module'; import { AppRoutingModule } from './app-routing.module'; import { AppHeaderModule } from './components/header/header.module'; import { AppFooterModule } from './components/footer/footer.module'; import { VfComponentsModule } from './components/vf-components.module'; +import { HttpClientModule } from '@angular/common/http'; import { SearchModule } from './components/search/search.module'; @NgModule({ declarations: [ @@ -21,7 +21,8 @@ import { SearchModule } from './components/search/search.module'; AppHeaderModule, AppFooterModule, VfComponentsModule, - SearchModule, + HttpClientModule, + SearchModule ], bootstrap: [AppComponent], schemas: [NO_ERRORS_SCHEMA] diff --git a/src/app/components/header/header.component.html b/src/app/components/header/header.component.html index d0cb967..30e4f0a 100644 --- a/src/app/components/header/header.component.html +++ b/src/app/components/header/header.component.html @@ -124,6 +124,9 @@

Container

  • Hero
  • +
  • + Chatbot +
  • diff --git a/src/app/components/vf-chatbot-action-prompt/.DS_Store b/src/app/components/vf-chatbot-action-prompt/.DS_Store new file mode 100644 index 0000000..d5a5f81 Binary files /dev/null and b/src/app/components/vf-chatbot-action-prompt/.DS_Store differ diff --git a/src/app/components/vf-chatbot-action-prompt/vf-chatbot-action-prompt.angular.component.spec.ts b/src/app/components/vf-chatbot-action-prompt/vf-chatbot-action-prompt.angular.component.spec.ts new file mode 100644 index 0000000..d246483 --- /dev/null +++ b/src/app/components/vf-chatbot-action-prompt/vf-chatbot-action-prompt.angular.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { VfChatbotActionPromptAngularComponent } from './vf-chatbot-action-prompt.angular.component'; + +describe('VfChatbotActionPromptAngularComponent', () => { + let component: VfChatbotActionPromptAngularComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [VfChatbotActionPromptAngularComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(VfChatbotActionPromptAngularComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/vf-chatbot-action-prompt/vf-chatbot-action-prompt.angular.component.ts b/src/app/components/vf-chatbot-action-prompt/vf-chatbot-action-prompt.angular.component.ts new file mode 100644 index 0000000..3adffc1 --- /dev/null +++ b/src/app/components/vf-chatbot-action-prompt/vf-chatbot-action-prompt.angular.component.ts @@ -0,0 +1,47 @@ +// vf-chatbot-action-prompt.angular + +import { Component, EventEmitter, Input, Output } from '@angular/core'; + +@Component({ + selector: 'vf-chatbot-action-prompt', + template: ` + + {{ actionText }} + + + + + + ` +}) +export class VfChatbotActionPromptAngularComponent { + /** Equivalent to action_url */ + @Input({ alias: 'action_url' }) actionUrl?: string; + + /** Equivalent to action_text */ + @Input({ alias: 'action_text' }) actionText!: string; + + /** Equivalent to action_target */ + @Input({ alias: 'action_target' }) actionTarget?: string; + + /** Emits when the link/button is clicked (maps to onClick) */ + @Output() actionClick = new EventEmitter(); + + onClick(ev: MouseEvent) { + this.actionClick.emit(ev); + } + + get isExternal(): boolean { + return this.actionTarget === '_blank'; + } +} diff --git a/src/app/components/vf-chatbot-action-prompt/vf-chatbot-action-prompt.angular.module.ts b/src/app/components/vf-chatbot-action-prompt/vf-chatbot-action-prompt.angular.module.ts new file mode 100644 index 0000000..899ced9 --- /dev/null +++ b/src/app/components/vf-chatbot-action-prompt/vf-chatbot-action-prompt.angular.module.ts @@ -0,0 +1,18 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { VfChatbotActionPromptAngularComponent } from './vf-chatbot-action-prompt.angular.component'; + + + +@NgModule({ + declarations: [ + VfChatbotActionPromptAngularComponent + ], + imports: [ + CommonModule, + ], + exports: [ + VfChatbotActionPromptAngularComponent + ] +}) +export class VfChatbotActionPromptAngularModule { } diff --git a/src/app/components/vf-chatbot-dialog/.DS_Store b/src/app/components/vf-chatbot-dialog/.DS_Store new file mode 100644 index 0000000..c82aec0 Binary files /dev/null and b/src/app/components/vf-chatbot-dialog/.DS_Store differ diff --git a/src/app/components/vf-chatbot-dialog/vf-chatbot-dialog.angular.component.spec.ts b/src/app/components/vf-chatbot-dialog/vf-chatbot-dialog.angular.component.spec.ts new file mode 100644 index 0000000..61168b5 --- /dev/null +++ b/src/app/components/vf-chatbot-dialog/vf-chatbot-dialog.angular.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { VfChatbotDialogAngularComponent } from './vf-chatbot-dialog.angular.component'; + +describe('VfChatbotDialogAngularComponent', () => { + let component: VfChatbotDialogAngularComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [VfChatbotDialogAngularComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(VfChatbotDialogAngularComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/vf-chatbot-dialog/vf-chatbot-dialog.angular.component.ts b/src/app/components/vf-chatbot-dialog/vf-chatbot-dialog.angular.component.ts new file mode 100644 index 0000000..30e1612 --- /dev/null +++ b/src/app/components/vf-chatbot-dialog/vf-chatbot-dialog.angular.component.ts @@ -0,0 +1,78 @@ +import { + Component, + ElementRef, + EventEmitter, + Output, + Input, + AfterViewInit +} from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'vf-chatbot-dialog', + template: ` +
    +
    +
    +

    {{ title }}

    + + +
    + +
    +

    +
    + +
    + + + +
    +
    +
    + ` +}) +export class VfChatbotDialogAngularComponent implements AfterViewInit { + @Input() title = 'Close chat and delete conversation?'; + @Input() message = 'Are you sure you want to close the chat?
    Your current conversation history will be permanently deleted.'; + @Input() cancelLabel = 'Keep chat open'; + @Input() confirmLabel = 'Close and delete'; + + + constructor(private elRef: ElementRef) {} + + ngAfterViewInit(): void { + const el = this.elRef.nativeElement as HTMLElement; + } + +} + +export * from './vf-chatbot-dialog.angular.module'; diff --git a/src/app/components/vf-chatbot-dialog/vf-chatbot-dialog.angular.module.ts b/src/app/components/vf-chatbot-dialog/vf-chatbot-dialog.angular.module.ts new file mode 100644 index 0000000..eac27c4 --- /dev/null +++ b/src/app/components/vf-chatbot-dialog/vf-chatbot-dialog.angular.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { VfChatbotDialogAngularComponent } from './vf-chatbot-dialog.angular.component'; + +@NgModule({ + declarations: [ + VfChatbotDialogAngularComponent + ], + imports: [ + CommonModule, + FormsModule + ], + exports: [ + VfChatbotDialogAngularComponent + ] +}) +export class VfChatbotDialogAngularModule { } diff --git a/src/app/components/vf-chatbot-fab/.DS_Store b/src/app/components/vf-chatbot-fab/.DS_Store new file mode 100644 index 0000000..bf882ef Binary files /dev/null and b/src/app/components/vf-chatbot-fab/.DS_Store differ diff --git a/src/app/components/vf-chatbot-fab/vf-chatbot-fab.angular.component.spec.ts b/src/app/components/vf-chatbot-fab/vf-chatbot-fab.angular.component.spec.ts new file mode 100644 index 0000000..283d7f4 --- /dev/null +++ b/src/app/components/vf-chatbot-fab/vf-chatbot-fab.angular.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { VfChatbotFabAngularComponent } from './vf-chatbot-fab.angular.component'; + +describe('VfChatbotFabAngularComponent', () => { + let component: VfChatbotFabAngularComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [VfChatbotFabAngularComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(VfChatbotFabAngularComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/vf-chatbot-fab/vf-chatbot-fab.angular.component.ts b/src/app/components/vf-chatbot-fab/vf-chatbot-fab.angular.component.ts new file mode 100644 index 0000000..f5603a2 --- /dev/null +++ b/src/app/components/vf-chatbot-fab/vf-chatbot-fab.angular.component.ts @@ -0,0 +1,69 @@ +import { + Component, + Input, + ElementRef, + AfterViewInit, +} from '@angular/core'; + + +@Component({ + selector: 'vf-chatbot-fab', + template: ` + + `, +}) +export class VfChatbotFabAngularComponent implements AfterViewInit { + @Input() notificationCount = 0; + @Input() isInactive = false; + + constructor(private elementRef: ElementRef) {} + + ngAfterViewInit(): void { + } +} + +export * from './vf-chatbot-fab.angular.module'; diff --git a/src/app/components/vf-chatbot-fab/vf-chatbot-fab.angular.module.ts b/src/app/components/vf-chatbot-fab/vf-chatbot-fab.angular.module.ts new file mode 100644 index 0000000..458369d --- /dev/null +++ b/src/app/components/vf-chatbot-fab/vf-chatbot-fab.angular.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { VfChatbotFabAngularComponent } from './vf-chatbot-fab.angular.component'; + +@NgModule({ + declarations: [ + VfChatbotFabAngularComponent + ], + imports: [ + CommonModule, + FormsModule + ], + exports: [ + VfChatbotFabAngularComponent + ] +}) +export class VfChatbotFabAngularModule { } diff --git a/src/app/components/vf-chatbot-fab/vf-chatbot-fab.js b/src/app/components/vf-chatbot-fab/vf-chatbot-fab.js new file mode 100644 index 0000000..f1236e0 --- /dev/null +++ b/src/app/components/vf-chatbot-fab/vf-chatbot-fab.js @@ -0,0 +1,49 @@ +// vf-chatbot-fab + +function VFChatbotFab(element) { + this.el = element; + this.chatIcon = this.el.querySelector(".vf-chatbot-fab__icon--chat"); + + this.init(); +} + +VFChatbotFab.prototype = { + init: function() { + this.addEventListeners(); + }, + + addEventListeners: function() { + this.el.addEventListener("click", () => { + this.toggleState(); + }); + }, + + toggleState: function() { + this.el.classList.toggle("vf-chatbot-fab--inactive"); + + // Dispatch event for parent chatbot component + this.el.dispatchEvent( + new CustomEvent("vf-chatbot-fab:toggle", { + bubbles: true, + detail: { + isActive: this.el.classList.contains("vf-chatbot-fab--inactive") + } + }) + ); + } +}; + +function initVFChatbotFab() { + const elements = document.querySelectorAll("[data-vf-js-chatbot-fab]"); + for (let i = 0; i < elements.length; i++) { + new VFChatbotFab(elements[i]); + } +} + +// Global exposure +if (typeof window !== "undefined") { + window.VFChatbotFab = VFChatbotFab; + window.initVFChatbotFab = initVFChatbotFab; +} + +export { VFChatbotFab, initVFChatbotFab }; diff --git a/src/app/components/vf-chatbot-feedback/.DS_Store b/src/app/components/vf-chatbot-feedback/.DS_Store new file mode 100644 index 0000000..e8015f5 Binary files /dev/null and b/src/app/components/vf-chatbot-feedback/.DS_Store differ diff --git a/src/app/components/vf-chatbot-feedback/vf-chatbot-feedback.angular.component.spec.ts b/src/app/components/vf-chatbot-feedback/vf-chatbot-feedback.angular.component.spec.ts new file mode 100644 index 0000000..5de9177 --- /dev/null +++ b/src/app/components/vf-chatbot-feedback/vf-chatbot-feedback.angular.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { VfChatbotFeedbackAngularComponent } from './vf-chatbot-feedback.angular.component'; + +describe('VfChatbotFeedbackAngularComponent', () => { + let component: VfChatbotFeedbackAngularComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [VfChatbotFeedbackAngularComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(VfChatbotFeedbackAngularComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/vf-chatbot-feedback/vf-chatbot-feedback.angular.component.ts b/src/app/components/vf-chatbot-feedback/vf-chatbot-feedback.angular.component.ts new file mode 100644 index 0000000..8efbaed --- /dev/null +++ b/src/app/components/vf-chatbot-feedback/vf-chatbot-feedback.angular.component.ts @@ -0,0 +1,105 @@ +import { Component, ElementRef, EventEmitter, Input, Output, AfterViewInit } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +interface FeedbackOption { + id: string; + label: string; +} + +@Component({ + selector: 'vf-chatbot-feedback', + template: ` +
    +
    + +
    +
    + Tell us more (optional) +
    + +
    + + +
    + +
    + + + + + + + +
    +
    + `, +}) +export class VfChatbotFeedbackAngularComponent implements AfterViewInit { + @Input() feedback_options: FeedbackOption[] = []; + @Input() type: string = ''; + @Input() comment: string = ''; + + @Output() feedback = new EventEmitter<{ type: string; id: string }>(); + @Output() commentChange = new EventEmitter(); + @Output() close = new EventEmitter(); + @Output() submit = new EventEmitter(); + + constructor(private el: ElementRef) {} + + ngAfterViewInit(): void { + } + + onFeedbackClick(optionId: string) { + this.feedback.emit({ type: this.type, id: optionId }); + } + + onCloseClick() { + this.close.emit(); + } + + onSubmitClick() { + this.submit.emit(); + } +} + +export * from './vf-chatbot-feedback.angular.module'; diff --git a/src/app/components/vf-chatbot-feedback/vf-chatbot-feedback.angular.module.ts b/src/app/components/vf-chatbot-feedback/vf-chatbot-feedback.angular.module.ts new file mode 100644 index 0000000..25e1f8f --- /dev/null +++ b/src/app/components/vf-chatbot-feedback/vf-chatbot-feedback.angular.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { VfChatbotFeedbackAngularComponent } from './vf-chatbot-feedback.angular.component'; + +@NgModule({ + declarations: [ + VfChatbotFeedbackAngularComponent + ], + imports: [ + CommonModule, + FormsModule + ], + exports: [ + VfChatbotFeedbackAngularComponent + ] +}) +export class VfChatbotFeedbackAngularModule { } diff --git a/src/app/components/vf-chatbot-feedback/vf-chatbot-feedback.js b/src/app/components/vf-chatbot-feedback/vf-chatbot-feedback.js new file mode 100644 index 0000000..6c08106 --- /dev/null +++ b/src/app/components/vf-chatbot-feedback/vf-chatbot-feedback.js @@ -0,0 +1,301 @@ +export class VFChatbotFeedback { + constructor(container, messageId, config = {}) { + this.container = container; + this.messageId = messageId; + this.config = { + enable_instant_feedback: false, + api_endpoint: null, + ...config + }; + this.positiveTemplate = document.querySelector( + "#feedback-positive-template" + ); + this.negativeTemplate = document.querySelector( + "#feedback-negative-template" + ); + this.positiveOptions = config.positiveOptions || [ + { id: "accurate", label: "Accurate answer" }, + { id: "easy", label: "Easy to understand" }, + { id: "formatted", label: "Well formatted" }, + { id: "helpful", label: "Helpful" } + ]; + this.negativeOptions = config.negativeOptions || [ + { id: "inaccurate", label: "Inaccurate answer" }, + { id: "nocontext", label: "Did not use context" }, + { id: "poorformat", label: "Poorly formatted" }, + { id: "nothelpful", label: "Not helpful" } + ]; + this.renderInitialState(); + this.selectedThumb = ""; + } + + renderInitialState() { + this.container.innerHTML = ` +
    + + +
    +
    + `; + this.bindThumbEvents(); + } + + bindThumbEvents() { + const upThumb = this.container.querySelector( + "[data-vf-js-feedback-thumb='up']" + ); + const downThumb = this.container.querySelector( + "[data-vf-js-feedback-thumb='down']" + ); + const formContainer = this.container.querySelector( + ".vf-chatbot-feedback__form-container" + ); + + upThumb?.addEventListener("click", () => { + upThumb.classList.add("vf-chatbot-feedback__thumb--solid"); + downThumb.classList.remove("vf-chatbot-feedback__thumb--solid"); + + if (this.config.enable_instant_feedback) { + // Submit feedback immediately without showing form + this.submitInstantFeedback("positive"); + this.showSuccessBanner(); + } else { + // Traditional flow - show feedback form + this.showForm("positive", formContainer); + } + }); + + downThumb?.addEventListener("click", () => { + downThumb.classList.add("vf-chatbot-feedback__thumb--solid"); + upThumb.classList.remove("vf-chatbot-feedback__thumb--solid"); + + if (this.config.enable_instant_feedback) { + // Submit feedback immediately without showing form + this.submitInstantFeedback("negative"); + this.showSuccessBanner(); + } else { + // Traditional flow - show feedback form + this.showForm("negative", formContainer); + } + }); + } + + submitInstantFeedback(feedbackType) { + const feedbackData = { + messageId: this.messageId, + feedbackType: feedbackType, + feedbackText: "", // Empty for instant feedback + feedbackComment: "", // Empty for instant feedback + timestamp: Date.now() + }; + + // Emit event for parent component to handle + this.emitFeedbackEvent(feedbackData); + + // Send to API if configured + if (this.config.api_endpoint) { + this.sendFeedbackToAPI(feedbackData); + } + + console.log("Instant feedback submitted:", feedbackData); + } + + showSuccessBanner() { + const formContainer = this.container.querySelector( + ".vf-chatbot-feedback__form-container" + ); + + // Show thank you message using vf-banner (dismissible) + formContainer.innerHTML = ` +
    +
    +

    Thank you for your feedback!

    + +
    +
    + `; + + // Hide the unselected thumb and disable the selected one + const upThumb = this.container.querySelector( + "[data-vf-js-feedback-thumb='up']" + ); + const downThumb = this.container.querySelector( + "[data-vf-js-feedback-thumb='down']" + ); + if (upThumb.classList.contains("vf-chatbot-feedback__thumb--solid")) { + downThumb.style.display = "none"; + upThumb.disabled = true; // Disable the clicked thumb + } else if ( + downThumb.classList.contains("vf-chatbot-feedback__thumb--solid") + ) { + upThumb.style.display = "none"; + downThumb.disabled = true; // Disable the clicked thumb + } + + // Add dismiss functionality + const banner = formContainer.querySelector("[data-vf-js-banner]"); + const closeBtn = formContainer.querySelector(".vf-button--dismiss"); + if (banner && closeBtn) { + closeBtn.addEventListener("click", () => { + banner.remove(); + }); + } + } + + emitFeedbackEvent(feedbackData) { + const event = new CustomEvent("vf-chatbot-feedback:submit", { + bubbles: true, + detail: feedbackData + }); + this.container.dispatchEvent(event); + } + + async sendFeedbackToAPI(feedbackData) { + try { + const response = await fetch(this.config.api_endpoint, { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify(feedbackData) + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + } catch (error) { + console.error("Failed to send feedback to API:", error); + } + } + + showForm(type, formContainer) { + if (!formContainer) { + formContainer = this.container.querySelector( + ".vf-chatbot-feedback__form-container" + ); + } + formContainer.innerHTML = ""; + const template = + type === "positive" ? this.positiveTemplate : this.negativeTemplate; + alert(type); + if (template) { + const formContent = template.content.cloneNode(true); + formContent.children[0].style.display = "block"; + formContainer.appendChild(formContent); + this.bindFormEvents(formContainer); + + // Bring the feedback form into view + formContainer.scrollIntoView({ behavior: "smooth", block: "center" }); + } + } + + bindFormEvents(formContainer) { + // Option button selection logic (if needed) + const optionButtons = formContainer.querySelectorAll( + ".vf-chatbot-feedback__option" + ); + optionButtons.forEach(btn => { + btn.addEventListener("click", () => { + optionButtons.forEach(b => + b.classList.remove("vf-chatbot-feedback__option--selected") + ); + btn.classList.add("vf-chatbot-feedback__option--selected"); + }); + }); + + // Submit button logic + const submitBtn = formContainer.querySelector( + "[data-vf-js-feedback-submit]" + ); + submitBtn?.addEventListener("click", () => + this.submitFeedback(formContainer) + ); + + // Close icon logic + const closeBtn = formContainer.querySelector( + "[data-vf-js-feedback-form-close]" + ); + if (closeBtn) { + closeBtn.addEventListener("click", () => { + // Remove the feedback form + formContainer.innerHTML = ""; + + // Remove solid class from both thumbs + const upThumb = this.container.querySelector( + "[data-vf-js-feedback-thumb='up']" + ); + const downThumb = this.container.querySelector( + "[data-vf-js-feedback-thumb='down']" + ); + upThumb?.classList.remove("vf-chatbot-feedback__thumb--solid"); + downThumb?.classList.remove("vf-chatbot-feedback__thumb--solid"); + }); + } + } + + submitFeedback(formContainer) { + // Collect form data for traditional feedback + const selectedOptions = formContainer.querySelectorAll( + ".vf-chatbot-feedback__option--selected" + ); + const feedbackText = Array.from(selectedOptions) + .map(option => option.textContent.trim()) + .join(", "); + + const feedbackType = this.container + .querySelector("[data-vf-js-feedback-thumb='up']") + ?.classList.contains("vf-chatbot-feedback__thumb--solid") + ? "positive" + : "negative"; + + const feedbackComment = + formContainer.querySelector(".vf-chatbot-feedback__comment").value || ""; + + const feedbackData = { + messageId: this.messageId, + feedbackType: feedbackType, + feedbackText: feedbackText, + feedbackComment: feedbackComment, + timestamp: Date.now() + }; + + // Emit event for parent component to handle + this.emitFeedbackEvent(feedbackData); + + // Send to API if configured + if (this.config.api_endpoint) { + this.sendFeedbackToAPI(feedbackData); + } + + // Show success banner (reuse existing logic) + this.showSuccessBanner(); + } +} + +// Add this function at the end of the file: +export function initVFChatbotFeedback( + container, + messageId = null, + config = {} +) { + if (!container) return; + // Prevent double-initialization + if (container.__vfChatbotFeedbackInstance) + return container.__vfChatbotFeedbackInstance; + const instance = new VFChatbotFeedback(container, messageId, config); + container.__vfChatbotFeedbackInstance = instance; + return instance; +} diff --git a/src/app/components/vf-chatbot-modal/.DS_Store b/src/app/components/vf-chatbot-modal/.DS_Store new file mode 100644 index 0000000..7953baa Binary files /dev/null and b/src/app/components/vf-chatbot-modal/.DS_Store differ diff --git a/src/app/components/vf-chatbot-modal/vf-chatbot-modal.angular.component.spec.ts b/src/app/components/vf-chatbot-modal/vf-chatbot-modal.angular.component.spec.ts new file mode 100644 index 0000000..b0b63b8 --- /dev/null +++ b/src/app/components/vf-chatbot-modal/vf-chatbot-modal.angular.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { VfChatbotModalAngularComponent } from './vf-chatbot-modal.angular.component'; + +describe('VfChatbotModalAngularComponent', () => { + let component: VfChatbotModalAngularComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [VfChatbotModalAngularComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(VfChatbotModalAngularComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/vf-chatbot-modal/vf-chatbot-modal.angular.component.ts b/src/app/components/vf-chatbot-modal/vf-chatbot-modal.angular.component.ts new file mode 100644 index 0000000..8399a1a --- /dev/null +++ b/src/app/components/vf-chatbot-modal/vf-chatbot-modal.angular.component.ts @@ -0,0 +1,236 @@ +import { CommonModule } from '@angular/common'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { VfChatbotDialogAngularModule } from '../vf-chatbot-dialog/vf-chatbot-dialog.angular.module'; +import { VfChatbotPromptAngularModule } from '../vf-chatbot-prompt/vf-chatbot-prompt.angular.module'; +import { VfChatbotSelectorAngularModule } from '../vf-chatbot-selector/vf-chatbot-selector.angular.module'; +import { VfChatbotWelcomeAngularModule } from '../vf-chatbot-welcome.angular/vf-chatbot-welcome.angular.module'; + +export interface VfChatbotModalConfig { + type?: 'modal' | 'standalone'; + title?: string; + welcome_logo?: boolean; + welcome_message?: string; + welcome_logo_alt?: string; + welcome_suggestions_title?: string; + input_placeholder?: string; + welcome_max_suggestions?: number; + disclaimer?: string; + footnote?: string; + icons?: { + assistant_avatar?: string; + user_avatar?: string; + send_button?: string; + minimize?: string; + close?: string; + main_logo_url?: string; + }; + selectorContext?: unknown; + features?: { + enable_welcome?: boolean; + enable_welcome_suggestions?: boolean; + enable_qa_data_loading?: boolean; + enable_predefined_qa?: boolean; + enable_fallback_responses?: boolean; + enable_feedback?: boolean; + enable_disclaimer?: boolean; + enable_typing_indicator?: boolean; + }; + behavior?: { + show_scrollbar?: boolean; + auto_scroll?: boolean; + }; + api?: { + qa_data_url?: string; + }; + onDismissDisclaimer?: () => void; +} + +@Component({ + selector: 'vf-chatbot-modal', + standalone: true, + imports: [ + CommonModule, + VfChatbotDialogAngularModule, + VfChatbotPromptAngularModule, + VfChatbotSelectorAngularModule, + VfChatbotWelcomeAngularModule + ], + template: ` + +` +}) +export class VfChatbotModalAngularComponent { + @Input() config: VfChatbotModalConfig = { type: 'modal' }; + @Input() messages: unknown[] = []; + @Input() sources: unknown[] = []; + @Input() prompts: unknown[] = []; + @Input() qaData: unknown[] = []; + @Input() isOpen = false; + + dialogTitle = 'Close chat and delete conversation?'; + dialogMessage = 'Are you sure you want to close the chat?
    Your current conversation history will be permanently deleted.'; + dialogCancelLabel = 'Keep chat open'; + dialogConfirmLabel = 'Close and delete'; + + @Output() close = new EventEmitter(); + @Output() minimize = new EventEmitter(); + + get configJson(): string { + return JSON.stringify(this.config || {}); + } +} + +export * from './vf-chatbot-modal.angular.module'; diff --git a/src/app/components/vf-chatbot-modal/vf-chatbot-modal.angular.module.ts b/src/app/components/vf-chatbot-modal/vf-chatbot-modal.angular.module.ts new file mode 100644 index 0000000..01e0d2c --- /dev/null +++ b/src/app/components/vf-chatbot-modal/vf-chatbot-modal.angular.module.ts @@ -0,0 +1,28 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { VfChatbotModalAngularComponent } from './vf-chatbot-modal.angular.component'; +import { VfChatbotActionPromptAngularModule } from '../vf-chatbot-action-prompt/vf-chatbot-action-prompt.angular.module'; +import { VfChatbotSelectorAngularModule } from '../vf-chatbot-selector/vf-chatbot-selector.angular.module'; +import { VfChatbotWelcomeAngularModule } from '../vf-chatbot-welcome.angular/vf-chatbot-welcome.angular.module'; +import { VfChatbotPromptAngularModule } from '../vf-chatbot-prompt/vf-chatbot-prompt.angular.module'; +import { VfChatbotFeedbackAngularModule } from '../vf-chatbot-feedback/vf-chatbot-feedback.angular.module'; +import { VfChatbotDialogAngularModule } from '../vf-chatbot-dialog/vf-chatbot-dialog.angular.module'; + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + VfChatbotModalAngularComponent, + VfChatbotActionPromptAngularModule, + VfChatbotSelectorAngularModule, + VfChatbotWelcomeAngularModule, + VfChatbotPromptAngularModule, + VfChatbotFeedbackAngularModule, + VfChatbotDialogAngularModule + ], + exports: [ + VfChatbotModalAngularComponent + ] +}) +export class VfChatbotModalAngularModule { } diff --git a/src/app/components/vf-chatbot-prompt/.DS_Store b/src/app/components/vf-chatbot-prompt/.DS_Store new file mode 100644 index 0000000..46e5ec1 Binary files /dev/null and b/src/app/components/vf-chatbot-prompt/.DS_Store differ diff --git a/src/app/components/vf-chatbot-prompt/vf-chatbot-prompt.angular.component.spec.ts b/src/app/components/vf-chatbot-prompt/vf-chatbot-prompt.angular.component.spec.ts new file mode 100644 index 0000000..1428561 --- /dev/null +++ b/src/app/components/vf-chatbot-prompt/vf-chatbot-prompt.angular.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { VfChatbotPromptAngularComponent } from './vf-chatbot-prompt.angular.component'; + +describe('VfChatbotPromptAngularComponent', () => { + let component: VfChatbotPromptAngularComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [VfChatbotPromptAngularComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(VfChatbotPromptAngularComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/vf-chatbot-prompt/vf-chatbot-prompt.angular.component.ts b/src/app/components/vf-chatbot-prompt/vf-chatbot-prompt.angular.component.ts new file mode 100644 index 0000000..9c4b02a --- /dev/null +++ b/src/app/components/vf-chatbot-prompt/vf-chatbot-prompt.angular.component.ts @@ -0,0 +1,83 @@ +import { Component, Input } from '@angular/core'; +import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; + +@Component({ + selector: 'vf-chatbot-prompt', + template: ` +
    + + +
    + + + + {{ avatar?.name }} + + + + + + + + {{ avatar?.name }} + +
    + + +
    + + +
    + + + +
    + + +
    +
    +
    + +
    + + ` +}) +export class VfChatbotPromptAngularComponent { + + @Input() type: string = ''; + @Input() isLoading: boolean = false; + @Input() avatar: any = {}; + @Input() content: string = ''; + @Input() sources: any = ''; + @Input() prompts: any = ''; + @Input() allowFeedback: boolean = true; + + + shouldShowAvatarName(position: string): boolean { + return this.avatar?.name && this.type === position; + } + + hasAvatarImage(): boolean { + return !!this.avatar?.src; + } + + messageClasses(): string { + + let classes = `vf-chatbot-message vf-chatbot-message--${this.type} vf-u-margin__top--400`; + if (this.isLoading) { + classes += ' vf-chatbot-message--loading'; + } + return classes; + } +} + +export * from './vf-chatbot-prompt.angular.module'; diff --git a/src/app/components/vf-chatbot-prompt/vf-chatbot-prompt.angular.module.ts b/src/app/components/vf-chatbot-prompt/vf-chatbot-prompt.angular.module.ts new file mode 100644 index 0000000..f67fafb --- /dev/null +++ b/src/app/components/vf-chatbot-prompt/vf-chatbot-prompt.angular.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { VfChatbotPromptAngularComponent } from './vf-chatbot-prompt.angular.component'; + +@NgModule({ + declarations: [ + VfChatbotPromptAngularComponent + ], + imports: [ + CommonModule, + FormsModule + ], + exports: [ + VfChatbotPromptAngularComponent + ] +}) +export class VfChatbotPromptAngularModule { } diff --git a/src/app/components/vf-chatbot-selector/.DS_Store b/src/app/components/vf-chatbot-selector/.DS_Store new file mode 100644 index 0000000..005bd29 Binary files /dev/null and b/src/app/components/vf-chatbot-selector/.DS_Store differ diff --git a/src/app/components/vf-chatbot-selector/vf-chatbot-selector.angular.component.spec.ts b/src/app/components/vf-chatbot-selector/vf-chatbot-selector.angular.component.spec.ts new file mode 100644 index 0000000..5b5a04e --- /dev/null +++ b/src/app/components/vf-chatbot-selector/vf-chatbot-selector.angular.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { VfChatbotSelectorAngularComponent } from './vf-chatbot-selector.angular.component'; + +describe('VfChatbotSelectorAngularComponent', () => { + let component: VfChatbotSelectorAngularComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [VfChatbotSelectorAngularComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(VfChatbotSelectorAngularComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/vf-chatbot-selector/vf-chatbot-selector.angular.component.ts b/src/app/components/vf-chatbot-selector/vf-chatbot-selector.angular.component.ts new file mode 100644 index 0000000..a6eb8ad --- /dev/null +++ b/src/app/components/vf-chatbot-selector/vf-chatbot-selector.angular.component.ts @@ -0,0 +1,176 @@ +import { Component, ElementRef, Input, OnInit } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; + +interface Config { + routes: any[]; + [key: string]: any; +} + +@Component({ + selector: 'vf-chatbot-selector', + template: ` +
    + + +
    + + +
    + + Select up to {{context.chatbotRoutes.maxMultiSelect.toString()}} services + + + Clear all + +
    + +
      +
    • + {{ route.title }} +
    • +
    +
    +
    + `, + styles: [], +}) +export class VfChatbotSelectorAngularComponent implements OnInit { + @Input() chatbotRoutes: any = {}; + @Input() context: any = {}; + config: any = {}; + search = ''; + selected: string[] = []; + showSearchBox = true; + maxSelect = 1; + + constructor(private elRef: ElementRef, private http: HttpClient) {} + + ngOnInit(): void { + const defaults = { + routes: [], + multiSelect: false, + maxMultiSelect: 1, + showSearch: true, + showSearchThreshold: 5, + showAllServices: false, + showAllServicesSelected: false, + selector_logo_url: '../../assets/vf-chatbot/assets/vf-chatbot--icon-24x24-dark-green.svg', + selector_logo_title: 'AI Assistant', + title: 'Select option', + placeholder: 'Search...', + }; + + // Prefer any explicit `context` input; otherwise fall back to `chatbotRoutes`. + const source = (this.context && Object.keys(this.context).length > 0) + ? this.context + : (this.chatbotRoutes || {}); + + // Merge defaults into the chosen source so template bindings exist and are objects + this.context = { ...defaults, ...source }; + this.config = this.context; // keep `config` for backwards compatibility + + this.maxSelect = this.config.maxMultiSelect || 3; + this.showSearchBox = + this.context.chatbotRoutes.showSearch && + (this.context.chatbotRoutes.routes || []).length > this.context.chatbotRoutes.showSearchThreshold; + this.loadRoutesFromApi(); + } + + clearAll(event: Event): void { + event.preventDefault(); + this.selected = []; + } + + toggleSelect(routeId: string): void { + if (this.context.chatbotRoutes.multiSelect) { + if (this.selected.includes(routeId)) { + this.selected = this.selected.filter(id => id !== routeId); + } else if (this.selected.length < this.maxSelect) { + this.selected.push(routeId); + } + } else { + this.selected = [routeId]; + } + } + loadRoutesFromApi(): void { + const url = this.context.chatbotRoutes.routes; + this.http.get(url).subscribe(config => { + this.context.chatbotRoutes.array_routes = config['routes']; +}); + + +} +} + +export * from './vf-chatbot-selector.angular.module'; diff --git a/src/app/components/vf-chatbot-selector/vf-chatbot-selector.angular.module.ts b/src/app/components/vf-chatbot-selector/vf-chatbot-selector.angular.module.ts new file mode 100644 index 0000000..297641e --- /dev/null +++ b/src/app/components/vf-chatbot-selector/vf-chatbot-selector.angular.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { VfChatbotSelectorAngularComponent } from './vf-chatbot-selector.angular.component'; + +@NgModule({ + declarations: [ + VfChatbotSelectorAngularComponent + ], + imports: [ + CommonModule, + FormsModule + ], + exports: [ + VfChatbotSelectorAngularComponent + ] +}) +export class VfChatbotSelectorAngularModule { } diff --git a/src/app/components/vf-chatbot-selector/vf-chatbot-selector.js b/src/app/components/vf-chatbot-selector/vf-chatbot-selector.js new file mode 100644 index 0000000..ed0a169 --- /dev/null +++ b/src/app/components/vf-chatbot-selector/vf-chatbot-selector.js @@ -0,0 +1,580 @@ +export class VFChatbotSelector { + constructor(element) { + if (!element) { + console.error("Selector element is required"); + return; + } + + this.el = element; + this.isMultiselect = this.el.getAttribute("data-multiselect") === "true"; + this.maxMultiSelect = parseInt( + this.el.getAttribute("data-max-multiselect") || "3", + 10 + ); + this.selectedItems = new Set(); + // this.allServicesSelected = true; // Track "All services" state + + this.showAllServices = + this.el.getAttribute("data-show-all-services") === "true"; + this.showAllServicesSelected = + this.el.getAttribute("data-show-all-services-selected") === "true"; + + this.init(); + this.loadRoutes(); + } + + async loadRoutes() { + try { + const routesPath = this.el.getAttribute("data-routes-path"); + if (!routesPath) return; + + const response = await fetch(routesPath); + const data = await response.json(); + + // Update routes and refresh UI + this.routes = data.routes; + this.updateRoutesList(); + } catch (error) { + console.error("Failed to load routes:", error); + } + } + + init() { + // Ensure element exists before querying + if (!this.el) return; + + // Get DOM elements + this.titleEl = this.el.querySelector("[data-vf-js-selector-toggle]"); + this.dropdownEl = this.el.querySelector("[data-vf-js-selector-dropdown]"); + this.searchEl = this.el.querySelector("[data-vf-js-selector-search]"); + this.clearEl = this.el.querySelector("[data-vf-js-selector-clear]"); + this.listItems = this.el.querySelectorAll("[data-vf-js-selector-item]"); + this.allServicesItem = this.el.querySelector("[data-route-id='all']"); + + // Initialize dropdown as closed + if (this.dropdownEl) { + this.dropdownEl.style.display = "none"; + } + + // Bind events + this.bindEvents(); + + // Check if any items are pre-selected (not including "All services") + let hasPreSelectedItems = false; + this.listItems.forEach(item => { + const itemId = item.getAttribute("data-route-id"); + if (item.classList.contains("vf-chatbot-selector__item--selected")) { + if (itemId !== "all") { + // Only count non-"All services" items as pre-selected + this.selectedItems.add(itemId); + hasPreSelectedItems = true; + } + } + }); + + // If no items are pre-selected, default to "All services" + if (!hasPreSelectedItems && this.showAllServices) { + this.selectAllServices(); + } else if (!hasPreSelectedItems && !this.showAllServices) { + // If no "All services" option and no pre-selection, select first item for single-select + if (!this.isMultiselect && this.listItems.length > 0) { + const firstItem = this.listItems[0]; + const firstItemId = firstItem.getAttribute("data-route-id"); + this.selectedItems.add(firstItemId); + firstItem.classList.add("vf-chatbot-selector__item--selected"); + } + } else if (hasPreSelectedItems) { + // If items are pre-selected, ensure "All services" is not selected + this.allServicesSelected = false; + if (this.allServicesItem) { + this.allServicesItem.classList.remove( + "vf-chatbot-selector__item--selected" + ); + } + } + + // Update display after initial selection + this.updateSelectionDisplay(); + this.updateClearButton(); + } + + updateRoutesList() { + const listEl = this.el.querySelector("[data-vf-js-chatbot-selector-list]"); + if (!listEl || !this.routes) return; + + // Clear existing list + listEl.innerHTML = ""; + + // Check if any routes have pre-selected state + const hasPreSelectedRoutes = this.routes.some(route => route.selected); + + // Add "All services" option if enabled + if (this.showAllServices) { + const allServicesItem = document.createElement("li"); + allServicesItem.className = "vf-chatbot-selector__item"; + allServicesItem.setAttribute("data-vf-js-selector-item", ""); + allServicesItem.setAttribute("data-route-id", "all"); + allServicesItem.setAttribute("data-title", "All services"); + allServicesItem.setAttribute("role", "button"); + allServicesItem.setAttribute("tabindex", "0"); + allServicesItem.setAttribute("aria-label", "Select all services"); + + if (!hasPreSelectedRoutes && this.showAllServicesSelected) { + allServicesItem.className += " vf-chatbot-selector__item--selected"; + allServicesItem.setAttribute("data-selected", "true"); + } + + allServicesItem.innerHTML = `
    +
    All services
    +
    This would select all services
    +
    + + + + + `; + listEl.appendChild(allServicesItem); + } + + // Add route items + this.routes.forEach(route => { + const item = document.createElement("li"); + item.className = "vf-chatbot-selector__item"; + + if (route.selected) { + item.className += " vf-chatbot-selector__item--selected"; + } + + item.setAttribute("data-vf-js-selector-item", ""); + item.setAttribute("data-route-id", route.id); + item.setAttribute("data-title", route.title); + item.setAttribute("role", "button"); + item.setAttribute("tabindex", "0"); + item.setAttribute("aria-label", `Select ${route.title}`); + + item.innerHTML = ` +
    +
    ${route.title}
    + ${ + route.description + ? `
    ${route.description}
    ` + : "" +} +
    + + + + + `; + + listEl.appendChild(item); + }); + + // Update references and re-bind events ONCE + this.listItems = this.el.querySelectorAll("[data-vf-js-selector-item]"); + this.allServicesItem = this.el.querySelector("[data-route-id='all']"); + + // Only bind list item events (don't call full bindEvents or init) + this.bindListItemEvents(); + + // Handle initial selections for loaded routes + this.handleInitialSelections(); + + // Dispatch event to signal routes are loaded and UI is ready + this.el.dispatchEvent(new CustomEvent("routesloaded")); + } + + // New method to bind only list item events + bindListItemEvents() { + this.listItems.forEach(item => { + // Remove any existing listeners first + item.removeEventListener("click", this.itemClickHandler); + item.removeEventListener("keydown", this.itemKeydownHandler); + + // Create bound handlers + this.itemClickHandler = e => { + e.stopPropagation(); + this.handleItemSelection(item); + }; + + this.itemKeydownHandler = e => { + if (e.key === "Enter" || e.key === " ") { + e.preventDefault(); + e.stopPropagation(); + this.handleItemSelection(item); + } + }; + + // Add new listeners + item.addEventListener("click", this.itemClickHandler); + item.addEventListener("keydown", this.itemKeydownHandler); + }); + } + + // New method to handle initial selections without re-binding events + handleInitialSelections() { + // Don't reset the selectedItems Set here - it may already have pre-selected items + let hasPreSelectedItems = this.selectedItems.size > 0; // Check existing selectedItems first + + // Also check DOM for any additional pre-selected items + this.listItems.forEach(item => { + const itemId = item.getAttribute("data-route-id"); + if (item.classList.contains("vf-chatbot-selector__item--selected")) { + if (itemId !== "all") { + this.selectedItems.add(itemId); + hasPreSelectedItems = true; + } + } + }); + + // Set default selections only if no items are pre-selected + if ( + !hasPreSelectedItems && + this.showAllServices && + this.showAllServicesSelected + ) { + this.selectAllServices(); + } else if (hasPreSelectedItems) { + // If items are pre-selected, ensure "All services" is not selected + this.allServicesSelected = false; + if (this.allServicesItem) { + this.allServicesItem.classList.remove( + "vf-chatbot-selector__item--selected" + ); + } + } + + // Update display + this.updateSelectionDisplay(); + this.updateClearButton(); + } + + // Update bindEvents to store handlers for cleanup + bindEvents() { + // Toggle dropdown + if (this.titleEl) { + this.titleEl.removeEventListener("click", this.toggleDropdownHandler); + this.toggleDropdownHandler = e => { + e.preventDefault(); + e.stopImmediatePropagation(); + this.toggleDropdown(); + }; + this.titleEl.addEventListener("click", this.toggleDropdownHandler); + } + + // Search functionality + if (this.searchEl) { + this.searchEl.removeEventListener("input", this.searchHandler); + this.searchHandler = e => { + e.stopPropagation(); + this.handleSearch(e.target.value); + }; + this.searchEl.addEventListener("input", this.searchHandler); + } + + // Clear all selections + if (this.clearEl) { + this.clearEl.removeEventListener("click", this.clearHandler); + this.clearHandler = e => { + e.preventDefault(); + e.stopPropagation(); + this.clearAllSelections(); + }; + this.clearEl.addEventListener("click", this.clearHandler); + } + + // Bind list items + this.bindListItemEvents(); + + // Document click handler (only add once) + if (!this.documentClickHandler) { + this.documentClickHandler = e => { + if (!this.el.contains(e.target)) { + this.closeDropdown(); + } + }; + document.addEventListener("click", this.documentClickHandler); + } + + // Dropdown click handler + if (this.dropdownEl) { + this.dropdownEl.removeEventListener("click", this.dropdownClickHandler); + this.dropdownClickHandler = e => e.stopPropagation(); + this.dropdownEl.addEventListener("click", this.dropdownClickHandler); + } + } + + toggleDropdown() { + const isExpanded = this.dropdownEl.style.display === "block"; + if (isExpanded) { + this.closeDropdown(); + } else { + this.openDropdown(); + } + } + + openDropdown() { + this.dropdownEl.style.display = "block"; + this.titleEl.classList.add("vf-chatbot-selector__title--expanded"); + } + + closeDropdown() { + if (this.dropdownEl) { + this.dropdownEl.style.display = "none"; + } + if (this.titleEl) { + this.titleEl.classList.remove("vf-chatbot-selector__title--expanded"); + } + } + + handleSearch(query) { + const searchQuery = query.toLowerCase(); + this.listItems.forEach(item => { + const title = item + .querySelector(".vf-chatbot-selector__item-title") + .textContent.toLowerCase(); + + const descriptionEl = item.querySelector( + ".vf-chatbot-selector__item-description" + ); + const description = descriptionEl + ? descriptionEl.textContent.toLowerCase() + : ""; + + const matches = + title.includes(searchQuery) || description.includes(searchQuery); + item.style.display = matches ? "flex" : "none"; + }); + } + + handleItemSelection(item) { + const itemId = item.getAttribute("data-route-id"); + const isAllServices = itemId === "all"; + + if (this.isMultiselect) { + if (isAllServices) { + // If "All services" is clicked, deselect everything else + this.selectAllServices(); + } else { + // If other service is clicked + if (this.selectedItems.has(itemId)) { + // Deselect the item + this.selectedItems.delete(itemId); + item.classList.remove("vf-chatbot-selector__item--selected"); + + // If nothing else is selected, select "All services" + if (this.selectedItems.size === 0) { + this.selectAllServices(); + } + } else { + // Select the item and deselect "All services" + if (this.allServicesSelected) { + this.allServicesItem?.classList.remove( + "vf-chatbot-selector__item--selected" + ); + this.allServicesSelected = false; + } + if (this.selectedItems.size < this.maxMultiSelect) { + this.selectedItems.add(itemId); + item.classList.add("vf-chatbot-selector__item--selected"); + } + } + } + } else { + // Single select mode + this.listItems.forEach(listItem => { + listItem.classList.remove("vf-chatbot-selector__item--selected"); + }); + this.selectedItems.clear(); + this.selectedItems.add(itemId); + item.classList.add("vf-chatbot-selector__item--selected"); + + // Update title text immediately + const title = item.querySelector(".vf-chatbot-selector__item-title") + .textContent; + const titleText = this.el.querySelector( + ".vf-chatbot-selector__title-text" + ); + if (titleText) { + titleText.textContent = title; + } + + this.closeDropdown(); + } + + this.updateSelectionDisplay(); + this.updateClearButton(); + this.dispatchSelectionEvent(); + } + + handleItemClick(item) { + const itemId = item.getAttribute("data-route-id"); + + if (itemId === "all") { + // Handle "All services" selection + this.selectAllServices(); + } else { + // Handle individual item selection + if (this.isMultiselect) { + // Multi-select logic + if (this.selectedItems.has(itemId)) { + // Deselect item + this.selectedItems.delete(itemId); + item.classList.remove("vf-chatbot-selector__item--selected"); + } else { + // Select item and ensure we don't exceed max selection + if (this.selectedItems.size < this.maxMultiSelect) { + this.selectedItems.add(itemId); + item.classList.add("vf-chatbot-selector__item--selected"); + } + } + + // If we deselected all individual items, select "All services" + if (this.selectedItems.size === 0 && this.showAllServices) { + this.selectAllServices(); + } else { + // Deselect "All services" when individual items are selected + this.allServicesSelected = false; + if (this.allServicesItem) { + this.allServicesItem.classList.remove( + "vf-chatbot-selector__item--selected" + ); + } + } + } else { + // Single-select logic + // Clear all previous selections + this.selectedItems.clear(); + this.listItems.forEach(li => { + li.classList.remove("vf-chatbot-selector__item--selected"); + }); + + // Select the clicked item + this.selectedItems.add(itemId); + item.classList.add("vf-chatbot-selector__item--selected"); + + // Deselect "All services" + this.allServicesSelected = false; + + // Close dropdown for single-select + this.closeDropdown(); + } + } + + // Update display and clear button + this.updateSelectionDisplay(); + this.updateClearButton(); + } + + setSelection(selectedItems) { + // Deselect all first + this.selectedItems.clear(); + this.listItems.forEach(item => { + item.classList.remove("vf-chatbot-selector__item--selected"); + }); + + // If "all" is selected + if (selectedItems.includes("all")) { + this.selectAllServices(); + } else { + selectedItems.forEach(id => { + const item = this.el.querySelector(`[data-route-id="${id}"]`); + if (item) { + item.classList.add("vf-chatbot-selector__item--selected"); + this.selectedItems.add(id); + } + }); + this.allServicesSelected = false; + if (this.allServicesItem) { + this.allServicesItem.classList.remove("vf-chatbot-selector__item--selected"); + } + } + this.updateSelectionDisplay(); + this.updateClearButton(); + this.dispatchSelectionEvent(); + } + + selectAllServices() { + if (!this.showAllServices) return; + + // Clear individual selections + this.selectedItems.clear(); + + // Remove selected class from all individual items + this.listItems.forEach(item => { + const itemId = item.getAttribute("data-route-id"); + if (itemId !== "all") { + item.classList.remove("vf-chatbot-selector__item--selected"); + } + }); + + // Select "All services" + this.allServicesSelected = true; + if (this.allServicesItem) { + this.allServicesItem.classList.add("vf-chatbot-selector__item--selected"); + } + } + + clearAllSelections() { + // Clear everything and select "All services" + this.selectAllServices(); + this.updateSelectionDisplay(); + this.updateClearButton(); + this.dispatchSelectionEvent(); + } + + updateSelectionDisplay() { + const titleText = this.el.querySelector(".vf-chatbot-selector__title-text"); + if (!titleText) return; + + if (this.allServicesSelected) { + titleText.textContent = "All services"; + } else if (this.selectedItems.size === 0) { + titleText.textContent = "Select services"; + } else if (!this.isMultiselect) { + const selectedId = Array.from(this.selectedItems)[0]; + const selectedItem = this.el.querySelector( + `[data-route-id="${selectedId}"]` + ); + if (selectedItem) { + const title = selectedItem.querySelector( + ".vf-chatbot-selector__item-title" + ).textContent; + titleText.textContent = title; + } + } else { + titleText.textContent = `${this.selectedItems.size} service${ + this.selectedItems.size > 1 ? "s" : "" + } selected`; + } + } + + dispatchSelectionEvent() { + this.el.dispatchEvent( + new CustomEvent("routeselection", { + detail: { + selectedItems: this.allServicesSelected + ? ["all"] + : Array.from(this.selectedItems), + isMultiselect: this.isMultiselect, + isAllServices: this.allServicesSelected + } + }) + ); + } + + updateClearButton() { + if (this.clearEl) { + if (this.selectedItems.size > 0) { + this.clearEl.classList.add("vf-chatbot-selector__clear--active"); + } else { + this.clearEl.classList.remove("vf-chatbot-selector__clear--active"); + } + } + } +} + +// Function to initialize the component +export function initVFChatbotSelector(element) { + return new VFChatbotSelector(element); +} diff --git a/src/app/components/vf-chatbot-sources/.DS_Store b/src/app/components/vf-chatbot-sources/.DS_Store new file mode 100644 index 0000000..52f43b3 Binary files /dev/null and b/src/app/components/vf-chatbot-sources/.DS_Store differ diff --git a/src/app/components/vf-chatbot-sources/vf-chatbot-sources.angular.component.spec.ts b/src/app/components/vf-chatbot-sources/vf-chatbot-sources.angular.component.spec.ts new file mode 100644 index 0000000..f7d65d9 --- /dev/null +++ b/src/app/components/vf-chatbot-sources/vf-chatbot-sources.angular.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { VfChatbotSourcesAngularComponent } from './vf-chatbot-sources.angular.component'; + +describe('VfChatbotSourcesAngularComponent', () => { + let component: VfChatbotSourcesAngularComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [VfChatbotSourcesAngularComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(VfChatbotSourcesAngularComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/vf-chatbot-sources/vf-chatbot-sources.angular.component.ts b/src/app/components/vf-chatbot-sources/vf-chatbot-sources.angular.component.ts new file mode 100644 index 0000000..e8f8e62 --- /dev/null +++ b/src/app/components/vf-chatbot-sources/vf-chatbot-sources.angular.component.ts @@ -0,0 +1,47 @@ +import { + Component, + Input, + ElementRef, + AfterViewInit +} from '@angular/core'; +import { CommonModule } from '@angular/common'; + + +export interface VFChatbotSource { + title: string; + url: string; +} + +@Component({ + selector: 'vf-chatbot-sources', + template: ` +
    +

    Sources

    + +
    + `, +}) +export class VfChatbotSourcesAngularComponent implements AfterViewInit { + @Input() sources: VFChatbotSource[] = []; + + constructor(private elementRef: ElementRef) {} + + ngAfterViewInit(): void { + } +} + +export * from './vf-chatbot-sources.angular.module'; diff --git a/src/app/components/vf-chatbot-sources/vf-chatbot-sources.angular.module.ts b/src/app/components/vf-chatbot-sources/vf-chatbot-sources.angular.module.ts new file mode 100644 index 0000000..eaf48ef --- /dev/null +++ b/src/app/components/vf-chatbot-sources/vf-chatbot-sources.angular.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { VfChatbotSourcesAngularComponent } from './vf-chatbot-sources.angular.component'; + +@NgModule({ + declarations: [ + VfChatbotSourcesAngularComponent + ], + imports: [ + CommonModule, + FormsModule + ], + exports: [ + VfChatbotSourcesAngularComponent + ] +}) +export class VfChatbotSourcesAngularModule { } diff --git a/src/app/components/vf-chatbot-standalone/.DS_Store b/src/app/components/vf-chatbot-standalone/.DS_Store new file mode 100644 index 0000000..cb2f879 Binary files /dev/null and b/src/app/components/vf-chatbot-standalone/.DS_Store differ diff --git a/src/app/components/vf-chatbot-standalone/vf-chatbot-standalone.angular.component.html b/src/app/components/vf-chatbot-standalone/vf-chatbot-standalone.angular.component.html new file mode 100644 index 0000000..460d88b --- /dev/null +++ b/src/app/components/vf-chatbot-standalone/vf-chatbot-standalone.angular.component.html @@ -0,0 +1,642 @@ +
    +
    +

    + beta + This component version is ready to be used but is still in active development. +

    +
    + +
    +
    +
    +

    Chatbot Standalone + container +

    +

    The vf-chatbot-standalone component provides a full-screen conversational interface between a user and an AI system. It is typically accessed through a dedicated route or external site. Designed for more complex interactions, it supports extended dialogues, exploration of multiple topics, and access to documents or detailed support resources.

    +

    + github location + npm version +

    +
    +
    +
    +
    +

    Usage

    +
    +

    When to use this component

    +

    Only use the chatbot standalone if there's evidence it helps users:

    +
      +
    • Engage in longer sessions or structured tasks such as report generation, data analysis, or learning journeys
    • +
    • Focus in a distraction-free environment optimized for dialogue
    • +
    • Interact with the bot as primary interface, rather than a secondary support layer
    • +
    • Access rich responses such as cards, file previews, or dynamic visualizations
    • +
    +

    For example, the standalone chatbot works well when users need to complete complex workflows or explore content across multiple interactions. It is also effective when the conversation itself drives the experience, rather than supporting it. Test with users to ensure the dedicated interface supports their goals and provides clear value over embedded alternatives.

    +

    When not to use this component

    +

    The chatbot standalone opens in a dedicated interface and removes users from their current context. This can interrupt active tasks or create unnecessary friction for users who only need quick or simple guidance.

    +

    Avoid using the standalone chatbot for brief interactions, especially when users benefit from staying within the current page or task flow. A chatbot modal or embedded support is usually more appropriate in these cases.

    +

    Do not use the standalone chatbot when:

    +
      +
    • The task can be resolved with a simple search or static content
    • +
    • The chatbot does not offer a clear improvement over lighter support mechanisms
    • +
    • Accessing the chatbot disrupts processes that require deep concentration or formal
    • +
    • The chatbot lacks the intelligence or depth to sustain a meaningful experience
    • +
    • The target audience expects or benefits more from traditional, structured interfaces
    • +
    +

    Test your design without a standalone chatbot first. Well-written content, embedded guidance, or contextual help may meet user needs more effectively without introducing unnecessary complexity.

    +

    Deciding between modal vs standalone

    +

    The chatbot modal and chatbot standalone are two distinct variants for delivering conversational interfaces. Choose between them based on use case needs and task complexity.

    +

    Modal

    +
      +
    • For in-context support (e.g. help with current page or workflow)
    • +
    • Access point is via a floating action button on the page
    • +
    • Supports simple tasks such as getting information
    • +
    +

    Standalone

    +
      +
    • Suitable for exploratory or focused workflows (e.g. discovering genetic variants)
    • +
    • Launched via a link (such as "Talk to our AI chat assistant")
    • +
    • Supports more complex tasks that benefit from sustained engagement
    • +
    +

    Anatomy

    + + + + + + + + + + + +
    ElementDescription
    Title barShows the chatbot name, minimise button and close button. The title bar may include a dropdown for selecting categories.
    Dialogue sectionScrollable chat window showing the conversation log.
    Intro messageA brief onboarding message explaining the purpose and capabilities of the chatbot. Shows the icon, title and short message (Max. 2 lines of text).
    BannerUsed to show optional disclaimers or alerts (Max. 3 lines of text). For cases that require user consent, use a blur overlay on the background or a pre-access popup instead, as banners may be missed.
    Text input areaOpen input field for typing and sending queries. Expands up to 5 lines, after which it becomes scrollable.
    +

    Flows

    + + + + + + + + + + + + + +
    FlowDetails
    Suggested promptsAppear on the initial screen. Provide a quick-start to users with clickable queries. They help to provide context on the type of questions the user can ask on the platform. (Max. 60 characters)
    Closing the chat dialogueClicking on the close icon "X" triggers a confirmation prompt to prevent accidental loss of the chat log.
    Error managementIf the chatbot is unable to provide a response to the query, display a clear error message and provide an alternative way for them to get their answers.
    LinksDisplayed in a clear underlined style. They can be shown inline or as a list.
    Source attributionChips are shown in relevant paragraphs which cite the sources. Links to the sources and more details can be accessed via a "View sources" button.
    Feedback on a query levelUsers can assess the AI responses with a thumbs up/thumbs down or optional close/open response fields to give more details.
    Category selectionA dropdown in the title bar lets users switch focus areas (e.g LLM version or data source). Single or multi-selection variants can be used depending on the use case.
    +

    Working example

    +

    You can access working example of standalone version here: + Visual Framework Chatbot - Standalone

    +

    Visual branding elements and content

    +

    The Chatbot branding elements follow EMBL brand guidelines but can be updated to suit your use case. For advice on branding updates please contact the EMBL Communications Team.

    +

    Texts shown in the examples are placeholder content. Please review and update all wording to fit your your project needs and ensure it meets legal, accessibility and organisational requirements.

    +

    Accessibility

    +

    The component targets WCAG 2.1 AA accessibility standard.

    +

    Install

    +

    This repository is distributed with npm. After installing npm and yarn, you can install vf-chatbot-standalone and other dependant components with this command.

    +
    yarn add @visual-framework/vf-chatbot @visual-framework/vf-chatbot-standalone
    +
    +

    Sass/CSS

    +
    @import "@visual-framework/vf-chatbot-standalone/index.scss";
    +
    +

    JavaScript

    +
    
    +
    +import { initVFChatbot } from 'vf-chatbot/vf-chatbot.js';
    +window.addEventListener("load", function() {
    +	initVFChatbot(config);
    +});
    +
    +

    where config is the configuration object with different options as described below

    +

    Core Configuration Options

    +
    const config = {
    +	type: "standalone",
    +	title: "AI Assistant",
    +	welcome_logo: true,
    +	welcome_message: "Welcome! I'm here to help",
    +	welcome_logo_alt: "AI Assistant",
    +	welcome_suggestions_title: "Try asking me:",
    +	input_placeholder: "Ask me ...",
    +	welcome_max_suggestions: 4,
    +	disclaimer: 'Disclaimer: This chatbot is designed to assist you with general information and basic inquiries. See our <a class="vf-banner__link" target="_blank" rel="noopener noreferrer" aria-label="disclaimer notes (opens in new tab)" href="https://www.ebi.ac.uk/data-protection/privacy-notice/embl-ebi-public-website/">disclaimer notes</a>.',
    +	footnote: 'Review AI generated content for accuracy. <a class="vf-link" target="_blank" rel="noopener noreferrer" aria-label="Leave feedback (opens in new tab)" href="https://embl.service-now.com/esc?id=sc_cat_item&sys_id=5eeb8eb91b92e650b376da88b04bcbc1">Leave feedback</a>.',
    +	icons: {
    +		assistant_avatar: "../../assets/vf-chatbot/assets/vf-chatbot--icon-16x16-dark-green.svg",
    +		user_avatar: "../../assets/vf-chatbot/assets/vf-chatbot--avatar-user.svg",
    +		send_button: "../../assets/vf-chatbot/assets/vf-chatbot--icon-send.svg",
    +		main_logo_url: "../../assets/vf-chatbot/assets/vf-chatbot--icon-32x32-dark-green.svg",
    +		minimize: "../../assets/vf-chatbot/assets/vf-chatbot--icon-minimize.svg",
    +		close: "../../assets/vf-chatbot/assets/vf-chatbot--icon-close.svg"
    + },
    +	api: {
    +		chat_endpoint: false,
    +		feedback_endpoint: false,
    +		qa_data_url: "../../assets/vf-chatbot/assets/vf-chatbot-qa.json",
    +		headers:{
    +			"Content-Type": "application/json",
    +			"Authorization": "Bearer your-token"
    +		},
    +		timeout: 10000
    +	},
    +	features: {
    +		enable_welcome: true,
    +		enable_feedback: true,
    +		enable_sources: true,
    +		enable_welcome_suggestions: true,
    +		enable_typing_indicator: true,
    +		enable_disclaimer: true,
    +		enable_predefined_qa: true,
    +		enable_fallback_responses: true,
    +		enable_qa_data_loading: true,
    +		enable_instant_feedback: false
    +	},
    +	behavior: {
    +		auto_scroll: true,
    +		typing_delay: 800,
    +		show_scrollbar: false
    +},
    +	selectorContext: {
    +		chatbotRoutes: {
    +			multiSelect: true,
    +			maxMultiSelect: 3,
    +			showSearch: true,
    +			showSearchThreshold: 5,
    +			showAllServices: true,
    +			showAllServicesSelected: true,
    +			routes: "../../assets/vf-chatbot/assets/vf-chatbot-selector-services.json",
    +			placeholder: "Select services",
    +			title: "Services",
    +			selector_logo_url: "../../assets/vf-chatbot/assets/vf-chatbot--icon-24x24-dark-green.svg",
    +			selector_logo_title: "AI Assistant"
    +		}
    +	},
    +	handlers: {
    +		on_message_send: "handleMessageSend",
    +		on_response_receive: "handleResponseReceive",
    +		on_feedback_submit: "handleFeedbackSubmit",
    +		on_suggestion_click: "handleSuggestionClick",
    +		on_error: "handleError",
    +		on_conversation_start: "handleConversationStart",
    +		on_conversation_end: "handleConversationEnd"
    +	},
    +	feedback_options: {
    +		positive: [
    +			{ id: "accurate", label: "Accurate" },
    +			{ id: "easy", label: "Easy to understand" },
    +			{ id: "formatted", label: "Well formatted" }
    +		],
    +		negative: [
    +			{ id: "inaccurate", label: "Inaccurate" },
    +			{ id: "nocontext", label: "Did not use context" },
    +			{ id: "poorformat", label: "Poorly formatted" }
    +		]
    +	}
    +};
    +
    +

    Service Selector Configuration

    +

    The chatbot includes an integrated selector component which can be configured to present different selection options to user:

    +
    const selectorConfig = {
    +	selectorContext: {
    +		chatbotRoutes: {
    +			// Multi-selection settings
    +			multiSelect: true,
    +			maxMultiSelect: 3,
    +
    +			// Search functionality
    +			showSearch: true,
    +			showSearchThreshold: 5,
    +
    +			// "All Services" option
    +			showAllServices: true,
    +			showAllServicesSelected: true,
    +
    +			// Data source
    +			routes: "assets/vf-chatbot-selector-services.json",
    +
    +			// UI labels and logo
    +			placeholder: "Select services",
    +			title: "Available Services",
    +			selector_logo_url: "../../assets/vf-chatbot/assets/vf-chatbot--icon-24x24-dark-green.svg",
    +			selector_logo_title: "AI Assistant"
    +		}
    +	}
    +};
    +
    +Please note that if you want to opt for a single selection option version of the selector dropdown, you need to omit the multiSelect, maxMultiSelect, showAllServices and showAllServicesSelected properties from the selectorConfig above.
    +
    +

    Selector Data Format (JSON):

    +
    {
    +	"routes": [
    +		{
    +			"id": "service-1",
    +			"title": "Service 1 title"
    +		},
    +		{
    +			"id": "service-2",
    +			"title": "Service 2 title"
    +		}
    +	]
    +}
    +
    +

    Event Handling

    +

    Built-in Event Handlers

    +

    Chatbot comes with a provision to allow custom event handlers. These handlers can be defined in your code to handle specific actions for different events triggered during interaction with chatbot. Configure custom handlers for chatbot events:

    +
    const config = {
    +	handlers: {
    +		on_message_send: "handleMessageSend",
    +		on_response_receive: "handleResponseReceive",
    +		on_feedback_submit: "handleFeedbackSubmit",
    +		on_suggestion_click: "handleSuggestionClick",
    +		on_error: "handleError",
    +		on_conversation_start: "handleConversationStart",
    +		on_conversation_end: "handleConversationEnd"
    +	}
    +};
    +
    +function handleMessageSend(message, conversationId) {
    +	console.log('User sent:', message);
    +}
    +
    +function handleResponseReceive(response, sources, prompts) {
    +	console.log('Assistant responded:', response);
    +}
    +
    +function handleFeedbackSubmit(feedbackData) {
    +	console.log('Feedback received:', feedbackData);
    +}
    +
    +

    Custom Event Listeners

    +

    Likewise you can also listen to events emitted by the chatbot for specific interactions:

    +
    document.addEventListener('vf-chatbot:message-send', (event) => {
    +	const { message, conversationId } = event.detail;
    +});
    +
    +document.addEventListener('vf-chatbot:message-receive', (event) => {
    +	const { message, conversationId } = event.detail;
    +});
    +
    +document.addEventListener('vf-chatbot-feedback:submit', (event) => {
    +	const { messageId, feedbackType, feedbackText, feedbackComment } = event.detail;
    +});
    +
    +document.addEventListener('vf-chatbot-welcome:suggestion-click', (event) => {
    +	const { question } = event.detail;
    +});
    +
    +document.addEventListener('vf-chatbot:assistant-change', (obj) => {
    +	const { selectedRoutes } = obj.selectedAssistants;
    +	const { conversationId } = obj.conversationId;
    +});
    +
    +document.addEventListener('vf-chatbot:error', (event) => {
    +	const { message, conversationId } = event.detail;
    +});
    +
    +document.addEventListener('vf-chatbot:conversation-start', (event) => {
    +	const { message, conversationId } = event.detail;
    +});
    +
    +document.addEventListener('vf-chatbot:conversation-end', (event) => {
    +	const { message, conversationId } = event.detail;
    +});
    +
    +

    Feedback System Configuration

    +

    Feedback (with form)

    +
    const config = {
    +	features: {
    +		enable_feedback: true,
    +		enable_instant_feedback: false
    +	},
    +	feedback_options: {
    +		positive: [
    +			{ id: "accurate", label: "Accurate" },
    +			{ id: "easy", label: "Easy to understand" },
    +			{ id: "formatted", label: "Well formatted" }
    +		],
    +		negative: [
    +			{ id: "inaccurate", label: "Inaccurate answer" },
    +			{ id: "nocontext", label: "Did not use context" },
    +			{ id: "poorformat", label: "Poorly formatted" }
    +		]
    +	}
    +};
    +
    +

    Instant Feedback (one-click)

    +
    const config = {
    +	features: {
    +		enable_feedback: true,
    +		enable_instant_feedback: true
    +	}
    +};
    +
    +

    Q&A Data Configuration

    +

    Load predefined questions and answers:

    +
    const config = {
    +	features: {
    +		enable_predefined_qa: true,
    +		enable_qa_data_loading: true
    +	},
    +	api: {
    +		qa_data_url: "path/to/qa-data.json"
    +	}
    +};
    +
    +

    Q&A Data Format:

    +
    {
    +	"predefinedQA": {
    +		"How can I submit genomic data to EMBL-EBI?": {
    +			"answer": "To submit genomic data, visit the EMBL-EBI submission portal, where you’ll find step-by-step guides and tools for submitting sequencing data, assemblies, annotations, and more.",
    +			"sources": [
    +				{
    +					"domain": "ebi.ac.uk",
    +					"title": "EMBL's European Bioinformatics Institute",
    +					"url": "https://www.ebi.ac.uk/",
    +					"description": "Run BLAST searches against comprehensive sequence databases at EMBL-EBI."
    +				},
    +				{
    +					"domain": "ena-docs.readthedocs.io",
    +					"title": "ENA Documentation",
    +					"url": "https://ena-docs.readthedocs.io/en/latest/",
    +					"description": "ENA Documentation"
    +				}
    +			]
    +		}
    +	},
    +	"fallbackResponses": [
    +		{
    +			"answer": "I'm sorry, I'm having trouble connecting to my knowledge base right now. Could you try again in a moment?",
    +			"prompts": [
    +				{
    +					"action_text": "Contact support team",
    +					"action_url": "tel:+44 1223 494 444"
    +				},
    +				{
    +					"action_text": "Submit a support request",
    +					"action_url": "https://www.ebi.ac.uk/about/contact/support/"
    +				}
    +			]
    +		}
    +	]
    +}
    +
    +

    API Integration

    +

    Chat Endpoint

    +

    Your chat API should accept POST requests:

    +
    {
    +	"message": "User's question",
    +	"conversationId": "unique-id",
    +	"context": {
    +		"selectedServices": ["service-1", "service-2"]
    +	}
    +}
    +
    +{
    +	"response": "Assistant's answer",
    +	"sources": [
    +		{
    +			"title": "Documentation Link",
    +			"url": "https://example.com/docs"
    +		}
    +	],
    +	"prompts": [
    +		{
    +			"action_text": "Learn More",
    +			"action_url": "https://example.com/learn"
    +		}
    +	]
    +}
    +
    +

    Custom Welcome Screen

    +
    const config = {
    +	features: {
    +		enable_welcome: true,
    +		enable_welcome_suggestions: true
    +	},
    +	welcome_logo: true,
    +	welcome_message: "Welcome to our AI assistant!",
    +	welcome_suggestions_title: "Popular questions:",
    +	welcome_max_suggestions: 6
    +};
    +
    +

    Source Citations

    +
    const config = {
    +	features: {
    +		enable_sources: true,
    +		enable_sources_custom_format: true,
    +	}
    +};
    +
    +

    Action Prompts

    +
    {
    +	"response": "I can help you with that...",
    +	"prompts": [
    +		{
    +			"action_text": "Start Tutorial",
    +			"action_url": "https://example.com/tutorial"
    +		},
    +		{
    +			"action_text": "Contact Support",
    +			"action_url": "mailto:support@example.com"
    +		}
    +	]
    +}
    +
    +

    Angular

    +

    This component now has Angular support which has been tested on Angular version 18.2.21

    + +
    +
    +
    +
    + + + + +
    +
    + +
    + {{ config?.selectorContext?.selector_logo_title }} +
    +
    +
    +
    +
    +
    + +
    +
    + + +
    + +
    + +
    +
    +
    +

    + +
    +
    +
    +
    + +
    +
    + + + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + +
    +

    Changelog

    +
    + Changelog +

    Changelog

    +

    1.0.0-beta.4

    +
      +
    • Updated : Standalone variant initialization moved to vf-chatbot component
    • +
    • Updated : Added more config options
    • +
    • Updated : Changes for chatbot modal variant
    • +
    • Fixed: Added code to return feedback comments
    • +
    • Added : React support Tracking issue
    • +
    +

    1.0.0-beta.3

    +
    • Version bump
    +

    1.0.0-beta.2

    +
    • Updated package.json with correct settings
    +

    1.0.0-beta.1

    +
      +
    • Initial version
    • +
    • Auto-resizing textarea (1-5 rows with scroll)
    • +
    • Configurable Q&A data loading with fallback responses
    • +
    • Enhanced accessibility
    • +
    • Comprehensive event handling system
    • +
    +
    +
    + +

    Assets

    + + +
    +
    +

    File system location: components/vf-chatbot-standalone

    +
    \ No newline at end of file diff --git a/src/app/components/vf-chatbot-standalone/vf-chatbot-standalone.angular.component.spec.ts b/src/app/components/vf-chatbot-standalone/vf-chatbot-standalone.angular.component.spec.ts new file mode 100644 index 0000000..1785fde --- /dev/null +++ b/src/app/components/vf-chatbot-standalone/vf-chatbot-standalone.angular.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { VfChatbotStandaloneAngularComponent } from './vf-chatbot-standalone.angular.component'; + +describe('VfChatbotStandaloneAngularComponent', () => { + let component: VfChatbotStandaloneAngularComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [VfChatbotStandaloneAngularComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(VfChatbotStandaloneAngularComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/vf-chatbot-standalone/vf-chatbot-standalone.angular.component.ts b/src/app/components/vf-chatbot-standalone/vf-chatbot-standalone.angular.component.ts new file mode 100644 index 0000000..abf9ed3 --- /dev/null +++ b/src/app/components/vf-chatbot-standalone/vf-chatbot-standalone.angular.component.ts @@ -0,0 +1,203 @@ +import { + Component, + ElementRef, + Input, + Output, + EventEmitter, + OnInit, + AfterViewInit, + ViewChild, + ViewEncapsulation, + Renderer2, + Inject, +} from '@angular/core'; +import { DOCUMENT } from '@angular/common'; + +@Component({ + selector: 'vf-chatbot-standalone', + templateUrl: './vf-chatbot-standalone.angular.component.html', + encapsulation: ViewEncapsulation.None, +}) +export class VfChatbotStandaloneAngularComponent implements OnInit, AfterViewInit { + @Input() config: any = {}; + @Input() messages: any[] = []; + @Input() sources: any[] = []; + @Input() prompts: any[] = []; + @Input() inputValue = ''; + + @Output() onSendMessage = new EventEmitter(); + @Output() onInputChange = new EventEmitter(); + @Output() onFeedback = new EventEmitter(); + @Output() onDialogConfirm = new EventEmitter(); + @Output() onDialogCancel = new EventEmitter(); + + @ViewChild('standaloneRef') standaloneRef!: ElementRef; + + qaData: any[] = []; + private loadedScripts = new Set(); + + constructor( + private renderer: Renderer2, + @Inject(DOCUMENT) private document: Document + ) {} + + ngOnInit() {} + + async ngAfterViewInit() { + try { + await this.loadWorkingScripts(); + this.initializeChatbot(); + } catch { + this.initializeChatbot(); + } + } + + private async loadWorkingScripts(): Promise { + const moduleScripts = [ + '/assets/vf-chatbot-fab/vf-chatbot-fab.js', + '/assets/vf-chatbot-dialog/vf-chatbot-dialog.js', + '/assets/vf-chatbot-feedback/vf-chatbot-feedback.js', + '/assets/vf-chatbot-selector/vf-chatbot-selector.js', + '/assets/vf-chatbot-sources/vf-chatbot-sources.js', + '/assets/vf-chatbot-welcome/vf-chatbot-welcome.js' + ]; + + const moduleScriptsWithDependencies = [ + '/assets/vf-chatbot/vf-chatbot.js', + '/assets/vf-chatbot-modal/vf-chatbot-modal.js', + '/assets/vf-chatbot-standalone/vf-chatbot-standalone.js' + ]; + + for (const scriptSrc of moduleScripts) { + try { + await this.loadSingleScript(scriptSrc); + } catch { + // Keep loading remaining scripts; standalone init tolerates missing optional modules. + } + } + + for (const scriptSrc of moduleScriptsWithDependencies) { + try { + await this.loadSingleScript(scriptSrc); + } catch { + // Keep loading remaining scripts; standalone init tolerates missing optional modules. + } + } + } + + private async loadSingleScript(src: string): Promise { + if (this.loadedScripts.has(src)) { + return; + } + + try { + await import(/* webpackIgnore: true */ src); + this.loadedScripts.add(src); + return; + } catch { + // Fall through to script tag loading if dynamic import fails. + } + + await new Promise((resolve) => { + const existingScript = this.document.querySelector(`script[src="${src}"]`); + if (existingScript) { + this.loadedScripts.add(src); + resolve(); + return; + } + + const script = this.renderer.createElement('script'); + script.type = 'module'; + script.src = src; + script.async = true; + + script.onload = () => { + this.loadedScripts.add(src); + resolve(); + }; + + script.onerror = () => { + this.loadedScripts.add(`${src}_failed`); + resolve(); + }; + + this.renderer.appendChild(this.document.head, script); + }); + } + + private initializeChatbot(): void { + const allInitFunctions = [ + 'initVFChatbotFab', + 'initVFChatbotDialog', + 'initVFChatbotFeedback', + 'initVFChatbotSelector', + 'initVFChatbotSources', + 'initVFChatbotWelcome', + 'initVFChatbotStandalone', + 'initVFChatbotModal', + 'initVFChatbot' + ]; + + allInitFunctions.forEach(funcName => { + if (typeof (window as any)[funcName] === 'function') { + try { + (window as any)[funcName](); + } catch { + // Continue initializing available modules. + } + } + }); + } +} + +@Component({ + selector: 'app-vf-chatbot-standalone-page', + template: ` + + ` +}) +export class VfChatbotStandalonePageComponent { + public chatbotConfig = { + type: 'standalone', + title: 'Visual Framework Assistant', + welcome_logo: true, + welcome_message: "Welcome! I'm here to help with Visual Framework components.", + welcome_logo_alt: 'Visual Framework Assistant', + welcome_suggestions_title: 'Try asking me:', + input_placeholder: 'Ask a question...', + welcome_max_suggestions: 4, + disclaimer: 'This demo chatbot is for internal component testing and UI exploration.', + footnote: 'Review generated responses before using them in production.', + icons: { + assistant_avatar: './assets/vf-chatbot/assets/vf-chatbot--icon-16x16-dark-green.svg', + user_avatar: './assets/vf-chatbot/assets/vf-chatbot--avatar-user.svg', + send_button: './assets/vf-chatbot/assets/vf-chatbot--icon-send.svg', + minimize: './assets/vf-chatbot/assets/vf-chatbot--icon-minimize.svg', + close: './assets/vf-chatbot/assets/vf-chatbot--icon-close.svg', + main_logo_url: './assets/vf-chatbot/assets/vf-chatbot--icon-32x32-dark-green.svg' + }, + features: { + enable_welcome: true, + enable_welcome_suggestions: true, + enable_qa_data_loading: true, + enable_predefined_qa: true, + enable_fallback_responses: true, + enable_feedback: true, + enable_disclaimer: true, + enable_typing_indicator: true + }, + behavior: { + show_scrollbar: true, + auto_scroll: true + }, + api: { + qa_data_url: './assets/vf-chatbot/assets/vf-chatbot-qa.json' + } + }; +} diff --git a/src/app/components/vf-chatbot-standalone/vf-chatbot-standalone.angular.module.ts b/src/app/components/vf-chatbot-standalone/vf-chatbot-standalone.angular.module.ts new file mode 100644 index 0000000..9aa20f5 --- /dev/null +++ b/src/app/components/vf-chatbot-standalone/vf-chatbot-standalone.angular.module.ts @@ -0,0 +1,30 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { VfChatbotStandaloneAngularComponent } from './vf-chatbot-standalone.angular.component'; +import { VfChatbotActionPromptAngularModule } from '../vf-chatbot-action-prompt/vf-chatbot-action-prompt.angular.module'; +import { VfChatbotSelectorAngularModule } from '../vf-chatbot-selector/vf-chatbot-selector.angular.module'; +import { VfChatbotWelcomeAngularModule } from '../vf-chatbot-welcome.angular/vf-chatbot-welcome.angular.module'; +import { VfChatbotPromptAngularModule } from '../vf-chatbot-prompt/vf-chatbot-prompt.angular.module'; +import { VfChatbotFeedbackAngularModule } from '../vf-chatbot-feedback/vf-chatbot-feedback.angular.module'; +import { VfChatbotDialogAngularModule } from '../vf-chatbot-dialog/vf-chatbot-dialog.angular.module'; + +@NgModule({ + declarations: [ + VfChatbotStandaloneAngularComponent + ], + imports: [ + CommonModule, + FormsModule, + VfChatbotActionPromptAngularModule, + VfChatbotSelectorAngularModule, + VfChatbotWelcomeAngularModule, + VfChatbotPromptAngularModule, + VfChatbotFeedbackAngularModule, + VfChatbotDialogAngularModule + ], + exports: [ + VfChatbotStandaloneAngularComponent + ] +}) +export class VfChatbotStandaloneAngularModule { } diff --git a/src/app/components/vf-chatbot-standalone/vf-chatbot-standalone.component.html b/src/app/components/vf-chatbot-standalone/vf-chatbot-standalone.component.html new file mode 100644 index 0000000..8241e0b --- /dev/null +++ b/src/app/components/vf-chatbot-standalone/vf-chatbot-standalone.component.html @@ -0,0 +1,1211 @@ + + + + + + +
    +

    Usage

    +
    +

    When to use this component

    +

    Only use the chatbot standalone if there's evidence it helps users:

    +
      +
    • Engage in longer sessions or structured tasks such as report generation, data analysis, or learning journeys
    • +
    • Focus in a distraction-free environment optimized for dialogue
    • +
    • Interact with the bot as primary interface, rather than a secondary support layer
    • +
    • Access rich responses such as cards, file previews, or dynamic visualizations
    • +
    +

    For example, the standalone chatbot works well when users need to complete complex workflows or explore content across multiple interactions. It is also effective when the conversation itself drives the experience, rather than supporting it. Test with users to ensure the dedicated interface supports their goals and provides clear value over embedded alternatives.

    +

    When not to use this component

    +

    The chatbot standalone opens in a dedicated interface and removes users from their current context. This can interrupt active tasks or create unnecessary friction for users who only need quick or simple guidance.

    +

    Avoid using the standalone chatbot for brief interactions, especially when users benefit from staying within the current page or task flow. A chatbot modal or embedded support is usually more appropriate in these cases.

    +

    Do not use the standalone chatbot when:

    +
      +
    • The task can be resolved with a simple search or static content
    • +
    • The chatbot does not offer a clear improvement over lighter support mechanisms
    • +
    • Accessing the chatbot disrupts processes that require deep concentration or formal
    • +
    • The chatbot lacks the intelligence or depth to sustain a meaningful experience
    • +
    • The target audience expects or benefits more from traditional, structured interfaces
    • +
    +

    Test your design without a standalone chatbot first. Well-written content, embedded guidance, or contextual help may meet user needs more effectively without introducing unnecessary complexity.

    +

    Deciding between modal vs standalone

    +

    The chatbot modal and chatbot standalone are two distinct variants for delivering conversational interfaces. Choose between them based on use case needs and task complexity.

    +

    Modal

    +
      +
    • For in-context support (e.g. help with current page or workflow)
    • +
    • Access point is via a floating action button on the page
    • +
    • Supports simple tasks such as getting information
    • +
    +

    Standalone

    +
      +
    • Suitable for exploratory or focused workflows (e.g. discovering genetic variants)
    • +
    • Launched via a link (such as "Talk to our AI chat assistant")
    • +
    • Supports more complex tasks that benefit from sustained engagement
    • +
    +

    Anatomy

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ElementDescription
    Title barShows the chatbot name, minimise button and close button. The title bar may include a dropdown for selecting categories.
    Dialogue sectionScrollable chat window showing the conversation log.
    Intro messageA brief onboarding message explaining the purpose and capabilities of the chatbot. Shows the icon, title and short message (Max. 2 lines of text).
    BannerUsed to show optional disclaimers or alerts (Max. 3 lines of text). For cases that require user consent, use a blur overlay on the background or a pre-access popup instead, as banners may be missed.
    Text input areaOpen input field for typing and sending queries. Expands up to 5 lines, after which it becomes scrollable.
    +

    Flows

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FlowDetails
    Suggested promptsAppear on the initial screen. Provide a quick-start to users with clickable queries. They help to provide context on the type of questions the user can ask on the platform. (Max. 60 characters)
    Closing the chat dialogueClicking on the close icon "X" triggers a confirmation prompt to prevent accidental loss of the chat log.
    Error managementIf the chatbot is unable to provide a response to the query, display a clear error message and provide an alternative way for them to get their answers.
    LinksDisplayed in a clear underlined style. They can be shown inline or as a list.
    Source attributionChips are shown in relevant paragraphs which cite the sources. Links to the sources and more details can be accessed via a "View sources" button.
    Feedback on a query levelUsers can assess the AI responses with a thumbs up/thumbs down or optional close/open response fields to give more details.
    Category selectionA dropdown in the title bar lets users switch focus areas (e.g LLM version or data source). Single or multi-selection variants can be used depending on the use case.
    +

    Working example

    +

    You can access working example of standalone version here: +Visual Framework Chatbot - Standalone

    +

    Visual branding elements and content

    +

    The Chatbot branding elements follow EMBL brand guidelines but can be updated to suit your use case. For advice on branding updates please contact the EMBL Communications Team.

    +

    Texts shown in the examples are placeholder content. Please review and update all wording to fit your your project needs and ensure it meets legal, accessibility and organisational requirements.

    +

    Accessibility

    +

    The component targets WCAG 2.1 AA accessibility standard.

    +

    Install

    +

    This repository is distributed with npm. After installing npm and yarn, you can install vf-chatbot-standalone and other dependant components with this command.

    +
    yarn add @visual-framework/vf-chatbot @visual-framework/vf-chatbot-standalone
    +
    +

    Sass/CSS

    +
    @import "@visual-framework/vf-chatbot-standalone/index.scss";
    +
    +

    JavaScript

    +
    
    +
    +import { initVFChatbot } from 'vf-chatbot/vf-chatbot.js';
    +window.addEventListener("load", function() {
    +  initVFChatbot(config);
    +});
    +
    +

    where config is the configuration object with different options as described below

    +

    Core Configuration Options

    +
    const config = {
    +  type: "standalone",
    +  title: "AI Assistant",
    +  welcome_logo: true,
    +  welcome_message: "Welcome! I'm here to help",
    +  welcome_logo_alt: "AI Assistant",
    +  welcome_suggestions_title: "Try asking me:",
    +  input_placeholder: "Ask me ...",
    +  welcome_max_suggestions: 4,
    +  disclaimer: 'Disclaimer: This chatbot is designed to assist you with general information and basic inquiries. See our <a class="vf-banner__link" target="_blank" rel="noopener noreferrer" aria-label="disclaimer notes (opens in new tab)" href="https://www.ebi.ac.uk/data-protection/privacy-notice/embl-ebi-public-website/">disclaimer notes</a>.',
    +  footnote: 'Review AI generated content for accuracy. <a class="vf-link" target="_blank" rel="noopener noreferrer" aria-label="Leave feedback (opens in new tab)" href="https://embl.service-now.com/esc?id=sc_cat_item&sys_id=5eeb8eb91b92e650b376da88b04bcbc1">Leave feedback</a>.',
    +  icons: {
    +    assistant_avatar: "../../assets/vf-chatbot/assets/vf-chatbot--icon-16x16-dark-green.svg",
    +    user_avatar: "../../assets/vf-chatbot/assets/vf-chatbot--avatar-user.svg",
    +    send_button: "../../assets/vf-chatbot/assets/vf-chatbot--icon-send.svg",
    +    main_logo_url: "../../assets/vf-chatbot/assets/vf-chatbot--icon-32x32-dark-green.svg",
    +    minimize: "../../assets/vf-chatbot/assets/vf-chatbot--icon-minimize.svg",
    +    close: "../../assets/vf-chatbot/assets/vf-chatbot--icon-close.svg"
    +  },
    +  api: {
    +    chat_endpoint: false,
    +    feedback_endpoint: false,
    +    qa_data_url: "../../assets/vf-chatbot/assets/vf-chatbot-qa.json",
    +    headers:{
    +      "Content-Type": "application/json",
    +      "Authorization": "Bearer your-token"
    +    },
    +    timeout: 10000
    +  },
    +  features: {
    +    enable_welcome: true,
    +    enable_feedback: true,
    +    enable_sources: true,
    +    enable_welcome_suggestions: true,
    +    enable_typing_indicator: true,
    +    enable_disclaimer: true,
    +    enable_predefined_qa: true,
    +    enable_fallback_responses: true,
    +    enable_qa_data_loading: true,
    +    enable_instant_feedback: false
    +  },
    +  behavior: {
    +    auto_scroll: true,
    +    typing_delay: 800,
    +    show_scrollbar: false
    +  },
    +  selectorContext: {
    +    chatbotRoutes: {
    +      multiSelect: true,
    +      maxMultiSelect: 3,
    +      showSearch: true,
    +      showSearchThreshold: 5,
    +      showAllServices: true,
    +      showAllServicesSelected: true,
    +      routes: "../../assets/vf-chatbot/assets/vf-chatbot-selector-services.json",
    +      placeholder: "Select services",
    +      title: "Services",
    +      selector_logo_url: "../../assets/vf-chatbot/assets/vf-chatbot--icon-24x24-dark-green.svg",
    +      selector_logo_title: "AI Assistant"
    +    }
    +  },
    +  handlers: {
    +    on_message_send: "handleMessageSend",
    +    on_response_receive: "handleResponseReceive",
    +    on_feedback_submit: "handleFeedbackSubmit",
    +    on_suggestion_click: "handleSuggestionClick",
    +    on_error: "handleError",
    +    on_conversation_start: "handleConversationStart",
    +    on_conversation_end: "handleConversationEnd"
    +  },
    +  feedback_options: {
    +    positive: [
    +      { id: "accurate", label: "Accurate" },
    +      { id: "easy", label: "Easy to understand" },
    +      { id: "formatted", label: "Well formatted" }
    +    ],
    +    negative: [
    +      { id: "inaccurate", label: "Inaccurate" },
    +      { id: "nocontext", label: "Did not use context" },
    +      { id: "poorformat", label: "Poorly formatted" }
    +    ]
    +  }
    +};
    +
    +

    Service Selector Configuration

    +

    The chatbot includes an integrated selector component which can be configured to present different selection options to user:

    +
    const selectorConfig = {
    +  selectorContext: {
    +    chatbotRoutes: {
    +      // Multi-selection settings
    +      multiSelect: true,
    +      maxMultiSelect: 3,
    +      
    +      // Search functionality
    +      showSearch: true,
    +      showSearchThreshold: 5,
    +      
    +      // "All Services" option
    +      showAllServices: true,
    +      showAllServicesSelected: true,
    +      
    +      // Data source
    +      routes: "assets/vf-chatbot-selector-services.json",
    +      
    +      // UI labels and logo
    +      placeholder: "Select services",
    +      title: "Available Services",
    +      selector_logo_url: "../../assets/vf-chatbot/assets/vf-chatbot--icon-24x24-dark-green.svg",
    +      selector_logo_title: "AI Assistant"
    +    }
    +  }
    +};
    +
    +Please note that if you want to opt for a single selection option version of the selector dropdown, you need to omit the multiSelect, maxMultiSelect, showAllServices and showAllServicesSelected properties from the selectorConfig above.
    +
    +

    Selector Data Format (JSON):

    +
    {
    +  "routes": [
    +    {
    +      "id": "service-1",
    +      "title": "Service 1 title"
    +    },
    +    {
    +      "id": "service-2", 
    +      "title": "Service 2 title"
    +    }
    +  ]
    +}
    +
    +

    Event Handling

    +

    Built-in Event Handlers

    +

    Chatbot comes with a provision to allow custom event handlers. These handlers can be defined in your code to handle specific actions for different events triggered during interaction with chatbot. +Configure custom handlers for chatbot events:

    +
    const config = {
    +  handlers: {
    +    on_message_send: "handleMessageSend",
    +    on_response_receive: "handleResponseReceive", 
    +    on_feedback_submit: "handleFeedbackSubmit",
    +    on_suggestion_click: "handleSuggestionClick",
    +    on_error: "handleError",
    +    on_conversation_start: "handleConversationStart",
    +    on_conversation_end: "handleConversationEnd"
    +  }
    +};
    +
    +// Implement handler functions
    +function handleMessageSend(message, conversationId) {
    +  console.log('User sent:', message);
    +  // Track analytics, log conversations, etc.
    +}
    +
    +function handleResponseReceive(response, sources, prompts) {
    +  console.log('Assistant responded:', response);
    +  // Process response, update UI, etc.
    +}
    +
    +function handleFeedbackSubmit(feedbackData) {
    +  console.log('Feedback received:', feedbackData);
    +  // Send to analytics, update models, etc.
    +}
    +
    +

    Custom Event Listeners

    +

    Likewise you can also listen to events emitted by the chatbot for specific interactions:

    +
    // Listen for specific chatbot events
    +document.addEventListener('vf-chatbot:message-send', (event) => {
    +  const { message, conversationId } = event.detail;
    +  // Handle message send
    +});
    +
    +document.addEventListener('vf-chatbot:message-receive', (event) => {
    +  const { message, conversationId } = event.detail;
    +  // Handle message send
    +});
    +
    +document.addEventListener('vf-chatbot-feedback:submit', (event) => {
    +  const { messageId, feedbackType, feedbackText, feedbackComment } = event.detail;
    +  // Handle feedback submission
    +});
    +
    +document.addEventListener('vf-chatbot-welcome:suggestion-click', (event) => {
    +  const { question } = event.detail;
    +  // Handle suggestion clicks
    +});
    +
    +document.addEventListener('vf-chatbot:assistant-change', (obj) => {
    +  const { selectedRoutes } = obj.selectedAssistants;
    +  const { conversationId } = obj.conversationId;
    +  // Handle service selection
    +});
    +
    +document.addEventListener('vf-chatbot:error', (event) => {
    +  const { message, conversationId } = event.detail;
    +  // Handle message send
    +});
    +
    +document.addEventListener('vf-chatbot:conversation-start', (event) => {
    +  const { message, conversationId } = event.detail;
    +  // Handle conversation start
    +});
    +
    +document.addEventListener('vf-chatbot:conversation-end', (event) => {
    +  const { message, conversationId } = event.detail;
    +  // Handle conversation end
    +});
    +
    +
    +

    Feedback System Configuration

    +

    Feedback (with form)

    +
    const config = {
    +  features: {
    +    enable_feedback: true,
    +    enable_instant_feedback: false // Default
    +  },
    +  feedback_options: {
    +    positive: [
    +      { id: "accurate", label: "Accurate" },
    +      { id: "easy", label: "Easy to understand" },
    +      { id: "formatted", label: "Well formatted" }
    +    ],
    +    negative: [
    +      { id: "inaccurate", label: "Inaccurate answer" },
    +      { id: "nocontext", label: "Did not use context" },
    +      { id: "poorformat", label: "Poorly formatted" }
    +    ]
    +  }
    +};
    +
    +

    Instant Feedback (one-click)

    +
    const config = {
    +  features: {
    +    enable_feedback: true,
    +    enable_instant_feedback: true // Thumbs up/down only
    +  }
    +};
    +
    +

    Q&A Data Configuration

    +

    Load predefined questions and answers:

    +
    const config = {
    +  features: {
    +    enable_predefined_qa: true,
    +    enable_qa_data_loading: true
    +  },
    +  api: {
    +    qa_data_url: "path/to/qa-data.json"
    +  }
    +};
    +
    +

    Q&A Data Format:

    +
    {
    +  "predefinedQA": {
    +    "How can I submit genomic data to EMBL-EBI?": {
    +      "answer": "To submit genomic data, visit the EMBL-EBI submission portal, where you’ll find step-by-step guides and tools for submitting sequencing data, assemblies, annotations, and more.",
    +      "sources": [
    +        {
    +          "domain": "ebi.ac.uk",
    +          "title": "EMBL's European Bioinformatics Institute",
    +          "url": "https://www.ebi.ac.uk/",
    +          "description": "Run BLAST searches against comprehensive sequence databases at EMBL-EBI."
    +        },
    +        {
    +          "domain": "ena-docs.readthedocs.io",
    +          "title": "ENA Documentation",
    +          "url": "https://ena-docs.readthedocs.io/en/latest/",
    +          "description": "ENA Documentation"
    +        }
    +      ]
    +    }
    +  },
    +  "fallbackResponses": [
    +    {
    +      "answer": "I'm sorry, I'm having trouble connecting to my knowledge base right now. Could you try again in a moment?",
    +      "prompts": [
    +        {
    +          "action_text": "Contact support team",
    +          "action_url": "tel:+44 1223 494 444"
    +        },
    +        {
    +          "action_text": "Submit a support request",
    +          "action_url": "https://www.ebi.ac.uk/about/contact/support/"
    +        }
    +      ]
    +    }
    +  ]
    +}
    +
    +

    API Integration

    +

    Chat Endpoint

    +

    Your chat API should accept POST requests:

    +
    // Request format
    +{
    +  "message": "User's question",
    +  "conversationId": "unique-id",
    +  "context": {
    +    "selectedServices": ["service-1", "service-2"]
    +  }
    +}
    +
    +// Response format
    +{
    +  "response": "Assistant's answer",
    +  "sources": [
    +    {
    +      "title": "Documentation Link",
    +      "url": "https://example.com/docs"
    +    }
    +  ],
    +  "prompts": [
    +    {
    +      "action_text": "Learn More",
    +      "action_url": "https://example.com/learn"
    +    }
    +  ]
    +}
    +
    +

    Custom Welcome Screen

    +
    const config = {
    +  features: {
    +    enable_welcome: true,
    +    enable_welcome_suggestions: true
    +  },
    +  welcome_logo: true,
    +  welcome_message: "Welcome to our AI assistant!",
    +  welcome_suggestions_title: "Popular questions:",
    +  welcome_max_suggestions: 6
    +};
    +
    +

    Source Citations

    +
    const config = {
    +  features: {
    +    enable_sources: true
    +    enable_sources_custom_format: true,
    +  }
    +};
    +
    +// Sources in API response (predefined format)
    +{
    +  "response": "Here's the information...",
    +  "sources": [
    +    {
    +      "title": "Official Documentation", 
    +      "url": "https://docs.example.com",
    +      "description": "Complete guide to the platform"
    +    }
    +  ]
    +}
    +// Sources in API response (custom format)
    +{
    +  "response": "Here's the information...",
    +  "sources": `<nav>
    +    <ul>
    +    <li><a href="#nowhere" title="Lorum ipsum dolor sit amet">Lorem</a></li>
    +    <li><a href="#nowhere" title="Aliquam tincidunt mauris eu risus">Aliquam</a></li>
    +    <li><a href="#nowhere" title="Morbi in sem quis dui placerat ornare">Morbi</a></li>
    +    <li><a href="#nowhere" title="Praesent dapibus, neque id cursus faucibus">Praesent</a></li>
    +    <li><a href="#nowhere" title="Pellentesque fermentum dolor">Pellentesque</a></li>
    +    </ul>
    +  </nav>`
    +}
    +
    +

    Action Prompts

    +
    // Action prompts in API response
    +{
    +  "response": "I can help you with that...",
    +  "prompts": [
    +    {
    +      "action_text": "Start Tutorial",
    +      "action_url": "https://example.com/tutorial"
    +    },
    +    {
    +      "action_text": "Contact Support", 
    +      "action_url": "mailto:support@example.com"
    +    }
    +  ]
    +}
    +
    +

    React

    +

    This component now has React support which has been tested on react version 18.2.0

    +
      +
    1. +

      Install yarn add @visual-framework/vf-chatbot @visual-framework/vf-chatbot-standalone

      +
    2. +
    3. +

      Import in the JS file where you want to include this component

      +
      import VFChatbot from '@visual-framework/vf-chatbot/vf-chatbot.react';
      +
      +Make sure you have the jsx support enabled with babel. Alternatively, you can also copy the vf-chatbot.react.js file from below to your react project and import as per the location.
      +
      +
    4. +
    5. +

      Can be used as

      +
      <VFChatbot config={chatbotConfig} />
      +
      +where chatbotConfig is defined as above. Please make sure to specify paths appended with `${process.env.PUBLIC_URL}`
      +e.g. assistant_avatar: `${process.env.PUBLIC_URL}/assets/vf-chatbot/assets/vf-chatbot--icon-16x16-dark-green.svg`,
      +
      +
    6. +
    7. +

      Styling changes

      +

      You should install vf-sass-starter for the styles and then add below code in your main SCSS file

      +
      $vf-font-plex-mono-prefix: '~@visual-framework/vf-font-plex-mono/assets';
      +$vf-font-plex-sans-prefix: '~@visual-framework/vf-font-plex-sans/assets';
      +
      +@import '~@visual-framework//vf-sass-starter/index.scss';
      +@import "~@visual-framework/vf-link/vf-link.scss";
      +@import "~@visual-framework/vf-chatbot/vf-chatbot.scss";
      +@import "~@visual-framework/vf-chatbot-modal/index.scss";
      +@import "~@visual-framework/vf-chatbot-standalone/index.scss";
      +
      +
    8. +
    9. +

      Usage:

      +
      <VFChatbot config={chatbotConfig} />
      +
      +
    10. +
    + +
    +
    + + + + + + +

    Variants

    + + + +
    + + +
    + + + +
    + +
    +
    +
    + + +
    + + + + +
    + Select up to 3 services + Clear all +
    +
      + +
    +
    + +
    +
    +
    + +
    +
    + + +
    +
    + +

    AI Assistant

    +
    + Welcome! I'm here to help +
    +
    +
    +

    Try asking me:

    +
    + +
    +
    + + + +
    + + +
    + +
    + + +
    +
    +
    +

    Disclaimer: This chatbot is designed to assist you with general information and basic inquiries. See our disclaimer notes.

    + +
    +
    +
    +
    + + +
    +
    + + + +
    + +
    + Review AI generated content for accuracy. Leave feedback. +
    +
    + + + + + + + + + + + + + + +
    +
    + + +
    + + + + +
    + Nunjucks syntax + +

    Depending on your environment you'll want to use render or include. As a rule of thumb: server-side use include, precompiled browser use render. If you're using vf-eleventy you should use include.

    +

    Using include

    +

    You'll need to pass a context object from your code or Yaml file (example), as well as the path to the Nunjucks template. Nunjucks' include is an abstraction of render and provides some additional portability.

    + + +
    
    +{% set context fromYourYamlFile %}
    +- or -
    +{% set context = { 
    +"component-type" : "container",
    +"hide-from-sitemenu" : true,
    +"config" : [object Object],
    +
    + }
    +%}
    +{% include "../path_to/vf-chatbot-standalone/vf-chatbot-standalone.njk" %}
    +                
    +

    Using render

    +

    This approach is best for bare-bones Nunjucks environments, such as precompiled templates with the Nunjucks slim runtime where include is not be available.

    + +
    
    +{% render '@vf-chatbot-standalone', {
    +  "component-type" : "container",
    +  "hide-from-sitemenu" : true,
    +  "config" : [object Object],
    +  }
    +%}
    +                
    +
    + + + + +
    + React syntax + +
    <VFChatbot config={chatbotConfig} />
    +                  
    + +
    + + + + +
    + HTML +
    <!-- Standalone Chatbot -->
    +<div class="vf-content vf-chatbot-standalone-container" data-vf-js-chatbot-standalone-container data-vf-chatbot-config="{&quot;type&quot;:&quot;standalone&quot;,&quot;title&quot;:&quot;AI Assistant&quot;,&quot;welcome_logo&quot;:true,&quot;welcome_message&quot;:&quot;Welcome! I&#39;m here to help&quot;,&quot;welcome_logo_alt&quot;:&quot;AI Assistant&quot;,&quot;welcome_suggestions_title&quot;:&quot;Try asking me:&quot;,&quot;input_placeholder&quot;:&quot;Ask me ...&quot;,&quot;welcome_max_suggestions&quot;:4,&quot;icons&quot;:{&quot;assistant_avatar&quot;:&quot;../../assets/vf-chatbot/assets/vf-chatbot--icon-16x16-dark-green.svg&quot;,&quot;user_avatar&quot;:&quot;../../assets/vf-chatbot/assets/vf-chatbot--avatar-user.svg&quot;,&quot;send_button&quot;:&quot;../../assets/vf-chatbot/assets/vf-chatbot--icon-send.svg&quot;,&quot;main_logo_url&quot;:&quot;../../assets/vf-chatbot/assets/vf-chatbot--icon-32x32-dark-green.svg&quot;},&quot;api&quot;:{&quot;chat_endpoint&quot;:&quot;/api/chat&quot;,&quot;feedback_endpoint&quot;:&quot;/api/feedback&quot;,&quot;qa_data_url&quot;:&quot;../../assets/vf-chatbot/assets/vf-chatbot-qa.json&quot;,&quot;headers&quot;:{&quot;Content-Type&quot;:&quot;application/json&quot;,&quot;Authorization&quot;:&quot;Bearer your-token&quot;},&quot;timeout&quot;:10000},&quot;features&quot;:{&quot;enable_welcome&quot;:true,&quot;enable_feedback&quot;:true,&quot;enable_sources&quot;:true,&quot;enable_sources_custom_format&quot;:true,&quot;enable_welcome_suggestions&quot;:true,&quot;enable_typing_indicator&quot;:true,&quot;enable_disclaimer&quot;:true,&quot;enable_predefined_qa&quot;:true,&quot;enable_fallback_responses&quot;:true,&quot;enable_qa_data_loading&quot;:true,&quot;enable_instant_feedback&quot;:false},&quot;behavior&quot;:{&quot;auto_scroll&quot;:true,&quot;typing_delay&quot;:800,&quot;show_scrollbar&quot;:false},&quot;selectorContext&quot;:{&quot;chatbotRoutes&quot;:{&quot;multiSelect&quot;:true,&quot;maxMultiSelect&quot;:3,&quot;showSearch&quot;:true,&quot;showSearchThreshold&quot;:5,&quot;showAllServices&quot;:true,&quot;showAllServicesSelected&quot;:true,&quot;routes&quot;:&quot;../../assets/vf-chatbot/assets/vf-chatbot-selector-services.json&quot;,&quot;placeholder&quot;:&quot;Select services&quot;,&quot;title&quot;:&quot;Services&quot;,&quot;selector_logo_url&quot;:&quot;../../assets/vf-chatbot/assets/vf-chatbot--icon-24x24-dark-green.svg&quot;,&quot;selector_logo_title&quot;:&quot;AI Assistant&quot;}},&quot;handlers&quot;:{&quot;on_message_send&quot;:&quot;handleMessageSend&quot;,&quot;on_response_receive&quot;:&quot;handleResponseReceive&quot;,&quot;on_feedback_submit&quot;:&quot;handleFeedbackSubmit&quot;,&quot;on_suggestion_click&quot;:&quot;handleSuggestionClick&quot;,&quot;on_error&quot;:&quot;handleError&quot;,&quot;on_conversation_start&quot;:&quot;handleConversationStart&quot;,&quot;on_conversation_end&quot;:&quot;handleConversationEnd&quot;},&quot;disclaimer&quot;:&quot;Disclaimer: This chatbot is designed to assist you with general information and basic inquiries. See our &lt;a class=&#92;&quot;vf-banner__link&#92;&quot; target=&#92;&quot;_blank&#92;&quot; rel=&#92;&quot;noopener noreferrer&#92;&quot; aria-label=&#92;&quot;disclaimer notes (opens in new tab)&#92;&quot; href=&#92;&quot;https://www.ebi.ac.uk/data-protection/privacy-notice/embl-ebi-public-website/&#92;&quot;&gt;disclaimer notes&lt;/a&gt;.&quot;,&quot;footnote&quot;:&quot;Review AI generated content for accuracy. &lt;a class=&#92;&quot;vf-link&#92;&quot; target=&#92;&quot;_blank&#92;&quot; rel=&#92;&quot;noopener noreferrer&#92;&quot; aria-label=&#92;&quot;Leave feedback (opens in new tab)&#92;&quot; href=&#92;&quot;https://embl.service-now.com/esc?id=sc_cat_item&amp;sys_id=5eeb8eb91b92e650b376da88b04bcbc1&#92;&quot;&gt;Leave feedback&lt;/a&gt;.&quot;}">
    +
    +  <div class="vf-chatbot-standalone__header">
    +    <div class="vf-chatbot-standalone__header-left">
    +      <div class="vf-chatbot-selector" data-vf-js-chatbot-selector data-routes-path="../../assets/vf-chatbot/assets/vf-chatbot-selector-services.json" data-multiselect="true" data-max-multiselect="3" data-show-search="true" data-show-all-services="true" data-show-all-services-selected="true">
    +        <button class="vf-chatbot-selector__title" data-vf-js-selector-toggle>
    +          <img src="../../assets/vf-chatbot/assets/vf-chatbot--icon-24x24-dark-green.svg" alt="AI Assistant">
    +          <div class="vf-chatbot-selector__title-content vf-u-margin__left--200">
    +            <span class="vf-chatbot-selector__main-text">AI Assistant</span>
    +            <span class="vf-chatbot-selector__title-text">Services</span>
    +          </div>
    +          <span class="vf-chatbot-selector__chevron">
    +            <svg width="32" height="31" viewBox="0 0 32 31" fill="none" xmlns="http://www.w3.org/2000/svg">
    +              <g clip-path="url(#clip0_3647_8230)">
    +                <path d="M15.999 19.0975C15.7378 19.098 15.479 19.0468 15.2377 18.9468C14.9963 18.8469 14.7771 18.7001 14.5926 18.5151L8.32863 11.9279C8.21951 11.8137 8.13399 11.6791 8.07698 11.5318C8.01998 11.3845 7.99261 11.2274 7.99645 11.0695C8.00028 10.9116 8.03525 10.756 8.09934 10.6117C8.16342 10.4673 8.25537 10.337 8.36992 10.2283C8.48446 10.1195 8.61934 10.0344 8.76683 9.97791C8.91432 9.92139 9.07152 9.89454 9.2294 9.89889C9.38729 9.90325 9.54277 9.93872 9.68692 10.0033C9.83107 10.0678 9.96106 10.1602 10.0694 10.2751L15.7094 16.2143C15.7467 16.2537 15.7916 16.2851 15.8414 16.3066C15.8912 16.3281 15.9448 16.3391 15.999 16.3391C16.0533 16.3391 16.1069 16.3281 16.1567 16.3066C16.2065 16.2851 16.2514 16.2537 16.2886 16.2143L21.9286 10.2751C22.037 10.1602 22.167 10.0678 22.3112 10.0033C22.4553 9.93872 22.6108 9.90325 22.7687 9.89889C22.9266 9.89454 23.0838 9.92139 23.2312 9.97791C23.3787 10.0344 23.5136 10.1195 23.6282 10.2283C23.7427 10.337 23.8347 10.4673 23.8987 10.6117C23.9628 10.756 23.9978 10.9116 24.0016 11.0695C24.0055 11.2274 23.9781 11.3845 23.9211 11.5318C23.8641 11.6791 23.7786 11.8137 23.6694 11.9279L17.439 18.4991C17.2503 18.6888 17.0259 18.8394 16.7788 18.9421C16.5316 19.0448 16.2667 19.0976 15.999 19.0975Z" fill="#707372" />
    +              </g>
    +              <defs>
    +                <clipPath id="clip0_3647_8230">
    +                  <rect width="16" height="16" fill="white" transform="translate(8 6.5)" />
    +                </clipPath>
    +              </defs>
    +            </svg>
    +          </span>
    +        </button>
    +
    +        <div class="vf-chatbot-selector__dropdown" data-vf-js-selector-dropdown>
    +
    +          <div class="vf-chatbot-selector__search">
    +            <label class="vf-u-sr-only" id="vf-chatbot-selector-search-label" for="vf-chatbot-selector-search">Type to search</label>
    +            <input type="text" id="vf-chatbot-selector-search" aria-labelledby="vf-chatbot-selector-search-label" placeholder="Select services" data-vf-js-selector-search>
    +          </div>
    +
    +
    +          <div class="vf-chatbot-selector__header">
    +            <span data-max-select="3">Select up to 3 services</span>
    +            <a href="#" class="vf-chatbot-selector__clear" role="button" data-vf-js-selector-clear>Clear all</a>
    +          </div>
    +          <ul class="vf-chatbot-selector__list" data-vf-js-chatbot-selector-list>
    +            <!-- Routes will be populated dynamically via JavaScript -->
    +          </ul>
    +        </div>
    +
    +      </div>
    +    </div>
    +  </div>
    +
    +  <div class="vf-chatbot-standalone | vf-u-background-color-ui--grey--light vf-u-margin__bottom--400" data-vf-js-chatbot-standalone>
    +    <div class="vf-chatbot-standalone__content" data-vf-js-chatbot-standalone-content>
    +
    +      <!-- Welcome Screen -->
    +      <div role="region" aria-label="Chatbot welcome screen" class="vf-chatbot-welcome" data-vf-js-chatbot-welcome data-max-questions="4" data-enable-qa-data-loading="true" data-enable-predefined-qa="true" data-enable-fallback-responses="true" data-qa-data-url="../../assets/vf-chatbot/assets/vf-chatbot-qa.json">
    +        <div class="vf-chatbot-welcome__content">
    +          <div class="vf-chatbot-welcome__logo">
    +            <img src="../../assets/vf-chatbot/assets/vf-chatbot--icon-32x32-dark-green.svg" alt="AI Assistant">
    +          </div>
    +          <h1 class="vf-chatbot-welcome__title">AI Assistant</h1>
    +          <div class="vf-chatbot-welcome__message">
    +            Welcome! I'm here to help
    +          </div>
    +        </div>
    +        <div class="vf-chatbot-welcome__suggestions">
    +          <p class="vf-chatbot-welcome__suggestions-title vf-u-margin__bottom--200">Try asking me:</p>
    +          <div class="vf-chatbot-welcome__suggestions-grid" data-vf-js-chatbot-welcome-suggestions-grid>
    +            <!-- Suggestions will be populated dynamically from qa.json using the template below -->
    +          </div>
    +        </div>
    +
    +        <!-- Template for welcome suggestions using vf-chatbot-action-prompt -->
    +        <template id="welcome-suggestion-template">
    +          <div class="vf-chatbot-action-prompt">
    +            <a href="#" class="vf-chatbot-action-prompt__link" role="button">
    +
    +            </a>
    +          </div>
    +        </template>
    +      </div>
    +
    +      <!-- Messages Container -->
    +      <div class="vf-chatbot-standalone__messages-no-scrollbar" data-vf-js-chatbot-standalone-messages data-auto-scroll="true">
    +        <!-- Messages will be added here dynamically -->
    +      </div>
    +
    +      <!-- Disclaimer Banner -->
    +      <div class="vf-chatbot-standalone__disclaimer" data-vf-js-chatbot-standalone-disclaimer>
    +        <div class="vf-banner vf-banner--alert vf-banner--info">
    +          <div class="vf-banner__content">
    +            <p class="vf-banner__text">Disclaimer: This chatbot is designed to assist you with general information and basic inquiries. See our <a class="vf-banner__link" target="_blank" rel="noopener noreferrer" aria-label="disclaimer notes (opens in new tab)" href="https://www.ebi.ac.uk/data-protection/privacy-notice/embl-ebi-public-website/">disclaimer notes</a>.</p>
    +            <button role="button" aria-label="close notification banner" class="vf-button vf-button--icon vf-button--dismiss | vf-banner__button">
    +              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
    +                <title>dismiss banner</title>
    +                <path d="M14.3,12.179a.25.25,0,0,1,0-.354l9.263-9.262A1.5,1.5,0,0,0,21.439.442L12.177,9.7a.25.25,0,0,1-.354,0L2.561.442A1.5,1.5,0,0,0,.439,2.563L9.7,11.825a.25.25,0,0,1,0,.354L.439,21.442a1.5,1.5,0,0,0,2.122,2.121L11.823,14.3a.25.25,0,0,1,.354,0l9.262,9.263a1.5,1.5,0,0,0,2.122-2.121Z" />
    +              </svg>
    +            </button>
    +          </div>
    +        </div>
    +      </div>
    +    </div>
    +
    +    <!-- Input Container -->
    +    <div class="vf-chatbot-standalone__input-container">
    +      <div class="vf-chatbot-standalone__input-wrapper">
    +        <label class="vf-u-sr-only" id="vf-chatbot-standalone-input-label" for="vf-chatbot-standalone-input">Ask me</label>
    +        <textarea id="vf-chatbot-standalone-input" aria-labelledby="vf-chatbot-standalone-input-label" class="vf-chatbot-standalone__input vf-form__textarea vf-u-padding__left--400" placeholder="Ask me ..." rows="1" data-vf-js-chatbot-standalone-input></textarea>
    +        <button class="vf-chatbot-standalone__send-button" aria-label="Send message" data-vf-js-chatbot-standalone-send>
    +          <img src="../../assets/vf-chatbot/assets/vf-chatbot--icon-send.svg" alt="Send">
    +        </button>
    +      </div>
    +
    +      <div class="vf-chatbot-standalone__footnote vf-u-margin__top--200" data-vf-js-chatbot-standalone-footnote>
    +        Review AI generated content for accuracy. <a class="vf-link" target="_blank" rel="noopener noreferrer" aria-label="Leave feedback (opens in new tab)" href="https://embl.service-now.com/esc?id=sc_cat_item&sys_id=5eeb8eb91b92e650b376da88b04bcbc1">Leave feedback</a>.
    +      </div>
    +    </div>
    +
    +    <!-- Templates -->
    +    <template id="feedback-positive-template">
    +      <div class="vf-chatbot-feedback__form vf-u-margin__top--400">
    +        <div class="vf-chatbot-feedback__form-content vf-u-padding--400">
    +          <div class="vf-chatbot-feedback__form-content-header">
    +            <div class="vf-chatbot-feedback__title">Tell us more (optional)</div>
    +            <button role="button" class="vf-chatbot-feedback__form-close vf-button vf-button--icon vf-button--dismiss | vf-banner__button" type="button" aria-label="Close feedback form" data-vf-js-feedback-form-close>
    +              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
    +                <title>dismiss banner</title>
    +                <path d="M14.3,12.179a.25.25,0,0,1,0-.354l9.263-9.262A1.5,1.5,0,0,0,21.439.442L12.177,9.7a.25.25,0,0,1-.354,0L2.561.442A1.5,1.5,0,0,0,.439,2.563L9.7,11.825a.25.25,0,0,1,0,.354L.439,21.442a1.5,1.5,0,0,0,2.122,2.121L11.823,14.3a.25.25,0,0,1,.354,0l9.262,9.263a1.5,1.5,0,0,0,2.122-2.121Z" />
    +              </svg>
    +            </button>
    +          </div>
    +          <div class="vf-chatbot-feedback__options">
    +            <button class="vf-chatbot-feedback__option" data-feedback-option="accurate">
    +              Accurate answer
    +            </button>
    +            <button class="vf-chatbot-feedback__option" data-feedback-option="easy">
    +              Easy to understand
    +            </button>
    +            <button class="vf-chatbot-feedback__option" data-feedback-option="formatted">
    +              Well formatted
    +            </button>
    +            <button class="vf-chatbot-feedback__option" data-feedback-option="helpful">
    +              Helpful
    +            </button>
    +          </div>
    +          <label id="vf-chatbot-feedback-comment-title" for="vf-chatbot-feedback-comment" class="vf-chatbot-feedback__comment-title">Comments</label>
    +          <textarea id="vf-chatbot-feedback-comment" aria-labelledby="vf-chatbot-feedback-comment-title" class="vf-chatbot-feedback__comment" rows="4"></textarea>
    +          <button type="submit" class="vf-chatbot-feedback__submit vf-u-padding--200" data-vf-js-feedback-submit>
    +            Submit
    +          </button>
    +        </div>
    +      </div>
    +    </template>
    +    <template id="feedback-negative-template">
    +      <div class="vf-chatbot-feedback__form vf-u-margin__top--400">
    +        <div class="vf-chatbot-feedback__form-content vf-u-padding--400">
    +          <div class="vf-chatbot-feedback__form-content-header">
    +            <div class="vf-chatbot-feedback__title">Tell us more (optional)</div>
    +            <button role="button" class="vf-chatbot-feedback__form-close vf-button vf-button--icon vf-button--dismiss | vf-banner__button" type="button" aria-label="Close feedback form" data-vf-js-feedback-form-close>
    +              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
    +                <title>dismiss banner</title>
    +                <path d="M14.3,12.179a.25.25,0,0,1,0-.354l9.263-9.262A1.5,1.5,0,0,0,21.439.442L12.177,9.7a.25.25,0,0,1-.354,0L2.561.442A1.5,1.5,0,0,0,.439,2.563L9.7,11.825a.25.25,0,0,1,0,.354L.439,21.442a1.5,1.5,0,0,0,2.122,2.121L11.823,14.3a.25.25,0,0,1,.354,0l9.262,9.263a1.5,1.5,0,0,0,2.122-2.121Z" />
    +              </svg>
    +            </button>
    +          </div>
    +          <div class="vf-chatbot-feedback__options">
    +            <button class="vf-chatbot-feedback__option" data-feedback-option="inaccurate">
    +              Inaccurate answer
    +            </button>
    +            <button class="vf-chatbot-feedback__option" data-feedback-option="nocontext">
    +              Did not use context
    +            </button>
    +            <button class="vf-chatbot-feedback__option" data-feedback-option="poorformat">
    +              Poorly formatted
    +            </button>
    +            <button class="vf-chatbot-feedback__option" data-feedback-option="nothelpful">
    +              Not helpful
    +            </button>
    +          </div>
    +          <label id="vf-chatbot-feedback-comment-title" for="vf-chatbot-feedback-comment" class="vf-chatbot-feedback__comment-title">Comments</label>
    +          <textarea id="vf-chatbot-feedback-comment" aria-labelledby="vf-chatbot-feedback-comment-title" class="vf-chatbot-feedback__comment" rows="4"></textarea>
    +          <button type="submit" class="vf-chatbot-feedback__submit vf-u-padding--200" data-vf-js-feedback-submit>
    +            Submit
    +          </button>
    +        </div>
    +      </div>
    +    </template>
    +
    +    <template id="user-message-template">
    +      <div class="vf-chatbot-message vf-chatbot-message--user  vf-u-margin__top--400">
    +        <div class="vf-chatbot-message__avatar vf-u-margin__bottom--200">
    +          <span class="vf-chatbot-message__avatar-name">You</span>
    +          <img src="../../assets/vf-chatbot/assets/vf-chatbot--avatar-user.svg" alt="You">
    +        </div>
    +        <div class="vf-chatbot-message__content vf-u-padding--200">
    +          <div class="vf-chatbot-message__content-prompt vf-u-padding__left--200  vf-u-padding__right--200">
    +            Hello!
    +          </div>
    +        </div>
    +      </div>
    +    </template>
    +
    +    <template id="assistant-message-template">
    +      <div class="vf-chatbot-message vf-chatbot-message--assistant  vf-u-margin__top--400">
    +        <div class="vf-chatbot-message__avatar vf-u-margin__bottom--200">
    +          <img src="../../assets/vf-chatbot/assets/vf-chatbot--icon-16x16-dark-green.svg" alt="AI Assistant">
    +          <span class="vf-chatbot-message__avatar-name">AI Assistant</span>
    +        </div>
    +        <div class="vf-chatbot-message__content vf-u-padding--200">
    +          <div class="vf-chatbot-message__content-prompt vf-u-padding__left--200  vf-u-padding__right--200">
    +            How can I help you?
    +          </div>
    +        </div>
    +      </div>
    +      <div class="vf-chatbot-feedback vf-u-margin__top--200" data-vf-js-chatbot-feedback></div>
    +    </template>
    +
    +    <template id="loading-indicator-template">
    +      <div class="vf-chatbot-message vf-chatbot-message--assistant vf-chatbot-message--loading  vf-u-margin__top--400">
    +        <div class="vf-chatbot-message__avatar vf-u-margin__bottom--200">
    +          <img src="../../assets/vf-chatbot/assets/vf-chatbot--icon-16x16-dark-green.svg" alt="AI Assistant">
    +          <span class="vf-chatbot-message__avatar-name">AI Assistant</span>
    +        </div>
    +        <div class="vf-chatbot-message__content vf-u-padding--200">
    +          <div class="vf-chatbot-message__content-loading-dots" aria-label="Loading" role="status">
    +            <span class="vf-chatbot-message__dot"></span>
    +            <span class="vf-chatbot-message__dot"></span>
    +            <span class="vf-chatbot-message__dot"></span>
    +          </div>
    +        </div>
    +      </div>
    +    </template>
    +
    +    <template id="action-prompts-template">
    +      <div class="vf-chatbot-action-prompts vf-u-margin__top--400">
    +        <div class="vf-chatbot-action-prompts__list" data-vf-js-action-prompts-list>
    +          <!-- Individual prompts will be populated here -->
    +        </div>
    +      </div>
    +    </template>
    +
    +    <template id="single-action-prompt-template">
    +      <div class="vf-chatbot-action-prompt">
    +        <a href="#" class="vf-chatbot-action-prompt__link" role="button">
    +
    +        </a>
    +      </div>
    +    </template>
    +  </div>
    +</div>
    +              
    +
    +
    + + + +

    Examples

    + + + + + +
    +

    Changelog

    +
    +Changelog +

    Changelog

    +

    1.0.0-beta.4

    +
      +
    • Updated : Standalone variant initialization moved to vf-chatbot component
    • +
    • Updated : Added more config options
    • +
    • Updated : Changes for chatbot modal variant
    • +
    • Fixed: Added code to return feedback comments
    • +
    • Added : React support Tracking issue
    • +
    +

    1.0.0-beta.3

    +
      +
    • Version bump
    • +
    +

    1.0.0-beta.2

    +
      +
    • Updated package.json with correct settings
    • +
    +

    1.0.0-beta.1

    +
      +
    • Initial version
    • +
    • Auto-resizing textarea (1-5 rows with scroll)
    • +
    • Configurable Q&A data loading with fallback responses
    • +
    • Enhanced accessibility
    • +
    • Comprehensive event handling system
    • +
    +
    +
    +

    Assets

    + + + + + +
    +
    +

    +File system location: components/vf-chatbot-standalone +

    + + + + \ No newline at end of file diff --git a/src/app/components/vf-chatbot-welcome.angular/.DS_Store b/src/app/components/vf-chatbot-welcome.angular/.DS_Store new file mode 100644 index 0000000..eb674e5 Binary files /dev/null and b/src/app/components/vf-chatbot-welcome.angular/.DS_Store differ diff --git a/src/app/components/vf-chatbot-welcome.angular/vf-chatbot-welcome.angular.component.spec.ts b/src/app/components/vf-chatbot-welcome.angular/vf-chatbot-welcome.angular.component.spec.ts new file mode 100644 index 0000000..4d74a78 --- /dev/null +++ b/src/app/components/vf-chatbot-welcome.angular/vf-chatbot-welcome.angular.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { VfChatbotWelcomeAngularComponent } from './vf-chatbot-welcome.angular.component'; + +describe('VfChatbotWelcomeAngularComponent', () => { + let component: VfChatbotWelcomeAngularComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [VfChatbotWelcomeAngularComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(VfChatbotWelcomeAngularComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/vf-chatbot-welcome.angular/vf-chatbot-welcome.angular.component.ts b/src/app/components/vf-chatbot-welcome.angular/vf-chatbot-welcome.angular.component.ts new file mode 100644 index 0000000..a89ee65 --- /dev/null +++ b/src/app/components/vf-chatbot-welcome.angular/vf-chatbot-welcome.angular.component.ts @@ -0,0 +1,96 @@ +import { Component, ElementRef, Input, AfterViewInit, ViewChild } from '@angular/core'; + + +@Component({ + selector: 'vf-chatbot-welcome', + template: ` +
    +
    + + +

    + {{ welcome_title }} +

    + +
    + {{ welcome_message }} +
    +
    + +
    +

    + {{ welcome_suggestions_title }} +

    + +
    +
    + + +
    + `, + styles: [` + .vf-chatbot-welcome { display: block; } + .vf-chatbot-welcome__logo { text-align: center; margin-bottom: 1rem; } + .vf-chatbot-welcome__logo-image { max-width: 64px; height: auto; } + `] +}) +export class VfChatbotWelcomeAngularComponent implements AfterViewInit { + @Input() qaData: any[] = []; + @Input() welcome_logo = false; + @Input() welcome_logo_url = ''; + @Input() welcome_logo_alt = 'AI Assistant'; + @Input() welcome_title = ''; + @Input() welcome_message = ''; + @Input() welcome_suggestions_title = ''; + @Input() enable_welcome_suggestions = false; + @Input() welcome_max_suggestions = 4; + @Input() enable_qa_data_loading = true; + @Input() enable_predefined_qa = true; + @Input() enable_fallback_responses = true; + @Input() qa_data_url = ''; + + @ViewChild('welcomeRef', { static: true }) welcomeRef!: ElementRef; + @ViewChild('templateRef', { static: true }) templateRef!: ElementRef; + + ngAfterViewInit(): void { + // Initialize chatbot welcome + + + // Render the action prompt template + if (this.templateRef?.nativeElement) { + const el = this.templateRef.nativeElement as HTMLElement; + el.innerHTML = ` +
    + +
    + `; + } + } +} + +export * from './vf-chatbot-welcome.angular.module'; diff --git a/src/app/components/vf-chatbot-welcome.angular/vf-chatbot-welcome.angular.module.ts b/src/app/components/vf-chatbot-welcome.angular/vf-chatbot-welcome.angular.module.ts new file mode 100644 index 0000000..4b91cb2 --- /dev/null +++ b/src/app/components/vf-chatbot-welcome.angular/vf-chatbot-welcome.angular.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { VfChatbotWelcomeAngularComponent } from './vf-chatbot-welcome.angular.component'; +import { VfChatbotActionPromptAngularModule } from '../vf-chatbot-action-prompt/vf-chatbot-action-prompt.angular.module'; + +@NgModule({ + declarations: [ + VfChatbotWelcomeAngularComponent + ], + imports: [ + CommonModule, + FormsModule, + VfChatbotActionPromptAngularModule + ], + exports: [ + VfChatbotWelcomeAngularComponent + ] +}) +export class VfChatbotWelcomeAngularModule { } diff --git a/src/app/components/vf-chatbot-welcome.angular/vf-chatbot-welcome.js b/src/app/components/vf-chatbot-welcome.angular/vf-chatbot-welcome.js new file mode 100644 index 0000000..952693f --- /dev/null +++ b/src/app/components/vf-chatbot-welcome.angular/vf-chatbot-welcome.js @@ -0,0 +1,263 @@ +// vf-chatbot-welcome.js + +export class VFChatbotWelcome { + constructor(element, options = {}) { + this.el = element; + this.suggestionsGrid = this.el.querySelector( + "[data-vf-js-chatbot-welcome-suggestions-grid]" + ); + this.qaData = null; + this.predefinedQA = null; + this.fallbackResponses = null; + this.boundHandleSuggestionClick = this.handleSuggestionClick.bind(this); + + // Configuration from data attributes with fallbacks + this.config = { + welcome_max_suggestions: + options.welcome_max_suggestions || + parseInt(this.el.dataset.maxQuestions, 10) || + 4, + enable_qa_data_loading: + options.enable_qa_data_loading !== undefined + ? options.enable_qa_data_loading + : this.el.dataset.enableQaDataLoading !== "false", + enable_predefined_qa: + options.enable_predefined_qa !== undefined + ? options.enable_predefined_qa + : this.el.dataset.enablePredefinedQa !== "false", + enable_fallback_responses: + options.enable_fallback_responses !== undefined + ? options.enable_fallback_responses + : this.el.dataset.enableFallbackResponses !== "false", + qa_data_url: + this.el.dataset.qaDataUrl + }; + this.init(); + } + + async init() { + try { + await this.loadQAData(); + this.populateSuggestions(); + this.bindEvents(); + return Promise.resolve(); + } catch (error) { + console.error("Failed to initialize welcome component:", error); + return Promise.reject(error); + } + } + + async loadQAData() { + // If Q&A data loading is disabled, don't load any data + if (!this.config.enable_qa_data_loading) { + console.log("Q&A data loading disabled for welcome component"); + return; + } + + // Check if qa_data_url is provided + if (!this.config.qa_data_url) { + console.warn("No Q&A data URL provided for welcome component"); + return; + } + + try { + console.log(`Loading Q&A data from: ${this.config.qa_data_url}`); + const response = await fetch(this.config.qa_data_url); + + if (!response.ok) { + throw new Error( + `Failed to fetch Q&A data: ${response.status} ${response.statusText}` + ); + } + + const data = await response.json(); + this.qaData = data; + + // Store predefined Q&A if enabled + if (this.config.enable_predefined_qa && data.predefinedQA) { + this.predefinedQA = data.predefinedQA; + console.log("Predefined Q&A loaded successfully"); + } + + // Store fallback responses if enabled + if ( + this.config.enable_fallback_responses && + data.fallbackResponses && + data.fallbackResponses.length > 0 + ) { + this.fallbackResponses = data.fallbackResponses; + console.log("Fallback responses loaded successfully"); + } + } catch (error) { + console.error("Failed to load Q&A data:", error); + // Provide default fallback responses if loading fails + this.setDefaultFallbackResponses(); + } + } + + setDefaultFallbackResponses() { + if (this.config.enable_fallback_responses) { + this.fallbackResponses = [ + { + answer: + "I'm here to help with your questions. Please try asking about our services or general information.", + sources: [], + prompts: [ + "What services do you offer?", + "How can I get started?", + "Tell me more about your organization" + ] + }, + { + answer: + "I'm an AI assistant designed to help with information and basic inquiries. How can I assist you today?", + sources: [], + prompts: [ + "What can you help me with?", + "How do I contact support?", + "Where can I find more information?" + ] + } + ]; + console.log("Using default fallback responses for welcome component"); + } + } + + populateSuggestions() { + if (!this.suggestionsGrid) return; + + // Clear existing suggestions + this.suggestionsGrid.innerHTML = ""; + + let questionsToShow = []; + + // Try to get questions from predefined Q&A first + if (this.config.enable_predefined_qa && this.predefinedQA) { + questionsToShow = Object.keys(this.predefinedQA); + } + // If no predefined Q&A, try to get prompts from fallback responses + else if (this.config.enable_fallback_responses && this.fallbackResponses) { + questionsToShow = this.fallbackResponses + .filter(response => response.prompts && response.prompts.length > 0) + .flatMap(response => response.prompts); + } + + // If we still don't have questions, show a default message + if (questionsToShow.length === 0) { + console.log("No questions available for welcome suggestions"); + return; + } + + // Get random questions + const randomQuestions = questionsToShow + .sort(() => 0.5 - Math.random()) + .slice(0, this.config.welcome_max_suggestions); + + // Create suggestion elements using template-based rendering + randomQuestions.forEach((question) => { + const suggestionTemplate = document.querySelector( + "#welcome-suggestion-template" + ); + if (suggestionTemplate) { + const suggestionEl = suggestionTemplate.content.cloneNode(true); + const link = suggestionEl.querySelector( + ".vf-chatbot-action-prompt__link" + ); + const wrapper = suggestionEl.querySelector(".vf-chatbot-action-prompt"); + + if (link && wrapper) { + link.textContent = question; + wrapper.setAttribute( + "data-vf-js-chatbot-welcome-suggestion", + question + ); + + this.suggestionsGrid.appendChild(suggestionEl); + } + } else { + console.warn("Welcome suggestion template not found"); + } + }); + } + + bindEvents() { + // Remove existing event listener if any + this.suggestionsGrid?.removeEventListener( + "click", + this.boundHandleSuggestionClick + ); + + // Add single event listener using event delegation + this.suggestionsGrid?.addEventListener( + "click", + this.boundHandleSuggestionClick + ); + } + + handleSuggestionClick(e) { + e.preventDefault(); + + const suggestionEl = e.target.closest( + "[data-vf-js-chatbot-welcome-suggestion]" + ); + if (!suggestionEl) return; + + const question = suggestionEl.getAttribute( + "data-vf-js-chatbot-welcome-suggestion" + ); + if (!question) return; + + // Get answer data from predefined Q&A or fallback responses + let answerData = null; + + // First try predefined Q&A + if ( + this.config.enable_predefined_qa && + this.predefinedQA && + this.predefinedQA[question] + ) { + answerData = this.predefinedQA[question]; + } + // If not found in predefined Q&A, try to find in fallback responses + else if (this.config.enable_fallback_responses && this.fallbackResponses) { + const fallbackResponse = this.fallbackResponses.find( + response => response.prompts && response.prompts.includes(question) + ); + if (fallbackResponse) { + answerData = fallbackResponse; + } + } + + // If still no answer data, provide a default response + if (!answerData) { + answerData = { + answer: + "I'm here to help with your questions. Please try asking about our services or general information.", + sources: [], + prompts: [ + "What services do you offer?", + "How can I get started?", + "Tell me more about your organization" + ] + }; + } + + // Dispatch event only once + this.el.dispatchEvent( + new CustomEvent("vf-chatbot-welcome:suggestion-click", { + bubbles: true, + detail: { + question, + answer: answerData.answer || "", + sources: answerData.sources || [], + prompts: answerData.prompts || [] + } + }) + ); + } +} + +// Initialize +export function initVFChatbotWelcome(element) { + return new VFChatbotWelcome(element); +} diff --git a/src/app/components/vf-chatbot/vf-chatbot.angular.component.html b/src/app/components/vf-chatbot/vf-chatbot.angular.component.html new file mode 100644 index 0000000..2c96bb1 --- /dev/null +++ b/src/app/components/vf-chatbot/vf-chatbot.angular.component.html @@ -0,0 +1,128 @@ +
    +
    +
    +
    +

    + Chatbot + container +

    +

    + The vf-chatbot wrapper lets the app switch between modal and standalone chatbot experiences using the shared Angular subcomponents. +

    +

    + + github location + +

    +
    +
    +
    +
    +
    +

    Usage

    +
    +
    + +

    Why a chatbot

    +

    While bots can be a solution to some business challenges, ensure that it is the right solution before implementing it. Consider the following:

    +
      +
    • Will it solve a validated user problem?
    • +
    • Are there more efficient alternatives?
    • +
    • What are the potential cons or drawbacks if a chatbot is added to the process?
    • +
    • How will this be maintained and updated in the future?
    • +
    +

    Deciding between modal vs. standalone

    +

    The chatbot standalone and chatbot modal are two distinct variants for delivering conversational interfaces. Choose between them based on use case needs and task complexity.

    +

    Modal

    +
      +
    • For in-context support (e.g. help with current page or workflow)
    • +
    • Access point is via a floating action button on the page
    • +
    • Supports simple tasks such as getting information
    • +
    +

    Standalone

    +
      +
    • Suitable for exploratory or focused workflows (e.g. discovering genetic variants)
    • +
    • Launched via a link (such as "Talk to our AI chat assistant")
    • +
    • Supports more complex tasks that benefit from expanded engagement
    • +
    +

    Anatomy

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ElementDescription
    Title barShows the chatbot name, minimise button and close button. The title bar may include a dropdown for selecting categories.
    Dialogue sectionScrollable chat window showing the conversation log.
    Intro messageA brief onboarding message explaining the purpose and capabilities of the chatbot. Shows the icon, title and short message.
    BannerUsed to show optional disclaimers or alerts (Max. 3 lines of text). For cases that require user consent, use a blur overlay on the background or a pre-access popup instead, as banners may be missed.
    Text input areaOpen input field for typing and sending queries. Expands up to 5 lines, after which it becomes scrollable.
    +

    Flows

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FlowDetails
    Suggested promptsAppear on the initial screen. Provide a quick start to users with clickable queries. They help to provide context on the type of questions the user can ask on the platform. (Max. 60 characters)
    Closing the chat dialogueClicking on the close icon "X" triggers a confirmation prompt to prevent accidental loss of the chat log.
    Error managementIf the chatbot is unable to provide a response to the query, display a clear error message and provide an alternative way for them to get their answers.
    LinksDisplayed in a clear underlined style. They can be shown inline or as a list.
    Source attributionChips are shown in relevant paragraphs which cite the sources. Links to the sources and more details can be accessed via a "View sources" button.
    Feedback on a query levelUsers can assess the AI responses with a thumbs up/thumbs down or optional close/open response fields to give more details.
    Category selectionA dropdown in the title bar lets users switch focus areas (e.g LLM version or data source). Single or multi-selection variants can be used depending on the use case.
    +

    Visual branding elements and content

    +

    The Chatbot branding elements follow EMBL brand guidelines but can be updated to suit your use case. For advice on branding updates please contact the EMBL Communications Team.

    +

    Texts shown in the examples are placeholder content. Please review and update all wording to fit your your project needs and ensure it meets legal, accessibility and organisational requirements.

    +

    Accessibility

    +

    The component targets WCAG 2.1 AA accessibility standard.

    +
    + +
    +
    +
    +
    diff --git a/src/app/components/vf-chatbot/vf-chatbot.angular.component.ts b/src/app/components/vf-chatbot/vf-chatbot.angular.component.ts new file mode 100644 index 0000000..441e807 --- /dev/null +++ b/src/app/components/vf-chatbot/vf-chatbot.angular.component.ts @@ -0,0 +1,353 @@ +import { AfterViewInit, Component, ElementRef, Inject, Input, Renderer2 } from '@angular/core'; +import { DOCUMENT } from '@angular/common'; + +export type VfChatbotMode = 'modal' | 'standalone'; + +export interface VfChatbotConfig { + type?: VfChatbotMode; + title?: string; + welcome_logo?: boolean; + welcome_message?: string; + welcome_logo_alt?: string; + welcome_suggestions_title?: string; + input_placeholder?: string; + welcome_max_suggestions?: number; + disclaimer?: string; + footnote?: string; + icons?: { + assistant_avatar?: string; + user_avatar?: string; + send_button?: string; + minimize?: string; + close?: string; + main_logo_url?: string; + }; + selectorContext?: unknown; + features?: { + enable_welcome?: boolean; + enable_welcome_suggestions?: boolean; + enable_qa_data_loading?: boolean; + enable_predefined_qa?: boolean; + enable_fallback_responses?: boolean; + enable_feedback?: boolean; + enable_disclaimer?: boolean; + enable_typing_indicator?: boolean; + }; + behavior?: { + show_scrollbar?: boolean; + auto_scroll?: boolean; + }; + api?: { + qa_data_url?: string; + }; + onDismissDisclaimer?: () => void; +} + +@Component({ + selector: 'vf-chatbot', + template: ` + + + +
    + + + +
    +
    + `, +}) +export class VfChatbotAngularComponent implements AfterViewInit { + @Input() config: any = { type: 'modal' }; + @Input() qaData: any[] = []; + @Input() messages: any[] = []; + @Input() sources: any[] = []; + @Input() prompts: any[] = []; + @Input() notificationCount = 0; + + isOpen = false; + dialogTitle = 'Close chat and delete conversation?'; + dialogMessage = 'Are you sure you want to close the chat?
    Your current conversation history will be permanently deleted.'; + dialogCancelLabel = 'Keep chat open'; + dialogConfirmLabel = 'Close and delete'; + + private loadedScripts = new Set(); + + constructor( + private renderer: Renderer2, + private elementRef: ElementRef, + @Inject(DOCUMENT) private document: Document + ) {} + + async ngAfterViewInit(): Promise { + if (this.config?.type !== 'modal') { + return; + } + + await this.loadModalScripts(); + + const initVFChatbot = (window as any).initVFChatbot; + if (typeof initVFChatbot === 'function') { + initVFChatbot(this.config); + } + } + + private async loadModalScripts(): Promise { + const moduleScripts = [ + '/assets/vf-chatbot-fab/vf-chatbot-fab.js', + '/assets/vf-chatbot-dialog/vf-chatbot-dialog.js', + '/assets/vf-chatbot-feedback/vf-chatbot-feedback.js', + '/assets/vf-chatbot-selector/vf-chatbot-selector.js', + '/assets/vf-chatbot-sources/vf-chatbot-sources.js', + '/assets/vf-chatbot-welcome/vf-chatbot-welcome.js' + ]; + + const moduleScriptsWithDependencies = [ + '/assets/vf-chatbot-standalone/vf-chatbot-standalone.js', + '/assets/vf-chatbot-modal/vf-chatbot-modal.js', + '/assets/vf-chatbot/vf-chatbot.js' + ]; + + for (const scriptSrc of moduleScripts) { + await this.loadSingleScript(scriptSrc); + } + + for (const scriptSrc of moduleScriptsWithDependencies) { + await this.loadSingleScript(scriptSrc); + } + } + + private async loadSingleScript(src: string): Promise { + if (this.loadedScripts.has(src)) { + return; + } + + try { + await import(/* webpackIgnore: true */ src); + this.loadedScripts.add(src); + return; + } catch { + // Fall through to the script tag loader. + } + + await new Promise((resolve) => { + const existingScript = this.document.querySelector(`script[src="${src}"]`); + if (existingScript) { + this.loadedScripts.add(src); + resolve(); + return; + } + + const script = this.renderer.createElement('script'); + script.type = 'module'; + script.src = src; + script.async = true; + script.onload = () => { + this.loadedScripts.add(src); + resolve(); + }; + script.onerror = () => { + this.loadedScripts.add(`${src}_failed`); + resolve(); + }; + + this.renderer.appendChild(this.document.head, script); + }); + } + + openChat(): void { + this.isOpen = true; + } + + closeChat(): void { + this.isOpen = false; + } + + get modalConfigJson(): string { + return JSON.stringify(this.config || {}); + } +} diff --git a/src/app/components/vf-chatbot/vf-chatbot.angular.module.ts b/src/app/components/vf-chatbot/vf-chatbot.angular.module.ts new file mode 100644 index 0000000..a96a715 --- /dev/null +++ b/src/app/components/vf-chatbot/vf-chatbot.angular.module.ts @@ -0,0 +1,30 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { VfChatbotAngularComponent } from './vf-chatbot.angular.component'; +import { VfChatbotFabAngularModule } from '../vf-chatbot-fab/vf-chatbot-fab.angular.module'; +import { VfChatbotStandaloneAngularModule } from '../vf-chatbot-standalone/vf-chatbot-standalone.angular.module'; +import { VfChatbotSelectorAngularModule } from '../vf-chatbot-selector/vf-chatbot-selector.angular.module'; +import { VfChatbotWelcomeAngularModule } from '../vf-chatbot-welcome.angular/vf-chatbot-welcome.angular.module'; +import { VfChatbotPromptAngularModule } from '../vf-chatbot-prompt/vf-chatbot-prompt.angular.module'; +import { VfChatbotDialogAngularModule } from '../vf-chatbot-dialog/vf-chatbot-dialog.angular.module'; + +@NgModule({ + declarations: [ + VfChatbotAngularComponent + ], + imports: [ + CommonModule, + FormsModule, + VfChatbotFabAngularModule, + VfChatbotSelectorAngularModule, + VfChatbotWelcomeAngularModule, + VfChatbotPromptAngularModule, + VfChatbotDialogAngularModule, + VfChatbotStandaloneAngularModule + ], + exports: [ + VfChatbotAngularComponent + ] +}) +export class VfChatbotAngularModule { } diff --git a/src/app/components/vf-chatbot/vf-chatbot.component.ts b/src/app/components/vf-chatbot/vf-chatbot.component.ts new file mode 100644 index 0000000..15c48b8 --- /dev/null +++ b/src/app/components/vf-chatbot/vf-chatbot.component.ts @@ -0,0 +1,46 @@ +import { Component } from '@angular/core'; +import { VfChatbotConfig } from './vf-chatbot.angular.component'; + +@Component({ + selector: 'app-vf-chatbot', + templateUrl: './vf-chatbot.angular.component.html' +}) +export class VfChatbotComponent { + public chatbotConfig: VfChatbotConfig = { + type: 'standalone', + title: 'Visual Framework Assistant', + welcome_logo: true, + welcome_message: "Welcome! I'm here to help with Visual Framework components.", + welcome_logo_alt: 'Visual Framework Assistant', + welcome_suggestions_title: 'Try asking me:', + input_placeholder: 'Ask a question...', + welcome_max_suggestions: 4, + disclaimer: 'This demo chatbot is for internal component testing and UI exploration.', + footnote: 'Review generated responses before using them in production.', + icons: { + assistant_avatar: './assets/vf-chatbot/assets/vf-chatbot--icon-16x16-dark-green.svg', + user_avatar: './assets/vf-chatbot/assets/vf-chatbot--avatar-user.svg', + send_button: './assets/vf-chatbot/assets/vf-chatbot--icon-send.svg', + minimize: './assets/vf-chatbot/assets/vf-chatbot--icon-minimize.svg', + close: './assets/vf-chatbot/assets/vf-chatbot--icon-close.svg', + main_logo_url: './assets/vf-chatbot/assets/vf-chatbot--icon-32x32-dark-green.svg' + }, + features: { + enable_welcome: true, + enable_welcome_suggestions: true, + enable_qa_data_loading: true, + enable_predefined_qa: true, + enable_fallback_responses: true, + enable_feedback: true, + enable_disclaimer: true, + enable_typing_indicator: true + }, + behavior: { + show_scrollbar: true, + auto_scroll: true + }, + api: { + qa_data_url: './assets/vf-chatbot/assets/vf-chatbot-qa.json' + } + }; +} diff --git a/src/app/components/vf-components.module.ts b/src/app/components/vf-components.module.ts index 9bc036f..04452c0 100644 --- a/src/app/components/vf-components.module.ts +++ b/src/app/components/vf-components.module.ts @@ -22,6 +22,9 @@ import { VfHeroComponent } from './vf-hero/vf-hero.component'; import { VfTabsAngularModule } from '@visual-framework/vf-tabs/vf-tabs.angular'; import { VfTabsComponent } from './vf-tabs/vf-tabs.component'; +import { VfChatbotAngularModule } from './vf-chatbot/vf-chatbot.angular.module'; +import { VfChatbotComponent } from './vf-chatbot/vf-chatbot.component'; +import { VfChatbotStandalonePageComponent } from './vf-chatbot-standalone/vf-chatbot-standalone.angular.component'; // import other components here @NgModule({ @@ -31,6 +34,8 @@ import { VfTabsComponent } from './vf-tabs/vf-tabs.component'; VfBadgeComponent, VfBlockquoteComponent, VfButtonComponent, + VfChatbotComponent, + VfChatbotStandalonePageComponent, VfHeroComponent, VfTabsComponent, // declare other components here, @@ -42,8 +47,9 @@ import { VfTabsComponent } from './vf-tabs/vf-tabs.component'; VfBadgeAngularModule, VfBlockquoteAngularModule, VfButtonAngularModule, + VfChatbotAngularModule, VfHeroAngularModule, - VfTabsAngularModule, + VfTabsAngularModule ], exports: [ VfBackToTopComponent, @@ -58,8 +64,9 @@ import { VfTabsComponent } from './vf-tabs/vf-tabs.component'; VfBadgeAngularModule, VfBlockquoteAngularModule, VfButtonAngularModule, + VfChatbotAngularModule, VfHeroAngularModule, - VfTabsAngularModule, + VfTabsAngularModule ] }) -export class VfComponentsModule { } \ No newline at end of file +export class VfComponentsModule { } diff --git a/src/assets/vf-chatbot-dialog/vf-chatbot-dialog.js b/src/assets/vf-chatbot-dialog/vf-chatbot-dialog.js new file mode 100644 index 0000000..0a34783 --- /dev/null +++ b/src/assets/vf-chatbot-dialog/vf-chatbot-dialog.js @@ -0,0 +1,39 @@ +export class VFChatbotDialog { + constructor(element) { + this.el = element; + this.cancelBtn = this.el.querySelector("[data-vf-js-dialog-cancel]"); + this.confirmBtn = this.el.querySelector("[data-vf-js-dialog-confirm]"); + this.closeBtn = this.el.querySelector("[data-vf-js-dialog-close]"); + + this.bindEvents(); + } + + bindEvents() { + this.cancelBtn?.addEventListener("click", () => { + this.hide(); + this.el.dispatchEvent(new CustomEvent("vf-chatbot-dialog:cancel")); + }); + + this.confirmBtn?.addEventListener("click", () => { + this.hide(); + this.el.dispatchEvent(new CustomEvent("vf-chatbot-dialog:confirm")); + }); + + this.closeBtn?.addEventListener("click", () => { + this.hide(); + this.el.dispatchEvent(new CustomEvent("vf-chatbot-dialog:cancel")); + }); + } + + show() { + this.el.style.display = "flex"; + } + + hide() { + this.el.style.display = "none"; + } +} + +export function initVFChatbotDialog(element) { + return new VFChatbotDialog(element); +} diff --git a/src/assets/vf-chatbot-fab/vf-chatbot-fab.js b/src/assets/vf-chatbot-fab/vf-chatbot-fab.js new file mode 100644 index 0000000..f1236e0 --- /dev/null +++ b/src/assets/vf-chatbot-fab/vf-chatbot-fab.js @@ -0,0 +1,49 @@ +// vf-chatbot-fab + +function VFChatbotFab(element) { + this.el = element; + this.chatIcon = this.el.querySelector(".vf-chatbot-fab__icon--chat"); + + this.init(); +} + +VFChatbotFab.prototype = { + init: function() { + this.addEventListeners(); + }, + + addEventListeners: function() { + this.el.addEventListener("click", () => { + this.toggleState(); + }); + }, + + toggleState: function() { + this.el.classList.toggle("vf-chatbot-fab--inactive"); + + // Dispatch event for parent chatbot component + this.el.dispatchEvent( + new CustomEvent("vf-chatbot-fab:toggle", { + bubbles: true, + detail: { + isActive: this.el.classList.contains("vf-chatbot-fab--inactive") + } + }) + ); + } +}; + +function initVFChatbotFab() { + const elements = document.querySelectorAll("[data-vf-js-chatbot-fab]"); + for (let i = 0; i < elements.length; i++) { + new VFChatbotFab(elements[i]); + } +} + +// Global exposure +if (typeof window !== "undefined") { + window.VFChatbotFab = VFChatbotFab; + window.initVFChatbotFab = initVFChatbotFab; +} + +export { VFChatbotFab, initVFChatbotFab }; diff --git a/src/assets/vf-chatbot-feedback/vf-chatbot-feedback.js b/src/assets/vf-chatbot-feedback/vf-chatbot-feedback.js new file mode 100644 index 0000000..94dde00 --- /dev/null +++ b/src/assets/vf-chatbot-feedback/vf-chatbot-feedback.js @@ -0,0 +1,302 @@ +export class VFChatbotFeedback { + constructor(container, messageId, config = {}) { + this.container = container; + this.messageId = messageId; + this.config = { + enable_instant_feedback: false, + api_endpoint: null, + ...config + }; + this.positiveTemplate = document.querySelector( + "#feedback-positive-template" + ); + this.negativeTemplate = document.querySelector( + "#feedback-negative-template" + ); + this.positiveOptions = config.positiveOptions || [ + { id: "accurate", label: "Accurate answer" }, + { id: "easy", label: "Easy to understand" }, + { id: "formatted", label: "Well formatted" }, + { id: "helpful", label: "Helpful" } + ]; + this.negativeOptions = config.negativeOptions || [ + { id: "inaccurate", label: "Inaccurate answer" }, + { id: "nocontext", label: "Did not use context" }, + { id: "poorformat", label: "Poorly formatted" }, + { id: "nothelpful", label: "Not helpful" } + ]; + this.renderInitialState(); + this.selectedThumb = ""; + } + + renderInitialState() { + this.container.innerHTML = ` +
    + + +
    +
    + `; + this.bindThumbEvents(); + } + + bindThumbEvents() { + const upThumb = this.container.querySelector( + "[data-vf-js-feedback-thumb='up']" + ); + const downThumb = this.container.querySelector( + "[data-vf-js-feedback-thumb='down']" + ); + const formContainer = this.container.querySelector( + ".vf-chatbot-feedback__form-container" + ); + + upThumb?.addEventListener("click", () => { + upThumb.classList.add("vf-chatbot-feedback__thumb--solid"); + downThumb.classList.remove("vf-chatbot-feedback__thumb--solid"); + + if (this.config.enable_instant_feedback) { + // Submit feedback immediately without showing form + this.submitInstantFeedback("positive"); + this.showSuccessBanner(); + } else { + // Traditional flow - show feedback form + this.showForm("positive", formContainer); + } + }); + + downThumb?.addEventListener("click", () => { + downThumb.classList.add("vf-chatbot-feedback__thumb--solid"); + upThumb.classList.remove("vf-chatbot-feedback__thumb--solid"); + + if (this.config.enable_instant_feedback) { + // Submit feedback immediately without showing form + this.submitInstantFeedback("negative"); + this.showSuccessBanner(); + } else { + // Traditional flow - show feedback form + this.showForm("negative", formContainer); + } + }); + } + + submitInstantFeedback(feedbackType) { + const feedbackData = { + messageId: this.messageId, + feedbackType: feedbackType, + feedbackText: "", // Empty for instant feedback + feedbackComment: "", // Empty for instant feedback + timestamp: Date.now() + }; + + // Emit event for parent component to handle + this.emitFeedbackEvent(feedbackData); + + // Send to API if configured + if (this.config.api_endpoint) { + this.sendFeedbackToAPI(feedbackData); + } + + console.log("Instant feedback submitted:", feedbackData); + } + + showSuccessBanner() { + const formContainer = this.container.querySelector( + ".vf-chatbot-feedback__form-container" + ); + + // Show thank you message using vf-banner (dismissible) + formContainer.innerHTML = ` +
    +
    +

    Thank you for your feedback!

    + +
    +
    + `; + + // Hide the unselected thumb and disable the selected one + const upThumb = this.container.querySelector( + "[data-vf-js-feedback-thumb='up']" + ); + const downThumb = this.container.querySelector( + "[data-vf-js-feedback-thumb='down']" + ); + if (upThumb.classList.contains("vf-chatbot-feedback__thumb--solid")) { + downThumb.style.display = "none"; + upThumb.disabled = true; // Disable the clicked thumb + } else if ( + downThumb.classList.contains("vf-chatbot-feedback__thumb--solid") + ) { + upThumb.style.display = "none"; + downThumb.disabled = true; // Disable the clicked thumb + } + + // Add dismiss functionality + const banner = formContainer.querySelector("[data-vf-js-banner]"); + const closeBtn = formContainer.querySelector(".vf-button--dismiss"); + if (banner && closeBtn) { + closeBtn.addEventListener("click", () => { + banner.remove(); + }); + } + } + + emitFeedbackEvent(feedbackData) { + const event = new CustomEvent("vf-chatbot-feedback:submit", { + bubbles: true, + detail: feedbackData + }); + this.container.dispatchEvent(event); + } + + async sendFeedbackToAPI(feedbackData) { + try { + const response = await fetch(this.config.api_endpoint, { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify(feedbackData) + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + } catch (error) { + console.error("Failed to send feedback to API:", error); + } + } + + showForm(type, formContainer) { + if (!formContainer) { + formContainer = this.container.querySelector( + ".vf-chatbot-feedback__form-container" + ); + } + formContainer.innerHTML = ""; + const template = + type === "positive" ? this.positiveTemplate : this.negativeTemplate; + + if (template) { + const formContent = template.content.cloneNode(true); + formContent.children[0].style.display = "block"; + formContainer.appendChild(formContent); + console.log(formContainer); + this.bindFormEvents(formContainer); + + // Bring the feedback form into view + formContainer.scrollIntoView({ behavior: "smooth", block: "center" }); + } + } + + bindFormEvents(formContainer) { + // Option button selection logic (if needed) + const optionButtons = formContainer.querySelectorAll( + ".vf-chatbot-feedback__option" + ); + optionButtons.forEach(btn => { + btn.addEventListener("click", () => { + optionButtons.forEach(b => + b.classList.remove("vf-chatbot-feedback__option--selected") + ); + btn.classList.add("vf-chatbot-feedback__option--selected"); + }); + }); + + // Submit button logic + const submitBtn = formContainer.querySelector( + "[data-vf-js-feedback-submit]" + ); + submitBtn?.addEventListener("click", () => + this.submitFeedback(formContainer) + ); + + // Close icon logic + const closeBtn = formContainer.querySelector( + "[data-vf-js-feedback-form-close]" + ); + if (closeBtn) { + closeBtn.addEventListener("click", () => { + // Remove the feedback form + formContainer.innerHTML = ""; + + // Remove solid class from both thumbs + const upThumb = this.container.querySelector( + "[data-vf-js-feedback-thumb='up']" + ); + const downThumb = this.container.querySelector( + "[data-vf-js-feedback-thumb='down']" + ); + upThumb?.classList.remove("vf-chatbot-feedback__thumb--solid"); + downThumb?.classList.remove("vf-chatbot-feedback__thumb--solid"); + }); + } + } + + submitFeedback(formContainer) { + // Collect form data for traditional feedback + const selectedOptions = formContainer.querySelectorAll( + ".vf-chatbot-feedback__option--selected" + ); + const feedbackText = Array.from(selectedOptions) + .map(option => option.textContent.trim()) + .join(", "); + + const feedbackType = this.container + .querySelector("[data-vf-js-feedback-thumb='up']") + ?.classList.contains("vf-chatbot-feedback__thumb--solid") + ? "positive" + : "negative"; + + const feedbackComment = + formContainer.querySelector(".vf-chatbot-feedback__comment").value || ""; + + const feedbackData = { + messageId: this.messageId, + feedbackType: feedbackType, + feedbackText: feedbackText, + feedbackComment: feedbackComment, + timestamp: Date.now() + }; + + // Emit event for parent component to handle + this.emitFeedbackEvent(feedbackData); + + // Send to API if configured + if (this.config.api_endpoint) { + this.sendFeedbackToAPI(feedbackData); + } + + // Show success banner (reuse existing logic) + this.showSuccessBanner(); + } +} + +// Add this function at the end of the file: +export function initVFChatbotFeedback( + container, + messageId = null, + config = {} +) { + if (!container) return; + // Prevent double-initialization + if (container.__vfChatbotFeedbackInstance) + return container.__vfChatbotFeedbackInstance; + const instance = new VFChatbotFeedback(container, messageId, config); + container.__vfChatbotFeedbackInstance = instance; + return instance; +} diff --git a/src/assets/vf-chatbot-modal/vf-chatbot-modal.js b/src/assets/vf-chatbot-modal/vf-chatbot-modal.js new file mode 100644 index 0000000..b226f53 --- /dev/null +++ b/src/assets/vf-chatbot-modal/vf-chatbot-modal.js @@ -0,0 +1,1324 @@ +// vf-chatbot-modal.js +import { initVFChatbotSources } from "../vf-chatbot-sources/vf-chatbot-sources.js"; +import { VFChatbotFeedback } from "../vf-chatbot-feedback/vf-chatbot-feedback.js"; +import { initVFChatbotSelector } from "../vf-chatbot-selector/vf-chatbot-selector.js"; +import { initVFChatbotWelcome } from "../vf-chatbot-welcome/vf-chatbot-welcome.js"; +import { initVFChatbotDialog } from "../vf-chatbot-dialog/vf-chatbot-dialog.js"; + +class VFChatbotModal { + constructor(element, customConfig = {}) { + + this.container = element; + this.loadConfiguration(customConfig); + this.setupDOMElements(); + this.setupState(); + this.setupEventHandlers(); + this.init(); + } + + loadConfiguration(customConfig) { + // Get config from data-vf-chatbot-config attribute + let dataConfig = {}; + const attr = this.container.getAttribute("data-vf-chatbot-config"); + if (attr) { + try { + dataConfig = JSON.parse(attr); + } catch (e) { + console.warn("Invalid JSON in data-vf-chatbot-config:", e); + } + } + + // Default configuration + const defaultConfig = { + type: "modal", + title: "AI Assistant", + welcome_logo: true, + welcome_message: "Welcome! I'm here to help", + welcome_logo_alt: "AI Assistant", + welcome_suggestions_title: "Try asking me:", + input_placeholder: "Ask me ...", + welcome_max_suggestions: 4, + disclaimer: + 'Disclaimer: This chatbot is designed to assist you with general information and basic inquiries. See our disclaimer notes.', + footnote: + 'Review AI generated content for accuracy. Leave feedback.', + icons: { + assistant_avatar: + "../../assets/vf-chatbot/assets/vf-chatbot--icon-16x16-dark-green.svg", + user_avatar: + "../../assets/vf-chatbot/assets/vf-chatbot--avatar-user.svg", + send_button: "../../assets/vf-chatbot/assets/vf-chatbot--icon-send.svg", + main_logo_url: + "../../assets/vf-chatbot/assets/vf-chatbot--icon-32x32-dark-green.svg", + minimize: + "../../assets/vf-chatbot/assets/vf-chatbot--icon-minimize.svg", + close: "../../assets/vf-chatbot/assets/vf-chatbot--icon-close.svg" + }, + + api: { + chat_endpoint: false, //"/api/chat", // Disabled to use fallback responses + feedback_endpoint: false, //"/api/feedback", + qa_data_url: "../../assets/vf-chatbot/assets/vf-chatbot-qa.json", + headers: { + "Content-Type": "application/json", + Authorization: "Bearer your-token" + }, + timeout: 10000 + }, + + features: { + enable_welcome: true, + enable_feedback: true, + enable_sources: true, + enable_sources_custom_format: false, + enable_welcome_suggestions: true, + enable_typing_indicator: true, + enable_disclaimer: true, + enable_predefined_qa: true, + enable_fallback_responses: true, + enable_qa_data_loading: true, + enable_instant_feedback: false + }, + + behavior: { + auto_scroll: true, + typing_delay: 800, + show_scrollbar: false + }, + + selectorContext: { + chatbotRoutes: { + multiSelect: true, + maxMultiSelect: 3, + showSearch: true, + showSearchThreshold: 5, + showAllServices: true, + showAllServicesSelected: true, + routes: + "../../assets/vf-chatbot/assets/vf-chatbot-selector-services.json", + placeholder: "Select services", + title: "Services", + selector_logo_url: + "../../assets/vf-chatbot/assets/vf-chatbot--icon-24x24-dark-green.svg", + selector_logo_title: "AI Assistant" + } + }, + + handlers: { + on_message_send: "handleMessageSend", + on_response_receive: "handleResponseReceive", + on_feedback_submit: "handleFeedbackSubmit", + on_suggestion_click: "handleSuggestionClick", + on_error: "handleError", + on_conversation_start: "handleConversationStart", + on_conversation_end: "handleConversationEnd", + on_fab_click: "handleFabClick", + on_dialog_confirm: "handleDialogConfirm", + on_dialog_cancel: "handleDialogCancel", + on_minimize: "handleMinimize" + }, + + feedback_options: { + positive: [ + { id: "accurate", label: "Accurate" }, + { id: "easy", label: "Easy to understand" }, + { id: "formatted", label: "Well formatted" } + ], + negative: [ + { id: "inaccurate", label: "Inaccurate answer" }, + { id: "nocontext", label: "Did not use context" }, + { id: "poorformat", label: "Poorly formatted" } + ] + }, + enable_session_persistence: true, + restore_minimized_state: true // If true, restore minimized state after navigation + }; + + // Merge configurations: default < data-attribute < custom + this.config = this.deepMerge(defaultConfig, dataConfig, customConfig); + console.log("Final merged config:", this.config); + } + + deepMerge(...objects) { + return objects.reduce((prev, obj) => { + // ✅ FIX: Skip null/undefined objects + if (!obj || typeof obj !== "object") { + return prev; + } + + Object.keys(obj).forEach(key => { + const pVal = prev[key]; + const oVal = obj[key]; + + // ✅ FIX: Skip undefined values to maintain priority + if (oVal === undefined) { + return; + } + + if (Array.isArray(pVal) && Array.isArray(oVal)) { + prev[key] = pVal.concat(...oVal); + } else if ( + pVal && + oVal && + typeof pVal === "object" && + typeof oVal === "object" && + !Array.isArray(pVal) && + !Array.isArray(oVal) + ) { + prev[key] = this.deepMerge(pVal, oVal); + } else { + // ✅ FIX: Only assign if oVal is not null/undefined + if (oVal !== null && oVal !== undefined) { + prev[key] = oVal; + } + } + }); + return prev; + }, {}); + } + + setupDOMElements() { + this.fab = document.querySelector("[data-vf-js-chatbot-fab]"); + + this.minimizeBtn = this.container.querySelector( + "[data-vf-js-chatbot-modal-minimize]" + ); + this.closeBtn = this.container.querySelector( + "[data-vf-js-chatbot-modal-close]" + ); + + this.welcomeScreen = this.container.querySelector( + "[data-vf-js-chatbot-welcome]" + ); + this.messagesContainer = this.container.querySelector( + "[data-vf-js-chatbot-modal-messages]" + ); + this.input = this.container.querySelector( + "[data-vf-js-chatbot-modal-input]" + ); + this.sendBtn = this.container.querySelector( + "[data-vf-js-chatbot-modal-send]" + ); + this.disclaimer = this.container.querySelector( + "[data-vf-js-chatbot-modal-disclaimer]" + ); + this.disclaimerCloseBtn = this.disclaimer?.querySelector( + ".vf-button--dismiss" + ); + this.selectorEl = this.container.querySelector( + "[data-vf-js-chatbot-selector]" + ); + + // Templates + this.userTemplate = this.container.querySelector("#user-message-template"); + this.assistantTemplate = this.container.querySelector( + "#assistant-message-template" + ); + this.loadingTemplate = this.container.querySelector( + "#loading-indicator-template" + ); + this.actionPromptsTemplate = this.container.querySelector( + "#action-prompts-template" + ); + this.singlePromptTemplate = this.container.querySelector( + "#single-action-prompt-template" + ); + + this.dialog = this.container.querySelector("[data-vf-js-chatbot-dialog]"); + // Apply configuration to DOM elements + this.applyConfigurationToDOM(); + } + + applyConfigurationToDOM() { + // Update input placeholder + if (this.input) { + this.input.placeholder = this.config.input_placeholder; + // Initialize textarea height + this.autoResizeTextarea(); + } + + // Update auto-scroll behavior + if (this.messagesContainer) { + this.messagesContainer.dataset.autoScroll = this.config.behavior.auto_scroll; + } + } + setupState() { + this.currentAssistant = ""; + this.conversationId = this.generateConversationId(); + this.messageHistory = []; + this.loadingIndicator = null; + this.apiResponseListener = null; + + // Load Q&A data if using fallback responses + this.loadQADataAndPopulateSuggestions(); + + // Restore conversation HTML from sessionStorage + const persistedHTML = this.loadConversationHTML(); + if (persistedHTML && this.messagesContainer) { + this.messagesContainer.innerHTML = persistedHTML; + if (this.welcomeScreen) { + this.welcomeScreen.style.display = "none"; + } + this.messagesContainer.style.display = "flex"; + // Hide disclaimer if present + if (this.disclaimer) { + this.disclaimer.classList.add("vf-u-display-none"); + } + // Hide all loading indicator divs + const loadingDivs = this.messagesContainer.querySelectorAll( + ".vf-chatbot-message--loading" + ); + loadingDivs.forEach(div => { + div.style.display = "none"; + }); + // Hide all feedback response banners + const feedbackBanners = this.messagesContainer.querySelectorAll( + ".vf-chatbot-feedback__form-container" + ); + feedbackBanners.forEach(div => { + div.style.display = "none"; + }); + // Re-initialize feedback thumbs + const feedbackContainers = this.messagesContainer.querySelectorAll( + "[data-vf-js-chatbot-feedback]" + ); + const feedbackState = JSON.parse( + sessionStorage.getItem("chatbotModalFeedbackState") || "{}" + ); + feedbackContainers.forEach(container => { + const messageId = container.dataset.messageId; + const feedbackType = feedbackState[messageId]; + if (feedbackType) { + // Find thumb icons and set solid/active state + const positiveThumb = container.querySelector( + "[data-vf-js-feedback-thumb='up']" + ); + const negativeThumb = container.querySelector( + "[data-vf-js-feedback-thumb='down']" + ); + if (positiveThumb && feedbackType === "positive") { + positiveThumb.classList.add("vf-chatbot-feedback__thumb--solid"); + if (negativeThumb) { + negativeThumb.classList.remove( + "vf-chatbot-feedback__thumb--solid" + ); + negativeThumb.style.display = "none"; + } + } + if (negativeThumb && feedbackType === "negative") { + negativeThumb.classList.add("vf-chatbot-feedback__thumb--solid"); + if (positiveThumb) { + positiveThumb.classList.remove( + "vf-chatbot-feedback__thumb--solid" + ); + positiveThumb.style.display = "none"; + } + } + } else { + new VFChatbotFeedback(container, messageId, { + enable_instant_feedback: this.config.features + .enable_instant_feedback, + api_endpoint: this.config.api.feedback_endpoint, + positiveOptions: this.config.feedback_options?.positive, + negativeOptions: this.config.feedback_options?.negative + }); + } + }); + // Re-initialize 'View sources' event listeners + const sourcesContainers = this.messagesContainer.querySelectorAll( + ".vf-chatbot-sources-toggle" + ); + if (sourcesContainers) { + sourcesContainers.forEach(sourcesContainer => { + const toggleBtn = sourcesContainer.querySelector( + "[data-vf-js-chatbot-sources-toggle]" + ); + const sourcesDiv = sourcesContainer.querySelector( + "[data-vf-js-chatbot-sources]" + ); + const hideBtn = sourcesContainer.querySelector( + "[data-vf-js-chatbot-sources-hide]" + ); + + toggleBtn.addEventListener("click", () => { + sourcesDiv.classList.remove("vf-chatbot-sources--collapsed"); + toggleBtn.style.display = "none"; + // Scroll the sources div into view + // sourcesDiv.scrollIntoView({ behavior: "smooth", block: "center" }); + }); + hideBtn.addEventListener("click", () => { + sourcesDiv.classList.add("vf-chatbot-sources--collapsed"); + toggleBtn.style.display = ""; + }); + hideBtn.click(); + }); + } + // Keep chatbot open if there is persistedHTML + if (this.container) { + this.fab.classList.add("vf-chatbot-fab--inactive"); + this.container.classList.remove("vf-chatbot-modal-container--inactive"); + this.container.classList.add("vf-chatbot-modal-container--active"); + this.container.setAttribute("aria-modal", true); + + // Focus on input if it exists + const input = this.container.querySelector( + "[data-vf-js-chatbot-modal-input]" + ); + if (input) { + setTimeout(() => input.focus(), 300); + } + } + + const wasMinimized = + sessionStorage.getItem("chatbotModalMinimized") === "true"; + if (this.container) { + if (this.config.restore_minimized_state && !wasMinimized) { + this.fab.classList.add("vf-chatbot-fab--inactive"); + this.container.classList.remove( + "vf-chatbot-modal-container--inactive" + ); + this.container.classList.add("vf-chatbot-modal-container--active"); + this.container.setAttribute("aria-modal", true); + } else { + this.fab.classList.remove("vf-chatbot-fab--inactive"); + this.container.classList.remove("vf-chatbot-modal-container--active"); + this.container.classList.add("vf-chatbot-modal-container--inactive"); + this.container.setAttribute("aria-modal", false); + // Focus input if needed + } + } + return; // Skip history-based rendering if HTML is present + } + } + + setupEventHandlers() { + // Setup global event handlers for custom functions + this.setupCustomEventHandlers(); + + // Bind internal events + this.bindEvents(); + } + + setupCustomEventHandlers() { + // Create wrapper functions that call user-defined handlers and emit events + const handlers = this.config.handlers; + + // Message send handler + this.onMessageSend = message => { + const eventData = { + message, + conversationId: this.conversationId, + timestamp: Date.now() + }; + + this.emitEvent("vf-chatbot:message-send", eventData); + + if ( + handlers.on_message_send && + typeof window[handlers.on_message_send] === "function" + ) { + window[handlers.on_message_send](eventData); + } + }; + + // Response receive handler + this.onResponseReceive = (response, sources, prompts) => { + const eventData = { + response, + sources, + prompts, + conversationId: this.conversationId, + timestamp: Date.now() + }; + + this.emitEvent("vf-chatbot:response-receive", eventData); + + if ( + handlers.on_response_receive && + typeof window[handlers.on_response_receive] === "function" + ) { + window[handlers.on_response_receive](eventData); + } + }; + + // Feedback submit handler + this.onFeedbackSubmit = ( + messageId, + feedbackType, + feedbackText = "", + feedbackComment = "" + ) => { + const eventData = { + messageId, + feedbackType, + feedbackText, + feedbackComment, + conversationId: this.conversationId, + timestamp: Date.now() + }; + + this.emitEvent("vf-chatbot:feedback-submit", eventData); + + // Call API if configured + if (this.config.api.feedback_endpoint) { + this.submitFeedbackToAPI(eventData); + } + + // Update local storage feedback state + if (this.config.enable_session_persistence) { + let feedbackState = JSON.parse( + sessionStorage.getItem("chatbotModalFeedbackState") || "{}" + ); + feedbackState[messageId] = feedbackType; // e.g., "positive" or "negative" + sessionStorage.setItem( + "chatbotModalFeedbackState", + JSON.stringify(feedbackState) + ); + } + + if ( + handlers.on_feedback_submit && + typeof window[handlers.on_feedback_submit] === "function" + ) { + window[handlers.on_feedback_submit](eventData); + } + }; + + // Suggestion click handler + this.onSuggestionClick = suggestion => { + const eventData = { + suggestion, + conversationId: this.conversationId, + timestamp: Date.now() + }; + + this.emitEvent("vf-chatbot:suggestion-click", eventData); + + if ( + handlers.on_suggestion_click && + typeof window[handlers.on_suggestion_click] === "function" + ) { + window[handlers.on_suggestion_click](eventData); + } + }; + + // Error handler + this.onError = (error, context) => { + const eventData = { + error, + context, + conversationId: this.conversationId, + timestamp: Date.now() + }; + + this.emitEvent("vf-chatbot:error", eventData); + + if ( + handlers.on_error && + typeof window[handlers.on_error] === "function" + ) { + window[handlers.on_error](eventData); + } + }; + + // Conversation start handler + this.onConversationStart = () => { + const eventData = { + conversationId: this.conversationId, + timestamp: Date.now() + }; + + this.emitEvent("vf-chatbot:conversation-start", eventData); + + if ( + handlers.on_conversation_start && + typeof window[handlers.on_conversation_start] === "function" + ) { + window[handlers.on_conversation_start](eventData); + } + }; + + // Conversation end handler + this.onConversationEnd = () => { + const eventData = { + conversationId: this.conversationId, + messageCount: this.messageHistory.length, + timestamp: Date.now() + }; + + this.emitEvent("vf-chatbot:conversation-end", eventData); + + if ( + handlers.on_conversation_end && + typeof window[handlers.on_conversation_end] === "function" + ) { + window[handlers.on_conversation_end](eventData); + } + }; + + // FAB click handler + this.onFabClick = () => { + const eventData = { + conversationId: this.conversationId, + timestamp: Date.now() + }; + this.emitEvent("vf-chatbot-fab:click", eventData); + + if ( + handlers.on_fab_click && + typeof window[handlers.on_fab_click] === "function" + ) { + window[handlers.on_fab_click](eventData); + } + }; + + // Dialog confirm handler + this.onDialogConfirm = () => { + const eventData = { + conversationId: this.conversationId, + timestamp: Date.now() + }; + this.emitEvent("vf-chatbot-dialog:confirm", eventData); + + if ( + handlers.on_dialog_confirm && + typeof window[handlers.on_dialog_confirm] === "function" + ) { + window[handlers.on_dialog_confirm](eventData); + } + }; + + // Dialog cancel handler + this.onDialogCancel = () => { + const eventData = { + conversationId: this.conversationId, + timestamp: Date.now() + }; + this.emitEvent("vf-chatbot-dialog:cancel", eventData); + + if ( + handlers.on_dialog_cancel && + typeof window[handlers.on_dialog_cancel] === "function" + ) { + window[handlers.on_dialog_cancel](eventData); + } + }; + + // Minimize handler + this.onMinimize = () => { + const eventData = { + conversationId: this.conversationId, + timestamp: Date.now() + }; + this.emitEvent("vf-chatbot-modal:minimize", eventData); + + if ( + handlers.on_minimize && + typeof window[handlers.on_minimize] === "function" + ) { + window[handlers.on_minimize](eventData); + } + }; + } + + emitEvent(eventName, data) { + const event = new CustomEvent(eventName, { + bubbles: true, + detail: data + }); + this.container.dispatchEvent(event); + } + + generateConversationId() { + return `conv_${Date.now()}_${Math.random() + .toString(36) + .substr(2, 9)}`; + } + + async init() { + // Initialize selector if present + if (this.selectorEl) { + const selector = initVFChatbotSelector(this.selectorEl); + this.selectorEl.addEventListener("routeselection", e => { + this.handleRouteSelection(e.detail); + // Save selection on change + if (this.config.enable_session_persistence) { + sessionStorage.setItem( + "vfChatbotSelectorSelection", + JSON.stringify(e.detail.selectedItems) + ); + } + }); + + // Restore selection only after routes are loaded/rendered + this.selectorEl.addEventListener("routesloaded", () => { + if (this.config.enable_session_persistence) { + this.savedSelection = sessionStorage.getItem( + "vfChatbotSelectorSelection" + ); + if (this.savedSelection) { + const selectedItems = JSON.parse(this.savedSelection); + selector.setSelection(selectedItems); + } + } + }); + } + + // Initialize welcome component + if (this.welcomeScreen && this.config.features.enable_welcome_suggestions) { + try { + initVFChatbotWelcome(this.welcomeScreen); + + // Only add the event listener if not already present + const existingListeners = this.welcomeScreen._hasSuggestionClickListener; + if (!existingListeners) { + this.welcomeScreen.addEventListener( + "vf-chatbot-welcome:suggestion-click", + event => { + const question = event.detail.question; + this.onSuggestionClick(question); + this.showChatInterface(); + this.sendUserMessage(question); + } + ); + // Mark that the listener has been added + this.welcomeScreen._hasSuggestionClickListener = true; + } + + this.welcomeScreen.scrollTop = this.welcomeScreen.scrollHeight; + } catch (error) { + console.error("Failed to initialize welcome component:", error); + this.onError(error, "welcome_component_init"); + } + } + + // Trigger conversation start + this.onConversationStart(); + + console.log("Modal chatbot initialized successfully"); + } + + async loadQADataAndPopulateSuggestions() { + // Skip loading if Q&A data loading is disabled + if (!this.config.features.enable_qa_data_loading) { + console.log("Q&A data loading is disabled"); + return; + } + + // Skip loading if no URL is configured + if (!this.config.api.qa_data_url) { + console.log("No Q&A data URL configured"); + return; + } + try { + const response = await fetch(this.config.api.qa_data_url); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + const data = await response.json(); + + // Load predefined Q&A if enabled + if (this.config.features.enable_predefined_qa && data.predefinedQA) { + this.qaData = data.predefinedQA; + } else { + console.log("Predefined Q&A loading is disabled or no data available"); + } + + // Load fallback responses if enabled + if ( + this.config.features.enable_fallback_responses && + data.fallbackResponses && + data.fallbackResponses.length > 0 + ) { + this.fallbackResponses = data.fallbackResponses; + } else { + console.log("Using default fallback responses"); + } + } catch (error) { + console.error("Failed to load Q&A data:", error); + this.onError(error, "qa_data_load"); + } + } + + handleRouteSelection(detail) { + const { selectedItems } = detail; + if (selectedItems && selectedItems.length > 0) { + this.currentAssistant = selectedItems.join(", "); + console.log(`Switched to ${this.currentAssistant} assistant`); + + this.emitEvent("vf-chatbot:assistant-change", { + selectedAssistants: this.currentAssistant, + conversationId: this.conversationId + }); + } + } + + bindEvents() { + this.minimizeBtn?.addEventListener("click", () => { + this.onMinimize(); + this.minimize(); + }); + + this.closeBtn?.addEventListener("click", () => this.showCloseDialog()); + + // Send message events + this.sendBtn?.addEventListener("click", () => this.sendMessage()); + + this.input?.addEventListener("keypress", e => { + if (e.key === "Enter" && !e.shiftKey) { + e.preventDefault(); + this.sendMessage(); + } + }); + + // Auto-resize textarea functionality + this.input?.addEventListener("input", () => this.autoResizeTextarea()); + this.input?.addEventListener("paste", () => { + // Use setTimeout to ensure the pasted content is processed + setTimeout(() => this.autoResizeTextarea(), 0); + }); + + // Disclaimer close + if (this.disclaimer && this.disclaimerCloseBtn) { + this.disclaimerCloseBtn.addEventListener("click", () => { + this.disclaimer.classList.add("vf-u-display-none"); + }); + } + + // Global feedback event listener + this.container.addEventListener("vf-chatbot-feedback:submit", event => { + const { + messageId, + feedbackType, + feedbackText, + feedbackComment + } = event.detail; + this.onFeedbackSubmit( + messageId, + feedbackType, + feedbackText, + feedbackComment + ); + }); + + // Action prompt click listener + this.container.addEventListener("vf-chatbot-action-prompt:click", event => { + const { text } = event.detail; + this.sendUserMessage(text); + }); + + this.fab?.addEventListener("click", this.onFabClick); + this.dialog?.addEventListener( + "vf-chatbot-dialog:confirm", + this.onDialogConfirm + ); + this.dialog?.addEventListener( + "vf-chatbot-dialog:cancel", + this.onDialogCancel + ); + } + + sendMessage() { + if (!this.input || !this.input.value.trim()) return; + + const text = this.input.value.trim(); + this.showChatInterface(); + this.sendUserMessage(text); + } + + autoResizeTextarea() { + if (!this.input) return; + + // Reset height to auto to get the actual scroll height + // this.input.style.height = 'auto'; + // Get computed styles + const computedStyle = window.getComputedStyle(this.input); + const lineHeight = parseFloat(computedStyle.lineHeight) || 24; + const paddingTop = parseFloat(computedStyle.paddingTop) || 0; + const paddingBottom = parseFloat(computedStyle.paddingBottom) || 0; + const borderTop = parseFloat(computedStyle.borderTopWidth) || 0; + const borderBottom = parseFloat(computedStyle.borderBottomWidth) || 0; + + // Calculate heights more accurately + const extraHeight = paddingTop + paddingBottom + borderTop + borderBottom; + const minHeight = lineHeight + extraHeight; // Height for 1 row + const maxHeight = lineHeight * 5 + extraHeight; // Height for 5 rows + + // Get the scroll height (content height) + const scrollHeight = this.input.scrollHeight; + + // Calculate the new height, constrained by min and max + let newHeight = Math.max(minHeight, scrollHeight); + + if (newHeight >= maxHeight) { + // If content exceeds 5 rows, set to max height and enable scrolling + newHeight = maxHeight; + this.input.classList.add("vf-chatbot-modal__input--scrollable"); + } else { + // Remove scrollable class if content fits within 5 rows + this.input.classList.remove("vf-chatbot-modal__input--scrollable"); + } + + // Apply the new height + this.input.style.height = newHeight + "px"; + } + + showChatInterface() { + if (this.welcomeScreen) { + this.welcomeScreen.style.display = "none"; + } + if (this.messagesContainer) { + this.messagesContainer.style.display = "flex"; + } + if (this.input) { + this.input.focus(); + } + } + + sendUserMessage(text) { + if (!text || !this.messagesContainer) return; + + // Add to message history + this.messageHistory.push({ + type: "user", + content: text, + timestamp: Date.now() + }); + + // Trigger message send event + this.onMessageSend(text); + + // Create user message element + const userMessage = this.userTemplate.content.cloneNode(true); + const content = userMessage.querySelector( + ".vf-chatbot-message__content-prompt" + ); + content.textContent = text; + + // Update avatar if configured + const avatar = userMessage.querySelector("img"); + if (avatar) { + avatar.src = this.config.icons.user_avatar; + } + + this.messagesContainer.appendChild(userMessage); + this.saveConversationHTML(this.messagesContainer.innerHTML); + + // Clear input + if (this.input) { + this.input.value = ""; + this.input.style.height = "auto"; + // Reset textarea to minimum height and remove scrollable class + this.input.classList.remove("vf-chatbot-modal__input--scrollable"); + this.autoResizeTextarea(); + } + + this.scrollToBottom(); + this.processUserMessage(text); + } + + async processUserMessage(text) { + this.setLoadingState(true); + + try { + // Check for predefined answers first + if (this.qaData && this.qaData[text]) { + setTimeout(() => { + const answer = this.qaData[text]; + this.addAssistantResponse( + answer.answer || answer.html, + answer.sources || [], + answer.prompts || [] + ); + this.setLoadingState(false); + }, this.config.behavior.typing_delay); + return; + } + + // Try API call if configured + if (this.config.api.chat_endpoint) { + const response = await this.callChatAPI(text); + this.addAssistantResponse( + response.response, + response.sources || [], + response.prompts || [] + ); + this.setLoadingState(false); + } else { + // Use fallback response + setTimeout(() => { + let fallbackResponse; + + if (this.fallbackResponses && this.fallbackResponses.length > 0) { + fallbackResponse = this.fallbackResponses[ + Math.floor(Math.random() * this.fallbackResponses.length) + ]; + + this.addAssistantResponse( + fallbackResponse.answer, + [], + fallbackResponse.prompts || [] + ); + } + this.setLoadingState(false); + }, this.config.behavior.typing_delay); + } + } catch (error) { + console.error("Error processing message:", error); + this.onError(error, "message_processing"); + this.setLoadingState(false); + // this.showErrorMessage(); + } + } + + async callChatAPI(message) { + const requestData = { + message, + assistant: this.currentAssistant, + conversationId: this.conversationId, + messageHistory: this.config.features.enable_conversation_history + ? this.messageHistory + : [] + }; + + const response = await fetch(this.config.api.chat_endpoint, { + method: "POST", + headers: this.config.api.headers, + body: JSON.stringify(requestData), + signal: AbortSignal.timeout(this.config.api.timeout) + }); + + if (!response.ok) { + throw new Error( + `API call failed: ${response.status} ${response.statusText}` + ); + } + + return await response.json(); + } + + async submitFeedbackToAPI(feedbackData) { + try { + await fetch(this.config.api.feedback_endpoint, { + method: "POST", + headers: this.config.api.headers, + body: JSON.stringify(feedbackData) + }); + } catch (error) { + console.error("Failed to submit feedback:", error); + this.onError(error, "feedback_submission"); + } + } + + addAssistantResponse(text, sources = [], prompts = []) { + if (!this.assistantTemplate || !this.messagesContainer) return; + + const messageId = `msg_${Date.now()}_${Math.random() + .toString(36) + .substr(2, 9)}`; + + // Add to message history + this.messageHistory.push({ + type: "assistant", + content: text, + sources, + prompts, + messageId, + timestamp: Date.now() + }); + + // Trigger response receive event + this.onResponseReceive(text, sources, prompts); + + const assistantMessage = this.assistantTemplate.content.cloneNode(true); + const content = assistantMessage.querySelector( + ".vf-chatbot-message__content-prompt" + ); + content.innerHTML = text; + + // Update avatar if configured + const avatar = assistantMessage.querySelector("img"); + if (avatar) { + avatar.src = this.config.icons.assistant_avatar; + } + + // Initialize feedback if enabled + if (this.config.features.enable_feedback) { + const feedbackContainer = assistantMessage.querySelector( + "[data-vf-js-chatbot-feedback]" + ); + if (feedbackContainer) { + feedbackContainer.dataset.messageId = messageId; + + // Pass configuration to VFChatbotFeedback component + new VFChatbotFeedback(feedbackContainer, messageId, { + enable_instant_feedback: this.config.features.enable_instant_feedback, + api_endpoint: this.config.api.feedback_endpoint, + positiveOptions: this.config.feedback_options?.positive, + negativeOptions: this.config.feedback_options?.negative + }); + } + } + + // Add sources if enabled and present + if ( + this.config.features.enable_sources && + sources && + (sources.length > 0 || sources != "") + ) { + const feedbackContainer = assistantMessage.querySelector( + "[data-vf-js-chatbot-feedback]" + ); + let sourceHTML = ""; + if ( + !this.config.features.enable_sources_custom_format && + sources.length > 0 + ) { + sourceHTML = sources + .map( + message => ` +
  • +
    ${message.domain}
    + + ${message.title} + +
    ${message.description}
    +
  • + ` + ) + .join(""); + } else if ( + this.config.features.enable_sources_custom_format && + sources != "" + ) { + sourceHTML = sources; + } + if (sourceHTML != "") { + const sourcesEl = initVFChatbotSources(sourceHTML); + assistantMessage.insertBefore(sourcesEl.el, feedbackContainer); + } + } + + // Add prompts if present + if (prompts && prompts.length > 0) { + this.addActionPrompts(assistantMessage, prompts, content); + } + + this.messagesContainer.appendChild(assistantMessage); + this.saveConversationHTML(this.messagesContainer.innerHTML); + this.scrollToBottom(); + + return messageId; + } + + addActionPrompts(assistantMessage, prompts, contentElement) { + if (!this.actionPromptsTemplate || !this.singlePromptTemplate) return; + + const promptsContainer = this.actionPromptsTemplate.content.cloneNode(true); + const promptsList = promptsContainer.querySelector( + "[data-vf-js-action-prompts-list]" + ); + + prompts.forEach(prompt => { + const promptEl = this.singlePromptTemplate.content.cloneNode(true); + const link = promptEl.querySelector(".vf-chatbot-action-prompt__link"); + + if (link) { + link.href = prompt.action_url || "#"; + link.textContent = prompt.action_text; + + // Set target and add accessibility attributes + if (prompt.action_url?.startsWith("tel:")) { + link.target = "_self"; + } else if (prompt.action_url) { + link.target = "_blank"; + // Add aria-label for screen readers to indicate it opens in a new tab + link.setAttribute( + "aria-label", + `${prompt.action_text} (opens in new tab)` + ); + // Add rel="noopener noreferrer" for security + link.rel = "noopener noreferrer"; + } + + if (!prompt.action_url) { + link.addEventListener("click", e => { + e.preventDefault(); + this.emitEvent("vf-chatbot-action-prompt:click", { + text: prompt.action_text + }); + }); + } + } + + promptsList.appendChild(promptEl); + }); + + contentElement.appendChild(promptsContainer); + } + + setLoadingState(isLoading) { + + if (!this.config.features.enable_typing_indicator) return; + + if (isLoading) { + if (!this.loadingIndicator && this.loadingTemplate) { + const loadingContent = this.loadingTemplate.content.cloneNode(true); + this.loadingIndicator = loadingContent.firstElementChild; + + // Update avatar + const avatar = this.loadingIndicator.querySelector("img"); + if (avatar) { + avatar.src = this.config.icons.assistant_avatar; + } + + this.messagesContainer.appendChild(this.loadingIndicator); + } else if (this.loadingIndicator && !this.loadingIndicator.parentNode) { + // Re-append if it was removed from DOM + this.messagesContainer.appendChild(this.loadingIndicator); + } + + if (this.loadingIndicator) { + this.loadingIndicator.style.display = "block"; + } + } else { + if (this.loadingIndicator) { + this.loadingIndicator.style.display = "none"; + this.messagesContainer.removeChild(this.loadingIndicator); + } + } + + // Disable/enable controls + if (this.sendBtn) this.sendBtn.disabled = isLoading; + // if (this.input) this.input.disabled = isLoading; + + this.scrollToBottom(); + } + + scrollToBottom() { + if (this.config.behavior.auto_scroll && this.messagesContainer) { + this.messagesContainer.scrollTop = this.messagesContainer.scrollHeight; + } + } + + // Public API methods + resetConversation() { + this.messageHistory = []; + this.conversationId = this.generateConversationId(); + + if (this.messagesContainer) { + this.messagesContainer.innerHTML = ""; + if (this.config.enable_session_persistence) { + sessionStorage.removeItem("chatbotModalConversationHTML"); + sessionStorage.removeItem("chatbotModalFeedbackState"); + sessionStorage.removeItem("chatbotModalMinimized"); + } + } + if (this.savedSelection && this.config.enable_session_persistence) { + sessionStorage.removeItem("vfChatbotSelectorSelection"); + } + + if (this.welcomeScreen && this.config.features.enable_welcome_suggestions) { + this.welcomeScreen.style.display = "flex"; + } + + this.onConversationStart(); + } + + updateConfiguration(newConfig) { + this.config = this.deepMerge(this.config, newConfig); + this.applyConfigurationToDOM(); + // this.applyTheme(); + } + + getConfiguration() { + return { ...this.config }; + } + + getConversationHistory() { + return [...this.messageHistory]; + } + + minimize() { + const event = new Event("vf-chatbot-modal-container:close", { + bubbles: true + }); + this.container.dispatchEvent(event); + } + + showCloseDialog() { + if (this.dialog) { + // Initialize and show the dialog + initVFChatbotDialog(this.dialog); + this.dialog.style.display = "flex"; + + // Listen for dialog events + const onConfirm = () => { + this.resetConversation(); // <-- Reset to original state + this.dialog.removeEventListener("vf-chatbot-dialog:confirm", onConfirm); + this.minimize(); + }; + this.dialog.addEventListener("vf-chatbot-dialog:confirm", onConfirm); + } + } + + destroy() { + this.onConversationEnd(); + + // Remove event listeners + this.sendBtn?.removeEventListener("click", this.sendMessage); + this.input?.removeEventListener("keypress", this.handleKeyPress); + + // Clean up API response listener + if (this.apiResponseListener) { + this.container.removeEventListener( + "vf-chatbot:api-response", + this.apiResponseListener + ); + } + } + + // Helper functions for conversation persistence + saveConversationHTML(html) { + if (this.config.enable_session_persistence) { + sessionStorage.setItem("chatbotModalConversationHTML", html); + } + } + + loadConversationHTML() { + if (this.config.enable_session_persistence) { + return sessionStorage.getItem("chatbotModalConversationHTML") || ""; + } + return ""; + } +} + +// Global initialization function with configuration support +function initVFChatbotModal(customConfig = {}) { + console.log("Looking for modal chatbot elements..."); + const chatbotElements = document.querySelectorAll( + "[data-vf-js-chatbot-modal-container]" + ); + + if (chatbotElements.length === 0) { + console.warn("No modal chatbot elements found on page"); + return []; + } + + const instances = []; + chatbotElements.forEach(element => { + instances.push(new VFChatbotModal(element, customConfig)); + }); + + return instances; +} + +// Global exposure +if (typeof window !== "undefined") { + window.VFChatbotModal = VFChatbotModal; + window.initVFChatbotModal = initVFChatbotModal; +} + +export { VFChatbotModal, initVFChatbotModal }; diff --git a/src/assets/vf-chatbot-selector/vf-chatbot-selector.js b/src/assets/vf-chatbot-selector/vf-chatbot-selector.js new file mode 100644 index 0000000..ed0a169 --- /dev/null +++ b/src/assets/vf-chatbot-selector/vf-chatbot-selector.js @@ -0,0 +1,580 @@ +export class VFChatbotSelector { + constructor(element) { + if (!element) { + console.error("Selector element is required"); + return; + } + + this.el = element; + this.isMultiselect = this.el.getAttribute("data-multiselect") === "true"; + this.maxMultiSelect = parseInt( + this.el.getAttribute("data-max-multiselect") || "3", + 10 + ); + this.selectedItems = new Set(); + // this.allServicesSelected = true; // Track "All services" state + + this.showAllServices = + this.el.getAttribute("data-show-all-services") === "true"; + this.showAllServicesSelected = + this.el.getAttribute("data-show-all-services-selected") === "true"; + + this.init(); + this.loadRoutes(); + } + + async loadRoutes() { + try { + const routesPath = this.el.getAttribute("data-routes-path"); + if (!routesPath) return; + + const response = await fetch(routesPath); + const data = await response.json(); + + // Update routes and refresh UI + this.routes = data.routes; + this.updateRoutesList(); + } catch (error) { + console.error("Failed to load routes:", error); + } + } + + init() { + // Ensure element exists before querying + if (!this.el) return; + + // Get DOM elements + this.titleEl = this.el.querySelector("[data-vf-js-selector-toggle]"); + this.dropdownEl = this.el.querySelector("[data-vf-js-selector-dropdown]"); + this.searchEl = this.el.querySelector("[data-vf-js-selector-search]"); + this.clearEl = this.el.querySelector("[data-vf-js-selector-clear]"); + this.listItems = this.el.querySelectorAll("[data-vf-js-selector-item]"); + this.allServicesItem = this.el.querySelector("[data-route-id='all']"); + + // Initialize dropdown as closed + if (this.dropdownEl) { + this.dropdownEl.style.display = "none"; + } + + // Bind events + this.bindEvents(); + + // Check if any items are pre-selected (not including "All services") + let hasPreSelectedItems = false; + this.listItems.forEach(item => { + const itemId = item.getAttribute("data-route-id"); + if (item.classList.contains("vf-chatbot-selector__item--selected")) { + if (itemId !== "all") { + // Only count non-"All services" items as pre-selected + this.selectedItems.add(itemId); + hasPreSelectedItems = true; + } + } + }); + + // If no items are pre-selected, default to "All services" + if (!hasPreSelectedItems && this.showAllServices) { + this.selectAllServices(); + } else if (!hasPreSelectedItems && !this.showAllServices) { + // If no "All services" option and no pre-selection, select first item for single-select + if (!this.isMultiselect && this.listItems.length > 0) { + const firstItem = this.listItems[0]; + const firstItemId = firstItem.getAttribute("data-route-id"); + this.selectedItems.add(firstItemId); + firstItem.classList.add("vf-chatbot-selector__item--selected"); + } + } else if (hasPreSelectedItems) { + // If items are pre-selected, ensure "All services" is not selected + this.allServicesSelected = false; + if (this.allServicesItem) { + this.allServicesItem.classList.remove( + "vf-chatbot-selector__item--selected" + ); + } + } + + // Update display after initial selection + this.updateSelectionDisplay(); + this.updateClearButton(); + } + + updateRoutesList() { + const listEl = this.el.querySelector("[data-vf-js-chatbot-selector-list]"); + if (!listEl || !this.routes) return; + + // Clear existing list + listEl.innerHTML = ""; + + // Check if any routes have pre-selected state + const hasPreSelectedRoutes = this.routes.some(route => route.selected); + + // Add "All services" option if enabled + if (this.showAllServices) { + const allServicesItem = document.createElement("li"); + allServicesItem.className = "vf-chatbot-selector__item"; + allServicesItem.setAttribute("data-vf-js-selector-item", ""); + allServicesItem.setAttribute("data-route-id", "all"); + allServicesItem.setAttribute("data-title", "All services"); + allServicesItem.setAttribute("role", "button"); + allServicesItem.setAttribute("tabindex", "0"); + allServicesItem.setAttribute("aria-label", "Select all services"); + + if (!hasPreSelectedRoutes && this.showAllServicesSelected) { + allServicesItem.className += " vf-chatbot-selector__item--selected"; + allServicesItem.setAttribute("data-selected", "true"); + } + + allServicesItem.innerHTML = `
    +
    All services
    +
    This would select all services
    +
    + + + + + `; + listEl.appendChild(allServicesItem); + } + + // Add route items + this.routes.forEach(route => { + const item = document.createElement("li"); + item.className = "vf-chatbot-selector__item"; + + if (route.selected) { + item.className += " vf-chatbot-selector__item--selected"; + } + + item.setAttribute("data-vf-js-selector-item", ""); + item.setAttribute("data-route-id", route.id); + item.setAttribute("data-title", route.title); + item.setAttribute("role", "button"); + item.setAttribute("tabindex", "0"); + item.setAttribute("aria-label", `Select ${route.title}`); + + item.innerHTML = ` +
    +
    ${route.title}
    + ${ + route.description + ? `
    ${route.description}
    ` + : "" +} +
    + + + + + `; + + listEl.appendChild(item); + }); + + // Update references and re-bind events ONCE + this.listItems = this.el.querySelectorAll("[data-vf-js-selector-item]"); + this.allServicesItem = this.el.querySelector("[data-route-id='all']"); + + // Only bind list item events (don't call full bindEvents or init) + this.bindListItemEvents(); + + // Handle initial selections for loaded routes + this.handleInitialSelections(); + + // Dispatch event to signal routes are loaded and UI is ready + this.el.dispatchEvent(new CustomEvent("routesloaded")); + } + + // New method to bind only list item events + bindListItemEvents() { + this.listItems.forEach(item => { + // Remove any existing listeners first + item.removeEventListener("click", this.itemClickHandler); + item.removeEventListener("keydown", this.itemKeydownHandler); + + // Create bound handlers + this.itemClickHandler = e => { + e.stopPropagation(); + this.handleItemSelection(item); + }; + + this.itemKeydownHandler = e => { + if (e.key === "Enter" || e.key === " ") { + e.preventDefault(); + e.stopPropagation(); + this.handleItemSelection(item); + } + }; + + // Add new listeners + item.addEventListener("click", this.itemClickHandler); + item.addEventListener("keydown", this.itemKeydownHandler); + }); + } + + // New method to handle initial selections without re-binding events + handleInitialSelections() { + // Don't reset the selectedItems Set here - it may already have pre-selected items + let hasPreSelectedItems = this.selectedItems.size > 0; // Check existing selectedItems first + + // Also check DOM for any additional pre-selected items + this.listItems.forEach(item => { + const itemId = item.getAttribute("data-route-id"); + if (item.classList.contains("vf-chatbot-selector__item--selected")) { + if (itemId !== "all") { + this.selectedItems.add(itemId); + hasPreSelectedItems = true; + } + } + }); + + // Set default selections only if no items are pre-selected + if ( + !hasPreSelectedItems && + this.showAllServices && + this.showAllServicesSelected + ) { + this.selectAllServices(); + } else if (hasPreSelectedItems) { + // If items are pre-selected, ensure "All services" is not selected + this.allServicesSelected = false; + if (this.allServicesItem) { + this.allServicesItem.classList.remove( + "vf-chatbot-selector__item--selected" + ); + } + } + + // Update display + this.updateSelectionDisplay(); + this.updateClearButton(); + } + + // Update bindEvents to store handlers for cleanup + bindEvents() { + // Toggle dropdown + if (this.titleEl) { + this.titleEl.removeEventListener("click", this.toggleDropdownHandler); + this.toggleDropdownHandler = e => { + e.preventDefault(); + e.stopImmediatePropagation(); + this.toggleDropdown(); + }; + this.titleEl.addEventListener("click", this.toggleDropdownHandler); + } + + // Search functionality + if (this.searchEl) { + this.searchEl.removeEventListener("input", this.searchHandler); + this.searchHandler = e => { + e.stopPropagation(); + this.handleSearch(e.target.value); + }; + this.searchEl.addEventListener("input", this.searchHandler); + } + + // Clear all selections + if (this.clearEl) { + this.clearEl.removeEventListener("click", this.clearHandler); + this.clearHandler = e => { + e.preventDefault(); + e.stopPropagation(); + this.clearAllSelections(); + }; + this.clearEl.addEventListener("click", this.clearHandler); + } + + // Bind list items + this.bindListItemEvents(); + + // Document click handler (only add once) + if (!this.documentClickHandler) { + this.documentClickHandler = e => { + if (!this.el.contains(e.target)) { + this.closeDropdown(); + } + }; + document.addEventListener("click", this.documentClickHandler); + } + + // Dropdown click handler + if (this.dropdownEl) { + this.dropdownEl.removeEventListener("click", this.dropdownClickHandler); + this.dropdownClickHandler = e => e.stopPropagation(); + this.dropdownEl.addEventListener("click", this.dropdownClickHandler); + } + } + + toggleDropdown() { + const isExpanded = this.dropdownEl.style.display === "block"; + if (isExpanded) { + this.closeDropdown(); + } else { + this.openDropdown(); + } + } + + openDropdown() { + this.dropdownEl.style.display = "block"; + this.titleEl.classList.add("vf-chatbot-selector__title--expanded"); + } + + closeDropdown() { + if (this.dropdownEl) { + this.dropdownEl.style.display = "none"; + } + if (this.titleEl) { + this.titleEl.classList.remove("vf-chatbot-selector__title--expanded"); + } + } + + handleSearch(query) { + const searchQuery = query.toLowerCase(); + this.listItems.forEach(item => { + const title = item + .querySelector(".vf-chatbot-selector__item-title") + .textContent.toLowerCase(); + + const descriptionEl = item.querySelector( + ".vf-chatbot-selector__item-description" + ); + const description = descriptionEl + ? descriptionEl.textContent.toLowerCase() + : ""; + + const matches = + title.includes(searchQuery) || description.includes(searchQuery); + item.style.display = matches ? "flex" : "none"; + }); + } + + handleItemSelection(item) { + const itemId = item.getAttribute("data-route-id"); + const isAllServices = itemId === "all"; + + if (this.isMultiselect) { + if (isAllServices) { + // If "All services" is clicked, deselect everything else + this.selectAllServices(); + } else { + // If other service is clicked + if (this.selectedItems.has(itemId)) { + // Deselect the item + this.selectedItems.delete(itemId); + item.classList.remove("vf-chatbot-selector__item--selected"); + + // If nothing else is selected, select "All services" + if (this.selectedItems.size === 0) { + this.selectAllServices(); + } + } else { + // Select the item and deselect "All services" + if (this.allServicesSelected) { + this.allServicesItem?.classList.remove( + "vf-chatbot-selector__item--selected" + ); + this.allServicesSelected = false; + } + if (this.selectedItems.size < this.maxMultiSelect) { + this.selectedItems.add(itemId); + item.classList.add("vf-chatbot-selector__item--selected"); + } + } + } + } else { + // Single select mode + this.listItems.forEach(listItem => { + listItem.classList.remove("vf-chatbot-selector__item--selected"); + }); + this.selectedItems.clear(); + this.selectedItems.add(itemId); + item.classList.add("vf-chatbot-selector__item--selected"); + + // Update title text immediately + const title = item.querySelector(".vf-chatbot-selector__item-title") + .textContent; + const titleText = this.el.querySelector( + ".vf-chatbot-selector__title-text" + ); + if (titleText) { + titleText.textContent = title; + } + + this.closeDropdown(); + } + + this.updateSelectionDisplay(); + this.updateClearButton(); + this.dispatchSelectionEvent(); + } + + handleItemClick(item) { + const itemId = item.getAttribute("data-route-id"); + + if (itemId === "all") { + // Handle "All services" selection + this.selectAllServices(); + } else { + // Handle individual item selection + if (this.isMultiselect) { + // Multi-select logic + if (this.selectedItems.has(itemId)) { + // Deselect item + this.selectedItems.delete(itemId); + item.classList.remove("vf-chatbot-selector__item--selected"); + } else { + // Select item and ensure we don't exceed max selection + if (this.selectedItems.size < this.maxMultiSelect) { + this.selectedItems.add(itemId); + item.classList.add("vf-chatbot-selector__item--selected"); + } + } + + // If we deselected all individual items, select "All services" + if (this.selectedItems.size === 0 && this.showAllServices) { + this.selectAllServices(); + } else { + // Deselect "All services" when individual items are selected + this.allServicesSelected = false; + if (this.allServicesItem) { + this.allServicesItem.classList.remove( + "vf-chatbot-selector__item--selected" + ); + } + } + } else { + // Single-select logic + // Clear all previous selections + this.selectedItems.clear(); + this.listItems.forEach(li => { + li.classList.remove("vf-chatbot-selector__item--selected"); + }); + + // Select the clicked item + this.selectedItems.add(itemId); + item.classList.add("vf-chatbot-selector__item--selected"); + + // Deselect "All services" + this.allServicesSelected = false; + + // Close dropdown for single-select + this.closeDropdown(); + } + } + + // Update display and clear button + this.updateSelectionDisplay(); + this.updateClearButton(); + } + + setSelection(selectedItems) { + // Deselect all first + this.selectedItems.clear(); + this.listItems.forEach(item => { + item.classList.remove("vf-chatbot-selector__item--selected"); + }); + + // If "all" is selected + if (selectedItems.includes("all")) { + this.selectAllServices(); + } else { + selectedItems.forEach(id => { + const item = this.el.querySelector(`[data-route-id="${id}"]`); + if (item) { + item.classList.add("vf-chatbot-selector__item--selected"); + this.selectedItems.add(id); + } + }); + this.allServicesSelected = false; + if (this.allServicesItem) { + this.allServicesItem.classList.remove("vf-chatbot-selector__item--selected"); + } + } + this.updateSelectionDisplay(); + this.updateClearButton(); + this.dispatchSelectionEvent(); + } + + selectAllServices() { + if (!this.showAllServices) return; + + // Clear individual selections + this.selectedItems.clear(); + + // Remove selected class from all individual items + this.listItems.forEach(item => { + const itemId = item.getAttribute("data-route-id"); + if (itemId !== "all") { + item.classList.remove("vf-chatbot-selector__item--selected"); + } + }); + + // Select "All services" + this.allServicesSelected = true; + if (this.allServicesItem) { + this.allServicesItem.classList.add("vf-chatbot-selector__item--selected"); + } + } + + clearAllSelections() { + // Clear everything and select "All services" + this.selectAllServices(); + this.updateSelectionDisplay(); + this.updateClearButton(); + this.dispatchSelectionEvent(); + } + + updateSelectionDisplay() { + const titleText = this.el.querySelector(".vf-chatbot-selector__title-text"); + if (!titleText) return; + + if (this.allServicesSelected) { + titleText.textContent = "All services"; + } else if (this.selectedItems.size === 0) { + titleText.textContent = "Select services"; + } else if (!this.isMultiselect) { + const selectedId = Array.from(this.selectedItems)[0]; + const selectedItem = this.el.querySelector( + `[data-route-id="${selectedId}"]` + ); + if (selectedItem) { + const title = selectedItem.querySelector( + ".vf-chatbot-selector__item-title" + ).textContent; + titleText.textContent = title; + } + } else { + titleText.textContent = `${this.selectedItems.size} service${ + this.selectedItems.size > 1 ? "s" : "" + } selected`; + } + } + + dispatchSelectionEvent() { + this.el.dispatchEvent( + new CustomEvent("routeselection", { + detail: { + selectedItems: this.allServicesSelected + ? ["all"] + : Array.from(this.selectedItems), + isMultiselect: this.isMultiselect, + isAllServices: this.allServicesSelected + } + }) + ); + } + + updateClearButton() { + if (this.clearEl) { + if (this.selectedItems.size > 0) { + this.clearEl.classList.add("vf-chatbot-selector__clear--active"); + } else { + this.clearEl.classList.remove("vf-chatbot-selector__clear--active"); + } + } + } +} + +// Function to initialize the component +export function initVFChatbotSelector(element) { + return new VFChatbotSelector(element); +} diff --git a/src/assets/vf-chatbot-sources/vf-chatbot-sources.js b/src/assets/vf-chatbot-sources/vf-chatbot-sources.js new file mode 100644 index 0000000..4b7ce7e --- /dev/null +++ b/src/assets/vf-chatbot-sources/vf-chatbot-sources.js @@ -0,0 +1,71 @@ +function VFChatbotSources(element) { + this.el = element; +} + +function initVFChatbotSources(sourceHTML) { + if (!sourceHTML) { + console.error("Message is required for VFChatbotSources"); + return null; + } + + const el = document.createElement("div"); + el.className = "vf-chatbot-sources-toggle"; + el.innerHTML = ` + +
    +
    + +
    +
      ${sourceHTML}
    +
    + `; + + // Toggle logic + const toggleBtn = el.querySelector("[data-vf-js-chatbot-sources-toggle]"); + const sourcesDiv = el.querySelector("[data-vf-js-chatbot-sources]"); + const hideBtn = el.querySelector("[data-vf-js-chatbot-sources-hide]"); + + toggleBtn.addEventListener("click", () => { + sourcesDiv.classList.remove("vf-chatbot-sources--collapsed"); + toggleBtn.style.display = "none"; + // Scroll the sources div into view + sourcesDiv.scrollIntoView({ behavior: "smooth", block: "center" }); + }); + + hideBtn.addEventListener("click", () => { + sourcesDiv.classList.add("vf-chatbot-sources--collapsed"); + toggleBtn.style.display = ""; + }); + + return new VFChatbotSources(el); +} + +export { VFChatbotSources, initVFChatbotSources }; diff --git a/src/assets/vf-chatbot-standalone/vf-chatbot-standalone.js b/src/assets/vf-chatbot-standalone/vf-chatbot-standalone.js new file mode 100644 index 0000000..da6623f --- /dev/null +++ b/src/assets/vf-chatbot-standalone/vf-chatbot-standalone.js @@ -0,0 +1,1003 @@ +// vf-chatbot-standalone.js +import { initVFChatbotSources } from "../vf-chatbot-sources/vf-chatbot-sources.js"; +import { VFChatbotFeedback } from "../vf-chatbot-feedback/vf-chatbot-feedback.js"; +import { initVFChatbotSelector } from "../vf-chatbot-selector/vf-chatbot-selector.js"; +import { initVFChatbotWelcome } from "../vf-chatbot-welcome/vf-chatbot-welcome.js"; + +class VFChatbotStandalone { + constructor(element, customConfig = {}) { + + this.container = element; + this.loadConfiguration(customConfig); + this.setupDOMElements(); + this.setupState(); + this.setupEventHandlers(); + this.init(); + } + + loadConfiguration(customConfig) { + // Get config from data-vf-chatbot-config attribute + let dataConfig = {}; + const attr = this.container.getAttribute("data-vf-chatbot-config"); + if (attr) { + try { + dataConfig = JSON.parse(attr); + } catch (e) { + console.warn("Invalid JSON in data-vf-chatbot-config:", e); + } + } + + // Default configuration + const defaultConfig = { + type: "standalone", + title: "AI Assistant", + welcome_logo: true, + welcome_message: "Welcome! I'm here to help", + welcome_logo_alt: "AI Assistant", + welcome_suggestions_title: "Try asking me:", + input_placeholder: "Ask me ...", + welcome_max_suggestions: 4, + disclaimer: + 'Disclaimer: This chatbot is designed to assist you with general information and basic inquiries. See our disclaimer notes.', + footnote: + 'Review AI generated content for accuracy. Leave feedback.', + icons: { + assistant_avatar: + "../../assets/vf-chatbot/assets/vf-chatbot--icon-16x16-dark-green.svg", + user_avatar: + "../../assets/vf-chatbot/assets/vf-chatbot--avatar-user.svg", + send_button: "../../assets/vf-chatbot/assets/vf-chatbot--icon-send.svg", + main_logo_url: + "../../assets/vf-chatbot/assets/vf-chatbot--icon-32x32-dark-green.svg" + }, + + api: { + chat_endpoint: false, //"/api/chat", // Disabled to use fallback responses + feedback_endpoint: false, //"/api/feedback", + qa_data_url: "../../assets/vf-chatbot/assets/vf-chatbot-qa.json", + headers: { + "Content-Type": "application/json", + Authorization: "Bearer your-token" + }, + timeout: 10000 + }, + + features: { + enable_welcome: true, + enable_feedback: true, + enable_sources: true, + enable_sources_custom_format: false, + enable_welcome_suggestions: true, + enable_typing_indicator: true, + enable_disclaimer: true, + enable_predefined_qa: true, + enable_fallback_responses: true, + enable_qa_data_loading: true, + enable_instant_feedback: false + }, + + behavior: { + auto_scroll: true, + typing_delay: 800, + show_scrollbar: false + }, + + selectorContext: { + chatbotRoutes: { + multiSelect: true, + maxMultiSelect: 3, + showSearch: true, + showSearchThreshold: 5, + showAllServices: true, + showAllServicesSelected: true, + routes: + "../../assets/vf-chatbot/assets/vf-chatbot-selector-services.json", + placeholder: "Select services", + title: "Services", + selector_logo_url: "../../assets/vf-chatbot/assets/vf-chatbot--icon-24x24-dark-green.svg", + selector_logo_title: "AI Assistant" + } + }, + + handlers: { + on_message_send: "handleMessageSend", + on_response_receive: "handleResponseReceive", + on_feedback_submit: "handleFeedbackSubmit", + on_suggestion_click: "handleSuggestionClick", + on_error: "handleError", + on_conversation_start: "handleConversationStart", + on_conversation_end: "handleConversationEnd" + }, + + feedback_options: { + positive: [ + { id: "accurate", label: "Accurate" }, + { id: "easy", label: "Easy to understand" }, + { id: "formatted", label: "Well formatted" } + ], + negative: [ + { id: "inaccurate", label: "Inaccurate answer" }, + { id: "nocontext", label: "Did not use context" }, + { id: "poorformat", label: "Poorly formatted" } + ] + } + }; + + // Merge configurations: default < data-attribute < custom + this.config = this.deepMerge(defaultConfig, dataConfig, customConfig); + console.log("Final merged config:", this.config); + } + + deepMerge(...objects) { + return objects.reduce((prev, obj) => { + // ✅ FIX: Skip null/undefined objects + if (!obj || typeof obj !== "object") { + return prev; + } + + Object.keys(obj).forEach(key => { + const pVal = prev[key]; + const oVal = obj[key]; + + // ✅ FIX: Skip undefined values to maintain priority + if (oVal === undefined) { + return; + } + + if (Array.isArray(pVal) && Array.isArray(oVal)) { + prev[key] = pVal.concat(...oVal); + } else if ( + pVal && + oVal && + typeof pVal === "object" && + typeof oVal === "object" && + !Array.isArray(pVal) && + !Array.isArray(oVal) + ) { + prev[key] = this.deepMerge(pVal, oVal); + } else { + // ✅ FIX: Only assign if oVal is not null/undefined + if (oVal !== null && oVal !== undefined) { + prev[key] = oVal; + } + } + }); + return prev; + }, {}); + } + + setupDOMElements() { + this.welcomeScreen = this.container.querySelector( + "[data-vf-js-chatbot-welcome]" + ); + this.messagesContainer = this.container.querySelector( + "[data-vf-js-chatbot-standalone-messages]" + ); + this.input = this.container.querySelector( + "[data-vf-js-chatbot-standalone-input]" + ); + this.sendBtn = this.container.querySelector( + "[data-vf-js-chatbot-standalone-send]" + ); + this.disclaimer = this.container.querySelector( + "[data-vf-js-chatbot-standalone-disclaimer]" + ); + this.disclaimerCloseBtn = this.disclaimer?.querySelector( + ".vf-button--dismiss" + ); + this.selectorEl = this.container.querySelector( + "[data-vf-js-chatbot-selector]" + ); + + // Templates + this.userTemplate = this.container.querySelector("#user-message-template"); + this.assistantTemplate = this.container.querySelector( + "#assistant-message-template" + ); + this.loadingTemplate = this.container.querySelector( + "#loading-indicator-template" + ); + this.actionPromptsTemplate = this.container.querySelector( + "#action-prompts-template" + ); + this.singlePromptTemplate = this.container.querySelector( + "#single-action-prompt-template" + ); + + // Apply configuration to DOM elements + this.applyConfigurationToDOM(); + } + + applyConfigurationToDOM() { + // Update input placeholder + if (this.input) { + this.input.placeholder = this.config.input_placeholder; + // Initialize textarea height + this.autoResizeTextarea(); + } + + // Update auto-scroll behavior + if (this.messagesContainer) { + this.messagesContainer.dataset.autoScroll = this.config.behavior.auto_scroll; + } + } + setupState() { + this.currentAssistant = ""; + this.conversationId = this.generateConversationId(); + this.messageHistory = []; + this.loadingIndicator = null; + this.apiResponseListener = null; + + // Load Q&A data if using fallback responses + this.loadQADataAndPopulateSuggestions(); + } + + setupEventHandlers() { + // Setup global event handlers for custom functions + this.setupCustomEventHandlers(); + + // Bind internal events + this.bindEvents(); + } + + setupCustomEventHandlers() { + // Create wrapper functions that call user-defined handlers and emit events + const handlers = this.config.handlers; + + // Message send handler + this.onMessageSend = message => { + const eventData = { + message, + conversationId: this.conversationId, + timestamp: Date.now() + }; + + this.emitEvent("vf-chatbot:message-send", eventData); + + if ( + handlers.on_message_send && + typeof window[handlers.on_message_send] === "function" + ) { + window[handlers.on_message_send](eventData); + } + }; + + // Response receive handler + this.onResponseReceive = (response, sources, prompts) => { + const eventData = { + response, + sources, + prompts, + conversationId: this.conversationId, + timestamp: Date.now() + }; + + this.emitEvent("vf-chatbot:response-receive", eventData); + + if ( + handlers.on_response_receive && + typeof window[handlers.on_response_receive] === "function" + ) { + window[handlers.on_response_receive](eventData); + } + }; + + // Feedback submit handler + this.onFeedbackSubmit = ( + messageId, + feedbackType, + feedbackText = "", + feedbackComment = "" + ) => { + const eventData = { + messageId, + feedbackType, + feedbackText, + feedbackComment, + conversationId: this.conversationId, + timestamp: Date.now() + }; + + this.emitEvent("vf-chatbot:feedback-submit", eventData); + + // Call API if configured + if (this.config.api.feedback_endpoint) { + this.submitFeedbackToAPI(eventData); + } + + if ( + handlers.on_feedback_submit && + typeof window[handlers.on_feedback_submit] === "function" + ) { + window[handlers.on_feedback_submit](eventData); + } + }; + + // Suggestion click handler + this.onSuggestionClick = suggestion => { + const eventData = { + suggestion, + conversationId: this.conversationId, + timestamp: Date.now() + }; + + this.emitEvent("vf-chatbot:suggestion-click", eventData); + + if ( + handlers.on_suggestion_click && + typeof window[handlers.on_suggestion_click] === "function" + ) { + window[handlers.on_suggestion_click](eventData); + } + }; + + // Error handler + this.onError = (error, context) => { + const eventData = { + error, + context, + conversationId: this.conversationId, + timestamp: Date.now() + }; + + this.emitEvent("vf-chatbot:error", eventData); + + if ( + handlers.on_error && + typeof window[handlers.on_error] === "function" + ) { + window[handlers.on_error](eventData); + } + }; + + // Conversation start handler + this.onConversationStart = () => { + const eventData = { + conversationId: this.conversationId, + timestamp: Date.now() + }; + + this.emitEvent("vf-chatbot:conversation-start", eventData); + + if ( + handlers.on_conversation_start && + typeof window[handlers.on_conversation_start] === "function" + ) { + window[handlers.on_conversation_start](eventData); + } + }; + + // Conversation end handler + this.onConversationEnd = () => { + const eventData = { + conversationId: this.conversationId, + messageCount: this.messageHistory.length, + timestamp: Date.now() + }; + + this.emitEvent("vf-chatbot:conversation-end", eventData); + + if ( + handlers.on_conversation_end && + typeof window[handlers.on_conversation_end] === "function" + ) { + window[handlers.on_conversation_end](eventData); + } + }; + } + + emitEvent(eventName, data) { + const event = new CustomEvent(eventName, { + bubbles: true, + detail: data + }); + this.container.dispatchEvent(event); + } + + generateConversationId() { + return `conv_${Date.now()}_${Math.random() + .toString(36) + .substr(2, 9)}`; + } + + async init() { + // Initialize selector if present + if (this.selectorEl) { + initVFChatbotSelector(this.selectorEl); + this.selectorEl.addEventListener("routeselection", e => { + this.handleRouteSelection(e.detail); + }); + } + + if (this.welcomeScreen && this.config.features.enable_welcome_suggestions) { + try { + initVFChatbotWelcome(this.welcomeScreen); + // await this.welcomeComponent.init(); + this.welcomeScreen.addEventListener( + "vf-chatbot-welcome:suggestion-click", + event => { + const question = event.detail.question; + this.onSuggestionClick(question); + this.showChatInterface(); + this.sendUserMessage(question); + } + ); + this.welcomeScreen.scrollTop = this.welcomeScreen.scrollHeight; + } catch (error) { + console.error("Failed to initialize welcome component:", error); + this.onError(error, "welcome_component_init"); + } + } + // } + + // Trigger conversation start + this.onConversationStart(); + + console.log("Standalone chatbot initialized successfully"); + } + + async loadQADataAndPopulateSuggestions() { + // Skip loading if Q&A data loading is disabled + if (!this.config.features.enable_qa_data_loading) { + console.log("Q&A data loading is disabled"); + return; + } + + // Skip loading if no URL is configured + if (!this.config.api.qa_data_url) { + console.log("No Q&A data URL configured"); + return; + } + try { + const response = await fetch(this.config.api.qa_data_url); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + const data = await response.json(); + + // Load predefined Q&A if enabled + if (this.config.features.enable_predefined_qa && data.predefinedQA) { + this.qaData = data.predefinedQA; + } else { + console.log("Predefined Q&A loading is disabled or no data available"); + } + + // Load fallback responses if enabled + if ( + this.config.features.enable_fallback_responses && + data.fallbackResponses && + data.fallbackResponses.length > 0 + ) { + this.fallbackResponses = data.fallbackResponses; + } else { + console.log("Using default fallback responses"); + } + } catch (error) { + console.error("Failed to load Q&A data:", error); + this.onError(error, "qa_data_load"); + } + } + + handleRouteSelection(detail) { + const { selectedItems } = detail; + if (selectedItems && selectedItems.length > 0) { + this.currentAssistant = selectedItems.join(", "); + console.log(`Switched to ${this.currentAssistant} assistant`); + + this.emitEvent("vf-chatbot:assistant-change", { + selectedAssistants: this.currentAssistant, + conversationId: this.conversationId + }); + } + } + + bindEvents() { + // Send message events + this.sendBtn?.addEventListener("click", () => this.sendMessage()); + + this.input?.addEventListener("keypress", e => { + if (e.key === "Enter" && !e.shiftKey) { + e.preventDefault(); + this.sendMessage(); + } + }); + + // Auto-resize textarea functionality + this.input?.addEventListener("input", () => this.autoResizeTextarea()); + this.input?.addEventListener("paste", () => { + // Use setTimeout to ensure the pasted content is processed + setTimeout(() => this.autoResizeTextarea(), 0); + }); + + // Disclaimer close + if (this.disclaimer && this.disclaimerCloseBtn) { + this.disclaimerCloseBtn.addEventListener("click", () => { + this.disclaimer.classList.add("vf-u-display-none"); + }); + } + + // Global feedback event listener + this.container.addEventListener("vf-chatbot-feedback:submit", event => { + const { + messageId, + feedbackType, + feedbackText, + feedbackComment + } = event.detail; + this.onFeedbackSubmit( + messageId, + feedbackType, + feedbackText, + feedbackComment + ); + }); + + // Action prompt click listener + this.container.addEventListener("vf-chatbot-action-prompt:click", event => { + const { text } = event.detail; + this.sendUserMessage(text); + }); + } + + sendMessage() { + if (!this.input || !this.input.value.trim()) return; + + const text = this.input.value.trim(); + this.showChatInterface(); + this.sendUserMessage(text); + } + + autoResizeTextarea() { + if (!this.input) return; + + // Reset height to auto to get the actual scroll height + // this.input.style.height = 'auto'; + // Get computed styles + const computedStyle = window.getComputedStyle(this.input); + const lineHeight = parseFloat(computedStyle.lineHeight) || 24; + const paddingTop = parseFloat(computedStyle.paddingTop) || 0; + const paddingBottom = parseFloat(computedStyle.paddingBottom) || 0; + const borderTop = parseFloat(computedStyle.borderTopWidth) || 0; + const borderBottom = parseFloat(computedStyle.borderBottomWidth) || 0; + + // Calculate heights more accurately + const extraHeight = paddingTop + paddingBottom + borderTop + borderBottom; + const minHeight = lineHeight + extraHeight; // Height for 1 row + const maxHeight = lineHeight * 5 + extraHeight; // Height for 5 rows + + // Get the scroll height (content height) + const scrollHeight = this.input.scrollHeight; + + // Calculate the new height, constrained by min and max + let newHeight = Math.max(minHeight, scrollHeight); + + if (newHeight >= maxHeight) { + // If content exceeds 5 rows, set to max height and enable scrolling + newHeight = maxHeight; + this.input.classList.add("vf-chatbot-standalone__input--scrollable"); + } else { + // Remove scrollable class if content fits within 5 rows + this.input.classList.remove("vf-chatbot-standalone__input--scrollable"); + } + + // Apply the new height + this.input.style.height = newHeight + "px"; + } + + showChatInterface() { + if (this.welcomeScreen) { + this.welcomeScreen.style.display = "none"; + } + if (this.messagesContainer) { + this.messagesContainer.style.display = "flex"; + } + if (this.input) { + this.input.focus(); + } + } + + sendUserMessage(text) { + if (!text || !this.messagesContainer) return; + + // Add to message history + this.messageHistory.push({ + type: "user", + content: text, + timestamp: Date.now() + }); + + // Trigger message send event + this.onMessageSend(text); + + // Create user message element + const userMessage = this.userTemplate.content.cloneNode(true); + const content = userMessage.querySelector( + ".vf-chatbot-message__content-prompt" + ); + + content.textContent = text; + + + // Update avatar if configured + const avatar = userMessage.querySelector("img"); + if (avatar) { + avatar.src = this.config.icons.user_avatar; + } + + this.messagesContainer.appendChild(userMessage); + + // Clear input + if (this.input) { + this.input.value = ""; + this.input.style.height = "auto"; + // Reset textarea to minimum height and remove scrollable class + this.input.classList.remove("vf-chatbot-standalone__input--scrollable"); + this.autoResizeTextarea(); + } + + this.scrollToBottom(); + this.processUserMessage(text); + } + + async processUserMessage(text) { + this.setLoadingState(true); + + try { + // Check for predefined answers first + if (this.qaData && this.qaData[text]) { + setTimeout(() => { + const answer = this.qaData[text]; + this.addAssistantResponse( + answer.answer || answer.html, + answer.sources || [], + answer.prompts || [] + ); + this.setLoadingState(false); + }, this.config.behavior.typing_delay); + return; + } + + // Try API call if configured + if (this.config.api.chat_endpoint) { + const response = await this.callChatAPI(text); + this.addAssistantResponse( + response.response, + response.sources || [], + response.prompts || [] + ); + this.setLoadingState(false); + } else { + // Use fallback response + setTimeout(() => { + let fallbackResponse; + + if (this.fallbackResponses && this.fallbackResponses.length > 0) { + fallbackResponse = this.fallbackResponses[ + Math.floor(Math.random() * this.fallbackResponses.length) + ]; + + this.addAssistantResponse( + fallbackResponse.answer, + [], + fallbackResponse.prompts || [] + ); + } + this.setLoadingState(false); + }, this.config.behavior.typing_delay); + } + } catch (error) { + console.error("Error processing message:", error); + this.onError(error, "message_processing"); + this.setLoadingState(false); + // this.showErrorMessage(); + } + } + + async callChatAPI(message) { + const requestData = { + message, + assistant: this.currentAssistant, + conversationId: this.conversationId, + messageHistory: this.config.features.enable_conversation_history + ? this.messageHistory + : [] + }; + + const response = await fetch(this.config.api.chat_endpoint, { + method: "POST", + headers: this.config.api.headers, + body: JSON.stringify(requestData), + signal: AbortSignal.timeout(this.config.api.timeout) + }); + + if (!response.ok) { + throw new Error( + `API call failed: ${response.status} ${response.statusText}` + ); + } + + return await response.json(); + } + + async submitFeedbackToAPI(feedbackData) { + try { + await fetch(this.config.api.feedback_endpoint, { + method: "POST", + headers: this.config.api.headers, + body: JSON.stringify(feedbackData) + }); + } catch (error) { + console.error("Failed to submit feedback:", error); + this.onError(error, "feedback_submission"); + } + } + + addAssistantResponse(text, sources = [], prompts = []) { + if (!this.assistantTemplate || !this.messagesContainer) return; + + const messageId = `msg_${Date.now()}_${Math.random() + .toString(36) + .substr(2, 9)}`; + + // Add to message history + this.messageHistory.push({ + type: "assistant", + content: text, + sources, + prompts, + messageId, + timestamp: Date.now() + }); + + // Trigger response receive event + this.onResponseReceive(text, sources, prompts); + + const assistantMessage = this.assistantTemplate.content.cloneNode(true); + const content = assistantMessage.querySelector( + ".vf-chatbot-message__content-prompt" + ); + + content.textContent = text; + + + // Update avatar if configured + const avatar = assistantMessage.querySelector("img"); + if (avatar) { + avatar.src = this.config.icons.assistant_avatar; + } + + // Initialize feedback if enabled + if (this.config.features.enable_feedback) { + const feedbackContainer = assistantMessage.querySelector( + "[data-vf-js-chatbot-feedback]" + ); + if (feedbackContainer) { + feedbackContainer.dataset.messageId = messageId; + + // Pass configuration to VFChatbotFeedback component + new VFChatbotFeedback(feedbackContainer, messageId, { + enable_instant_feedback: this.config.features.enable_instant_feedback, + api_endpoint: this.config.api.feedback_endpoint, + positiveOptions: this.config.feedback_options?.positive, + negativeOptions: this.config.feedback_options?.negative + }); + } + } + + // Add sources if enabled and present + if ( + this.config.features.enable_sources && + sources && + (sources.length > 0 || sources != "") + ) { + const feedbackContainer = assistantMessage.querySelector( + "[data-vf-js-chatbot-feedback]" + ); + let sourceHTML = ""; + if ( + !this.config.features.enable_sources_custom_format && + sources.length > 0 + ) { + sourceHTML = sources + .map( + message => ` +
  • +
    ${message.domain}
    + + ${message.title} + +
    ${message.description}
    +
  • + ` + ) + .join(""); + } else if ( + this.config.features.enable_sources_custom_format && + sources != "" + ) { + sourceHTML = sources; + } + if (sourceHTML != "") { + const sourcesEl = initVFChatbotSources(sourceHTML); + assistantMessage.insertBefore(sourcesEl.el, feedbackContainer); + } + } + + // Add prompts if present + if (prompts && prompts.length > 0) { + this.addActionPrompts(assistantMessage, prompts, content); + } + + this.messagesContainer.appendChild(assistantMessage); + this.scrollToBottom(); + + return messageId; + } + + addActionPrompts(assistantMessage, prompts, contentElement) { + if (!this.actionPromptsTemplate || !this.singlePromptTemplate) return; + + const promptsContainer = this.actionPromptsTemplate.content.cloneNode(true); + const promptsList = promptsContainer.querySelector( + "[data-vf-js-action-prompts-list]" + ); + + prompts.forEach(prompt => { + const promptEl = this.singlePromptTemplate.content.cloneNode(true); + const link = promptEl.querySelector(".vf-chatbot-action-prompt__link"); + + if (link) { + link.href = prompt.action_url || "#"; + link.textContent = prompt.action_text; + + // Set target and add accessibility attributes + if (prompt.action_url?.startsWith("tel:")) { + link.target = "_self"; + } else if (prompt.action_url) { + link.target = "_blank"; + // Add aria-label for screen readers to indicate it opens in a new tab + link.setAttribute( + "aria-label", + `${prompt.action_text} (opens in new tab)` + ); + // Add rel="noopener noreferrer" for security + link.rel = "noopener noreferrer"; + } + + if (!prompt.action_url) { + link.addEventListener("click", e => { + e.preventDefault(); + this.emitEvent("vf-chatbot-action-prompt:click", { + text: prompt.action_text + }); + }); + } + } + + promptsList.appendChild(promptEl); + }); + + contentElement.appendChild(promptsContainer); + } + + setLoadingState(isLoading) { + + if (!this.config.features.enable_typing_indicator) return; + + if (isLoading) { + if (!this.loadingIndicator && this.loadingTemplate) { + const loadingContent = this.loadingTemplate.content.cloneNode(true); + this.loadingIndicator = loadingContent.firstElementChild; + + // Update avatar + const avatar = this.loadingIndicator.querySelector("img"); + if (avatar) { + avatar.src = this.config.icons.assistant_avatar; + } + + this.messagesContainer.appendChild(this.loadingIndicator); + } else if (this.loadingIndicator && !this.loadingIndicator.parentNode) { + // Re-append if it was removed from DOM + this.messagesContainer.appendChild(this.loadingIndicator); + } + + if (this.loadingIndicator) { + this.loadingIndicator.style.display = "block"; + } + } else { + if (this.loadingIndicator) { + this.loadingIndicator.style.display = "none"; + this.messagesContainer.removeChild(this.loadingIndicator); + } + } + + // Disable/enable controls + if (this.sendBtn) this.sendBtn.disabled = isLoading; + // if (this.input) this.input.disabled = isLoading; + + this.scrollToBottom(); + } + + scrollToBottom() { + if (this.config.behavior.auto_scroll && this.messagesContainer) { + this.messagesContainer.scrollTop = this.messagesContainer.scrollHeight; + } + } + + // Public API methods + resetConversation() { + this.messageHistory = []; + this.conversationId = this.generateConversationId(); + + if (this.messagesContainer) { + this.messagesContainer.innerHTML = ""; + } + + if (this.welcomeScreen && this.config.features.enable_welcome_suggestions) { + this.welcomeScreen.style.display = "block"; + this.messagesContainer.style.display = "none"; + } + + this.onConversationStart(); + } + + updateConfiguration(newConfig) { + this.config = this.deepMerge(this.config, newConfig); + this.applyConfigurationToDOM(); + // this.applyTheme(); + } + + getConfiguration() { + return { ...this.config }; + } + + getConversationHistory() { + return [...this.messageHistory]; + } + + destroy() { + this.onConversationEnd(); + + // Remove event listeners + this.sendBtn?.removeEventListener("click", this.sendMessage); + this.input?.removeEventListener("keypress", this.handleKeyPress); + + // Clean up API response listener + if (this.apiResponseListener) { + this.container.removeEventListener( + "vf-chatbot:api-response", + this.apiResponseListener + ); + } + } +} + +// Global initialization function with configuration support +function initVFChatbotStandalone(customConfig = {}) { + console.log("Looking for standalone chatbot elements..."); + const chatbotElements = document.querySelectorAll( + "[data-vf-js-chatbot-standalone-container]" + ); + + if (chatbotElements.length === 0) { + console.warn("No standalone chatbot elements found on page"); + return []; + } + + const instances = []; + chatbotElements.forEach(element => { + instances.push(new VFChatbotStandalone(element, customConfig)); + }); + + return instances; +} + +// Global exposure +if (typeof window !== "undefined") { + window.VFChatbotStandalone = VFChatbotStandalone; + window.initVFChatbotStandalone = initVFChatbotStandalone; +} + +export { VFChatbotStandalone, initVFChatbotStandalone }; diff --git a/src/assets/vf-chatbot-welcome/vf-chatbot-welcome.js b/src/assets/vf-chatbot-welcome/vf-chatbot-welcome.js new file mode 100644 index 0000000..952693f --- /dev/null +++ b/src/assets/vf-chatbot-welcome/vf-chatbot-welcome.js @@ -0,0 +1,263 @@ +// vf-chatbot-welcome.js + +export class VFChatbotWelcome { + constructor(element, options = {}) { + this.el = element; + this.suggestionsGrid = this.el.querySelector( + "[data-vf-js-chatbot-welcome-suggestions-grid]" + ); + this.qaData = null; + this.predefinedQA = null; + this.fallbackResponses = null; + this.boundHandleSuggestionClick = this.handleSuggestionClick.bind(this); + + // Configuration from data attributes with fallbacks + this.config = { + welcome_max_suggestions: + options.welcome_max_suggestions || + parseInt(this.el.dataset.maxQuestions, 10) || + 4, + enable_qa_data_loading: + options.enable_qa_data_loading !== undefined + ? options.enable_qa_data_loading + : this.el.dataset.enableQaDataLoading !== "false", + enable_predefined_qa: + options.enable_predefined_qa !== undefined + ? options.enable_predefined_qa + : this.el.dataset.enablePredefinedQa !== "false", + enable_fallback_responses: + options.enable_fallback_responses !== undefined + ? options.enable_fallback_responses + : this.el.dataset.enableFallbackResponses !== "false", + qa_data_url: + this.el.dataset.qaDataUrl + }; + this.init(); + } + + async init() { + try { + await this.loadQAData(); + this.populateSuggestions(); + this.bindEvents(); + return Promise.resolve(); + } catch (error) { + console.error("Failed to initialize welcome component:", error); + return Promise.reject(error); + } + } + + async loadQAData() { + // If Q&A data loading is disabled, don't load any data + if (!this.config.enable_qa_data_loading) { + console.log("Q&A data loading disabled for welcome component"); + return; + } + + // Check if qa_data_url is provided + if (!this.config.qa_data_url) { + console.warn("No Q&A data URL provided for welcome component"); + return; + } + + try { + console.log(`Loading Q&A data from: ${this.config.qa_data_url}`); + const response = await fetch(this.config.qa_data_url); + + if (!response.ok) { + throw new Error( + `Failed to fetch Q&A data: ${response.status} ${response.statusText}` + ); + } + + const data = await response.json(); + this.qaData = data; + + // Store predefined Q&A if enabled + if (this.config.enable_predefined_qa && data.predefinedQA) { + this.predefinedQA = data.predefinedQA; + console.log("Predefined Q&A loaded successfully"); + } + + // Store fallback responses if enabled + if ( + this.config.enable_fallback_responses && + data.fallbackResponses && + data.fallbackResponses.length > 0 + ) { + this.fallbackResponses = data.fallbackResponses; + console.log("Fallback responses loaded successfully"); + } + } catch (error) { + console.error("Failed to load Q&A data:", error); + // Provide default fallback responses if loading fails + this.setDefaultFallbackResponses(); + } + } + + setDefaultFallbackResponses() { + if (this.config.enable_fallback_responses) { + this.fallbackResponses = [ + { + answer: + "I'm here to help with your questions. Please try asking about our services or general information.", + sources: [], + prompts: [ + "What services do you offer?", + "How can I get started?", + "Tell me more about your organization" + ] + }, + { + answer: + "I'm an AI assistant designed to help with information and basic inquiries. How can I assist you today?", + sources: [], + prompts: [ + "What can you help me with?", + "How do I contact support?", + "Where can I find more information?" + ] + } + ]; + console.log("Using default fallback responses for welcome component"); + } + } + + populateSuggestions() { + if (!this.suggestionsGrid) return; + + // Clear existing suggestions + this.suggestionsGrid.innerHTML = ""; + + let questionsToShow = []; + + // Try to get questions from predefined Q&A first + if (this.config.enable_predefined_qa && this.predefinedQA) { + questionsToShow = Object.keys(this.predefinedQA); + } + // If no predefined Q&A, try to get prompts from fallback responses + else if (this.config.enable_fallback_responses && this.fallbackResponses) { + questionsToShow = this.fallbackResponses + .filter(response => response.prompts && response.prompts.length > 0) + .flatMap(response => response.prompts); + } + + // If we still don't have questions, show a default message + if (questionsToShow.length === 0) { + console.log("No questions available for welcome suggestions"); + return; + } + + // Get random questions + const randomQuestions = questionsToShow + .sort(() => 0.5 - Math.random()) + .slice(0, this.config.welcome_max_suggestions); + + // Create suggestion elements using template-based rendering + randomQuestions.forEach((question) => { + const suggestionTemplate = document.querySelector( + "#welcome-suggestion-template" + ); + if (suggestionTemplate) { + const suggestionEl = suggestionTemplate.content.cloneNode(true); + const link = suggestionEl.querySelector( + ".vf-chatbot-action-prompt__link" + ); + const wrapper = suggestionEl.querySelector(".vf-chatbot-action-prompt"); + + if (link && wrapper) { + link.textContent = question; + wrapper.setAttribute( + "data-vf-js-chatbot-welcome-suggestion", + question + ); + + this.suggestionsGrid.appendChild(suggestionEl); + } + } else { + console.warn("Welcome suggestion template not found"); + } + }); + } + + bindEvents() { + // Remove existing event listener if any + this.suggestionsGrid?.removeEventListener( + "click", + this.boundHandleSuggestionClick + ); + + // Add single event listener using event delegation + this.suggestionsGrid?.addEventListener( + "click", + this.boundHandleSuggestionClick + ); + } + + handleSuggestionClick(e) { + e.preventDefault(); + + const suggestionEl = e.target.closest( + "[data-vf-js-chatbot-welcome-suggestion]" + ); + if (!suggestionEl) return; + + const question = suggestionEl.getAttribute( + "data-vf-js-chatbot-welcome-suggestion" + ); + if (!question) return; + + // Get answer data from predefined Q&A or fallback responses + let answerData = null; + + // First try predefined Q&A + if ( + this.config.enable_predefined_qa && + this.predefinedQA && + this.predefinedQA[question] + ) { + answerData = this.predefinedQA[question]; + } + // If not found in predefined Q&A, try to find in fallback responses + else if (this.config.enable_fallback_responses && this.fallbackResponses) { + const fallbackResponse = this.fallbackResponses.find( + response => response.prompts && response.prompts.includes(question) + ); + if (fallbackResponse) { + answerData = fallbackResponse; + } + } + + // If still no answer data, provide a default response + if (!answerData) { + answerData = { + answer: + "I'm here to help with your questions. Please try asking about our services or general information.", + sources: [], + prompts: [ + "What services do you offer?", + "How can I get started?", + "Tell me more about your organization" + ] + }; + } + + // Dispatch event only once + this.el.dispatchEvent( + new CustomEvent("vf-chatbot-welcome:suggestion-click", { + bubbles: true, + detail: { + question, + answer: answerData.answer || "", + sources: answerData.sources || [], + prompts: answerData.prompts || [] + } + }) + ); + } +} + +// Initialize +export function initVFChatbotWelcome(element) { + return new VFChatbotWelcome(element); +} diff --git a/src/assets/vf-chatbot/.DS_Store b/src/assets/vf-chatbot/.DS_Store new file mode 100644 index 0000000..5e47b5c Binary files /dev/null and b/src/assets/vf-chatbot/.DS_Store differ diff --git a/src/assets/vf-chatbot/assets/vf-chatbot--avatar-user.svg b/src/assets/vf-chatbot/assets/vf-chatbot--avatar-user.svg new file mode 100644 index 0000000..d9e9a53 --- /dev/null +++ b/src/assets/vf-chatbot/assets/vf-chatbot--avatar-user.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/vf-chatbot/assets/vf-chatbot--icon-16x16-dark-green.svg b/src/assets/vf-chatbot/assets/vf-chatbot--icon-16x16-dark-green.svg new file mode 100644 index 0000000..1bd078f --- /dev/null +++ b/src/assets/vf-chatbot/assets/vf-chatbot--icon-16x16-dark-green.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/vf-chatbot/assets/vf-chatbot--icon-24x24-dark-green.svg b/src/assets/vf-chatbot/assets/vf-chatbot--icon-24x24-dark-green.svg new file mode 100644 index 0000000..0bb0697 --- /dev/null +++ b/src/assets/vf-chatbot/assets/vf-chatbot--icon-24x24-dark-green.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/vf-chatbot/assets/vf-chatbot--icon-32x32-dark-green.svg b/src/assets/vf-chatbot/assets/vf-chatbot--icon-32x32-dark-green.svg new file mode 100644 index 0000000..6388d34 --- /dev/null +++ b/src/assets/vf-chatbot/assets/vf-chatbot--icon-32x32-dark-green.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/vf-chatbot/assets/vf-chatbot--icon-close.svg b/src/assets/vf-chatbot/assets/vf-chatbot--icon-close.svg new file mode 100644 index 0000000..3b0417b --- /dev/null +++ b/src/assets/vf-chatbot/assets/vf-chatbot--icon-close.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/vf-chatbot/assets/vf-chatbot--icon-minimize.svg b/src/assets/vf-chatbot/assets/vf-chatbot--icon-minimize.svg new file mode 100644 index 0000000..a0ec4fc --- /dev/null +++ b/src/assets/vf-chatbot/assets/vf-chatbot--icon-minimize.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/vf-chatbot/assets/vf-chatbot--icon-send.svg b/src/assets/vf-chatbot/assets/vf-chatbot--icon-send.svg new file mode 100644 index 0000000..0849ecc --- /dev/null +++ b/src/assets/vf-chatbot/assets/vf-chatbot--icon-send.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/vf-chatbot/assets/vf-chatbot-qa.json b/src/assets/vf-chatbot/assets/vf-chatbot-qa.json new file mode 100644 index 0000000..9a001e3 --- /dev/null +++ b/src/assets/vf-chatbot/assets/vf-chatbot-qa.json @@ -0,0 +1,96 @@ +{ + "predefinedQA": { + "What is Metabolights?": { + "answer": "
    MetaboLights is an open access repository for metabolomics studies, including raw experimental data and associated metadata.
    \n
    To know more:
    \n
      \n
    1. \n Methods and resources for omics studies: A curated collection of EMBL-EBI on-demand training.\n
    2. \n
    3. \n MetaboLights: Quick tour.\n
    4. \n
    5. \n Chemical biology: A curated set of EMBL-EBI online courses.\n
    6. \n
    " + }, + "Learn how to apply bioinformatics tools in your academic work": { + "answer": "Our Tools and Services portal provides access to commonly used resources in genomics, proteomics, and more. We also offer tutorials and use cases to guide integration into your academic projects." + }, + "Start a guided learning path in bioinformatics": { + "answer": "Great! You can begin with our structured courses and learning paths designed for beginners at the EMBL-EBI Training Portal. Perfect for students and early-stage researchers.", + "sources": [ + { + "domain": "ebi.ac.uk", + "title": "EMBL-EBI Training", + "url": "https://www.ebi.ac.uk/training/", + "description": "Delivering world-class training in data-driven life sciences." + } + ] + }, + "Find resources and tools for structural biology analysis": { + "answer": "Discover tools for structural biology, including protein modeling, domain analysis, and sequence alignment. Visit our Tools & Services portal to access popular resources.", + "sources": [ + { + "domain": "github.com", + "title": "Structural Biology", + "url": "https://github.com/pengzhangzhi/Awesome-Computational-Structural-Biology?utm_source=chatgpt.com", + "description": "Awesome Computational Structural Biology (GitHub) – curated list of tools, tutorials, and courses" + }, + { + "domain": "hwi.buffalo.edu", + "title": "Structural Biology Resource Page", + "url": "https://hwi.buffalo.edu/structural-biology-resources/?utm_source=chatgpt.com", + "description": "Structural Biology Resource Page – links to cryo-EM, crystallography, and X-ray data collection info from Hauptman-Woodward Institute" + }, + { + "domain": "www.creative-biostructure.com", + "title": "Structural Biology Tools", + "url": "https://www.creative-biostructure.com/structural-biology-tools.htm?srsltid=AfmBOooqvJ0ksY6p6Pryq1diKVWPxNK0t68zKnuyMuTB0_k1IABozOXO&utm_source=chatgpt.com", + "description": "Creative Biostructure – lists structural resources and software across core techniques like crystallography and cryo-EM" + } + ] + }, + "How can I submit genomic data to EMBL-EBI?": { + "answer": "To submit genomic data, visit the EMBL-EBI submission portal, where you’ll find step-by-step guides and tools for submitting sequencing data, assemblies, annotations, and more.", + "sources": [ + { + "domain": "ebi.ac.uk", + "title": "EMBL's European Bioinformatics Institute", + "url": "https://www.ebi.ac.uk/", + "description": "Run BLAST searches against comprehensive sequence databases at EMBL-EBI." + }, + { + "domain": "ena-docs.readthedocs.io", + "title": "ENA Documentation", + "url": "https://ena-docs.readthedocs.io/en/latest/", + "description": "ENA Documentation" + } + ] + }, + "Access documentation and developer tools": { + "answer": "Explore the databse, where you can find model predictions, usage documentation, API access, and links to related publications. Developers can also access integration guides through the EMBL-EBI API Hub.", + "sources": [ + { + "domain": "ebi.ac.uk", + "title": "EMBL-EBI APIs and Tools", + "url": "https://www.ebi.ac.uk/services", + "description": "Browse services by domain (genomics, proteomics, etc.) and access APIs." + }, + { + "domain": "ebi.ac.uk", + "title": "EMBL-EBI API Documentation", + "url": "https://www.ebi.ac.uk/about/api", + "description": "RESTful APIs for tools like BLAST, InterProScan, Clustal Omega, etc." + } + ] + }, + "Discover upcoming bioinformatics workshops for beginners": { + "answer": "Start your learning journey with our Training Events Calendar, featuring upcoming live webinars, virtual workshops, and in-person courses. Many sessions are designed for beginners and cover topics like genomics, data standards, and tool usage." + } + }, + "fallbackResponses": [ + { + "answer": "I'm sorry, I'm having trouble connecting to my knowledge base right now. Could you try again in a moment?", + "prompts": [ + { + "action_text": "Contact support team", + "action_url": "tel:+44 1223 494 444" + }, + { + "action_text": "Submit a support request", + "action_url": "https://www.ebi.ac.uk/about/contact/support/" + } + ] + } + ] +} diff --git a/src/assets/vf-chatbot/assets/vf-chatbot-selector-llms.json b/src/assets/vf-chatbot/assets/vf-chatbot-selector-llms.json new file mode 100644 index 0000000..f803d2b --- /dev/null +++ b/src/assets/vf-chatbot/assets/vf-chatbot-selector-llms.json @@ -0,0 +1,37 @@ +{ + "routes": [ + { + "id": "gpt4-turbo", + "title": "GPT-4 Turbo", + "selected": true + }, + { + "id": "claude3-opus", + "title": "Claude 3 Opus" + }, + { + "id": "gemini-ultra", + "title": "Gemini Ultra" + }, + { + "id": "llama3", + "title": "LLaMA 3" + }, + { + "id": "mixtral", + "title": "Mixtral 8x7B" + }, + { + "id": "palm3", + "title": "PaLM 3" + }, + { + "id": "gpt4-vision", + "title": "GPT-4 Vision" + }, + { + "id": "claude3-sonnet", + "title": "Claude 3 Sonnet" + } + ] +} diff --git a/src/assets/vf-chatbot/assets/vf-chatbot-selector-services.json b/src/assets/vf-chatbot/assets/vf-chatbot-selector-services.json new file mode 100644 index 0000000..9c00673 --- /dev/null +++ b/src/assets/vf-chatbot/assets/vf-chatbot-selector-services.json @@ -0,0 +1,52 @@ +{ + "routes": [ + { + "id": "ensembl", + "title": "Ensembl" + }, + { + "id": "uniprot", + "title": "UniProt" + }, + { + "id": "pfam", + "title": "Pfam" + }, + { + "id": "interpro", + "title": "InterPro" + }, + { + "id": "chembl", + "title": "ChEMBL" + }, + { + "id": "pdbe", + "title": "PDBe" + }, + { + "id": "expression-atlas", + "title": "Expression Atlas" + }, + { + "id": "pride", + "title": "PRIDE" + }, + { + "id": "arrayexpress", + "title": "ArrayExpress" + }, + { + "id": "intact", + "title": "IntAct" + }, + { + "id": "reactome", + "title": "Reactome" + }, + { + "id": "metabolights", + "title": "MetaboLights" + } + ] +} diff --git a/src/assets/vf-chatbot/vf-chatbot.js b/src/assets/vf-chatbot/vf-chatbot.js new file mode 100644 index 0000000..180b268 --- /dev/null +++ b/src/assets/vf-chatbot/vf-chatbot.js @@ -0,0 +1,246 @@ +// import { initVFChatbotFab } from "@visual-framework/vf-chatbot-fab/vf-chatbot-fab.js"; +// import { initVFChatbotModal } from "@visual-framework/vf-chatbot-modal/vf-chatbot-modal.js"; +// import { initVFChatbotStandalone } from "@visual-framework/vf-chatbot-standalone/vf-chatbot-standalone.js"; + +import { initVFChatbotFab } from "../vf-chatbot-fab/vf-chatbot-fab.js"; +import { initVFChatbotModal } from "../vf-chatbot-modal/vf-chatbot-modal.js"; +import { initVFChatbotStandalone } from "../vf-chatbot-standalone/vf-chatbot-standalone.js"; +// Accessibility helpers +let previouslyFocusedElement = null; +let focusTrapHandler = null; +let escapeHandler = null; + +// vf-chatbot +function VFChatbot(element) { + this.el = element; + this.fab = this.el.querySelector("[data-vf-js-chatbot-fab]"); + this.modal = this.el.querySelector("[data-vf-js-chatbot-modal-container]"); + + this.init(); +} + +VFChatbot.prototype = { + init: function() { + if (!this.fab || !this.modal) return; + + // Handle FAB toggle event + this.el.addEventListener("vf-chatbot-fab:toggle", e => { + e.stopPropagation(); + this.openChat(); + }); + + // Handle modal events + this.modal.addEventListener("vf-chatbot-modal-container:close", () => { + this.closeChat(); + }); + + // Handle escape key (handled in focus trap for accessibility) + // document.addEventListener("keydown", e => { + // if ( + // e.key === "Escape" && + // !this.modal.classList.contains("vf-chatbot-modal-container--inactive") + // ) { + // this.closeChat(); + // } + // }); + }, + + enableFocusTrap: function() { + const modal = this.modal; + const focusableSelectors = [ + "a[href]", + "area[href]", + "input:not([disabled])", + "select:not([disabled])", + "textarea:not([disabled])", + "button:not([disabled])", + "[tabindex]:not([tabindex='-1'])" + ]; + const getFocusable = () => + Array.from(modal.querySelectorAll(focusableSelectors.join(","))).filter( + el => el.offsetParent !== null + ); + + // Focus first focusable element or modal itself + const focusables = getFocusable(); + // Try to focus the input first + const input = modal.querySelector("[data-vf-js-chatbot-modal-input]"); + if (input) { + input.focus(); + } else if (focusables.length) { + focusables[0].focus(); + } else { + modal.setAttribute("tabindex", "-1"); + modal.focus(); + } + + // Trap focus + focusTrapHandler = e => { + if (!modal.classList.contains("vf-chatbot-modal-container--active")) + return; + if (e.key !== "Tab") return; + const focusables = getFocusable(); + if (!focusables.length) return; + const first = focusables[0]; + const last = focusables[focusables.length - 1]; + if (e.shiftKey) { + if (document.activeElement === first) { + e.preventDefault(); + last.focus(); + } + } else { + if (document.activeElement === last) { + e.preventDefault(); + first.focus(); + } + } + }; + + // Escape closes modal + escapeHandler = e => { + if (!modal.classList.contains("vf-chatbot-modal-container--active")) + return; + if (e.key === "Escape") { + e.preventDefault(); + this.closeChat(); + } + }; + + document.addEventListener("keydown", focusTrapHandler); + document.addEventListener("keydown", escapeHandler); + }, + + disableFocusTrap: function() { + document.removeEventListener("keydown", focusTrapHandler); + document.removeEventListener("keydown", escapeHandler); + }, + + openChat: function() { + this.fab.classList.add("vf-chatbot-fab--inactive"); + this.modal.classList.remove("vf-chatbot-modal-container--inactive"); + this.modal.classList.add("vf-chatbot-modal-container--active"); + this.modal.setAttribute("aria-modal", true); + + // Accessibility: store and trap focus + previouslyFocusedElement = document.activeElement; + this.enableFocusTrap(); + + // Focus on input if it exists + const input = this.modal.querySelector("[data-vf-js-chatbot-modal-input]"); + if (input) { + setTimeout(() => input.focus(), 300); + + // Enter to send message (unless Shift+Enter) + input.addEventListener("keydown", function(e) { + if (e.key === "Enter" && !e.shiftKey) { + e.preventDefault(); + // You may want to call your send message logic here + const sendBtn = input.parentElement.querySelector( + "[data-vf-js-chatbot-modal-send]" + ); + if (sendBtn) sendBtn.click(); + } + }); + } + + sessionStorage.setItem("chatbotModalMinimized", "false"); + }, + closeChat: function() { + this.fab.classList.remove("vf-chatbot-fab--inactive"); + this.modal.classList.remove("vf-chatbot-modal-container--active"); + this.modal.classList.add("vf-chatbot-modal-container--inactive"); + this.modal.setAttribute("aria-modal", false); + + // Accessibility: restore focus and remove trap + this.disableFocusTrap(); + if (previouslyFocusedElement && previouslyFocusedElement.focus) { + previouslyFocusedElement.focus(); + } + + sessionStorage.setItem("chatbotModalMinimized", "true"); + } +}; + +// Utility to update bottom/right margin for all chatbots +function updateChatbotBottomMargin(bottomMarginPx = 0, rightMarginPx = 0) { + document.querySelectorAll("[data-vf-js-chatbot]").forEach(element => { + element.style.setProperty( + "--vf-chatbot-modal-bottom-margin", + `${bottomMarginPx}px` + ); + element.style.setProperty( + "--vf-chatbot-modal-right-margin", + `${rightMarginPx}px` + ); + }); +} + +function getChatbotBottomMargin(userSuppliedMargin) { + // If user provided a margin, use it + if (typeof userSuppliedMargin === "number") return userSuppliedMargin; + + // Find all visible banners with .vf-banner--bottom + const banners = Array.from( + document.querySelectorAll(".vf-banner--bottom") + ).filter(banner => { + // Only consider banners that are displayed (not display: none) + return !!( + banner.offsetParent || + (window.getComputedStyle(banner).display !== "none" && + banner.offsetHeight > 0) + ); + }); + + // Get the tallest banner's offsetHeight + let maxHeight = 0; + banners.forEach(banner => { + // Listen for close events to update margin + banner.addEventListener("vf-banner:close", () => { + updateChatbotBottomMargin(0, 0); + }); + const closeBtn = banner.querySelector("[data-vf-js-banner-close]"); + if (closeBtn) { + closeBtn.addEventListener("click", () => { + updateChatbotBottomMargin(0, 0); + }); + } + if (banner.offsetHeight > maxHeight) { + maxHeight = banner.offsetHeight; + } + }); + + return [maxHeight, 0]; +} + +function initVFChatbot(config = {}) { + if (config && config.type == "modal") { + const elements = document.querySelectorAll("[data-vf-js-chatbot]"); + const chatbotBottomMargin = getChatbotBottomMargin( + config.chatbotBottomMargin + ) || [0, 0]; + elements.forEach(element => { + // Set CSS variable for FAB and modal margin + element.style.setProperty( + "--vf-chatbot-modal-bottom-margin", + `${chatbotBottomMargin[0]}px` + ); + element.style.setProperty( + "--vf-chatbot-modal-right-margin", + `${chatbotBottomMargin[1]}px` + ); + new VFChatbot(element); + initVFChatbotFab(); + initVFChatbotModal(config); + }); + } else if (config && config.type == "standalone") { + initVFChatbotStandalone(config); + } +} + +// Global exposure +if (typeof window !== "undefined") { + window.VFChatbot = VFChatbot; + window.initVFChatbot = initVFChatbot; +} + +export { VFChatbot, initVFChatbot }; diff --git a/src/styles.scss b/src/styles.scss index e69de29..be3a484 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -0,0 +1,74 @@ +.vf-chatbot-message--user{ + float: right; +} + + +vf-chatbot-modal,vf-chatbot,vf-chatbot-fab{ + right: inherit; + bottom: inherit; +} + + + +.vf-form__textarea { + --vf-body-width: 80em; + --embl-grid-module--prime: 16rem; + --embl-grid-spacing-normaliser: 0px; + --page-grid-gap: 2rem; + --vf-chatbot-modal-bottom-margin: 0px; + --vf-chatbot-modal-right-margin: 0px; + --vf-stack-margin: 0; + appearance: none; + border-radius: 0; + box-sizing: border-box; + display: block; + padding: .5rem; + position: relative; + font-family: "IBM Plex Sans",Helvetica,Arial,sans-serif; + font-size: 16px; + color: #1a1c1a; + font-weight: 400; + margin: var(--vf-stack-margin, 0) 0 var(--vf-text-margin--bottom, 16px) 0; + margin-bottom: 0; + align-content: center; + width: 100%; + line-height: 2.1; + border: none; + resize: none; + background: var(--vf-color--neutral--0); + box-shadow: none !important; + padding-left: 1rem; + height: 49.6px; +} + +.vf-chatbot-welcome__content { + text-align: center; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + min-height: 40vh; +} +.vf-chatbot-welcome{ + font-family: "IBM Plex Sans",Helvetica,Arial,sans-serif; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + overflow-y: auto; + margin: 0 auto; + scrollbar-width: none; + width: 88%; + padding: 0 1.5rem; +} +.vf-form__textarea:focus-visible { + outline: none; +} + +a:-webkit-any-link { + text-decoration: none; +} + +vf-chatbot-welcome{ + display: contents; +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 840373e..39dcb30 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,3 +1,4 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ { "compileOnSave": false, "compilerOptions": { diff --git a/tsconfig.spec.json b/tsconfig.spec.json index b5bda53..1762d06 100644 --- a/tsconfig.spec.json +++ b/tsconfig.spec.json @@ -1,3 +1,4 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ { "extends": "./tsconfig.json", "compilerOptions": { @@ -15,4 +16,4 @@ "src/**/*.spec.ts", "src/**/*.d.ts" ] -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index d245962..830a66c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -252,19 +252,19 @@ resolved "https://registry.yarnpkg.com/@assemblyscript/loader/-/loader-0.10.1.tgz#70e45678f06c72fa2e350e8553ec4a4d72b92e06" integrity sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg== -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.22.5", "@babel/code-frame@^7.26.2": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" - integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.22.5", "@babel/code-frame@^7.26.2", "@babel/code-frame@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.7.tgz#f2fbbfea87c44a21590ec515b778b2c26d8866e7" + integrity sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw== dependencies: - "@babel/helper-validator-identifier" "^7.25.9" + "@babel/helper-validator-identifier" "^7.29.7" js-tokens "^4.0.0" - picocolors "^1.0.0" + picocolors "^1.1.1" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.26.8": - version "7.26.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.8.tgz#821c1d35641c355284d4a870b8a4a7b0c141e367" - integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ== +"@babel/compat-data@^7.22.9", "@babel/compat-data@^7.26.8", "@babel/compat-data@^7.28.6", "@babel/compat-data@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.7.tgz#6f0237f0f36d2e51c0570a636faed9d2d0efe629" + integrity sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg== "@babel/core@7.22.9": version "7.22.9" @@ -308,21 +308,21 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/core@^7.12.3", "@babel/core@^7.16.0": - version "7.26.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.10.tgz#5c876f83c8c4dcb233ee4b670c0606f2ac3000f9" - integrity sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.10" - "@babel/helper-compilation-targets" "^7.26.5" - "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.10" - "@babel/parser" "^7.26.10" - "@babel/template" "^7.26.9" - "@babel/traverse" "^7.26.10" - "@babel/types" "^7.26.10" +"@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.9.0": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.7.tgz#80c10b17248082968b57a857b91640971f2070f7" + integrity sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helpers" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/template" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + "@jridgewell/remapping" "^2.3.5" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -339,15 +339,15 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.22.9", "@babel/generator@^7.23.0", "@babel/generator@^7.26.10", "@babel/generator@^7.27.0": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.0.tgz#764382b5392e5b9aff93cadb190d0745866cbc2c" - integrity sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw== +"@babel/generator@^7.22.9", "@babel/generator@^7.23.0", "@babel/generator@^7.29.7", "@babel/generator@^7.29.8": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.8.tgz#4b0b887885422643339e09022148a4c4ebaa4979" + integrity sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg== dependencies: - "@babel/parser" "^7.27.0" - "@babel/types" "^7.27.0" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" + "@babel/parser" "^7.29.8" + "@babel/types" "^7.29.8" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" "@babel/helper-annotate-as-pure@7.22.5": @@ -357,44 +357,44 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-annotate-as-pure@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" - integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g== +"@babel/helper-annotate-as-pure@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz#c70fe3c6ecbdc3fd2dd1b0f498428b88b82ce47f" + integrity sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw== dependencies: - "@babel/types" "^7.25.9" + "@babel/types" "^7.29.7" -"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.22.9", "@babel/helper-compilation-targets@^7.25.9", "@babel/helper-compilation-targets@^7.26.5": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz#de0c753b1cd1d9ab55d473c5a5cf7170f0a81880" - integrity sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA== +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.22.9", "@babel/helper-compilation-targets@^7.26.5", "@babel/helper-compilation-targets@^7.28.6", "@babel/helper-compilation-targets@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz#7a1def704302401c47f64fa85589e974ae217042" + integrity sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g== dependencies: - "@babel/compat-data" "^7.26.8" - "@babel/helper-validator-option" "^7.25.9" + "@babel/compat-data" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.25.9": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz#518fad6a307c6a96f44af14912b2c20abe9bfc30" - integrity sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - "@babel/helper-member-expression-to-functions" "^7.25.9" - "@babel/helper-optimise-call-expression" "^7.25.9" - "@babel/helper-replace-supers" "^7.26.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" - "@babel/traverse" "^7.27.0" +"@babel/helper-create-class-features-plugin@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz#6eddf286f2ec418f740c91d60a83347c55838ddd" + integrity sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-member-expression-to-functions" "^7.29.7" + "@babel/helper-optimise-call-expression" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + "@babel/traverse" "^7.29.7" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.0.tgz#0e41f7d38c2ebe06ebd9cf0e02fb26019c77cd95" - integrity sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz#5d4c3f928f315cf6c4184ea2fc3b5b38745b2430" + integrity sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg== dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - regexpu-core "^6.2.0" + "@babel/helper-annotate-as-pure" "^7.29.7" + regexpu-core "^6.3.1" semver "^6.3.1" "@babel/helper-define-polyfill-provider@^0.4.4": @@ -419,16 +419,16 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-define-polyfill-provider@^0.6.3", "@babel/helper-define-polyfill-provider@^0.6.4": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz#15e8746368bfa671785f5926ff74b3064c291fab" - integrity sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw== +"@babel/helper-define-polyfill-provider@^0.6.3", "@babel/helper-define-polyfill-provider@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz#cf1e4462b613f2b54c41e6ff758d5dfcaa2c85d1" + integrity sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA== dependencies: - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-plugin-utils" "^7.22.5" - debug "^4.1.1" + "@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.14.2" + resolve "^1.22.11" "@babel/helper-environment-visitor@^7.18.9": version "7.24.7" @@ -437,68 +437,73 @@ dependencies: "@babel/types" "^7.24.7" -"@babel/helper-member-expression-to-functions@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3" - integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ== +"@babel/helper-globals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz#f04a96fbd8473241b1079243f5b3f03a3010ab7b" + integrity sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA== + +"@babel/helper-member-expression-to-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz#8dbdb3ce0b5c487e1aec10e13c9a43a500814df8" + integrity sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg== dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" -"@babel/helper-module-imports@^7.22.5", "@babel/helper-module-imports@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" - integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== +"@babel/helper-module-imports@^7.22.5", "@babel/helper-module-imports@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz#ef25048a518e828d7393fac5882ddd73921d7396" + integrity sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g== dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" -"@babel/helper-module-transforms@^7.22.9", "@babel/helper-module-transforms@^7.23.0", "@babel/helper-module-transforms@^7.25.9", "@babel/helper-module-transforms@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" - integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== +"@babel/helper-module-transforms@^7.22.9", "@babel/helper-module-transforms@^7.23.0", "@babel/helper-module-transforms@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz#b062747a5997ba138637201328bbff77960574ae" + integrity sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg== dependencies: - "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/helper-optimise-call-expression@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz#3324ae50bae7e2ab3c33f60c9a877b6a0146b54e" - integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ== +"@babel/helper-optimise-call-expression@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz#77b0b5b94f1997fa9d6e3125f445227b1faf9d85" + integrity sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong== dependencies: - "@babel/types" "^7.25.9" + "@babel/types" "^7.29.7" -"@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.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.26.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" - integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== +"@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.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.26.5", "@babel/helper-plugin-utils@^7.28.6", "@babel/helper-plugin-utils@^7.29.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz#c0a0766f1a13617d8a17407d7ab8f9d486225ea4" + integrity sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw== -"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92" - integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw== +"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz#34b1f68dd75b86d31df781a29c3ff2df88da82e6" + integrity sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og== dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - "@babel/helper-wrap-function" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-wrap-function" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/helper-replace-supers@^7.25.9", "@babel/helper-replace-supers@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz#6cb04e82ae291dae8e72335dfe438b0725f14c8d" - integrity sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg== +"@babel/helper-replace-supers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz#bc3c3964329043c79112e513c1b198f16589ac21" + integrity sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ== dependencies: - "@babel/helper-member-expression-to-functions" "^7.25.9" - "@babel/helper-optimise-call-expression" "^7.25.9" - "@babel/traverse" "^7.26.5" + "@babel/helper-member-expression-to-functions" "^7.29.7" + "@babel/helper-optimise-call-expression" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/helper-skip-transparent-expression-wrappers@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9" - integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA== +"@babel/helper-skip-transparent-expression-wrappers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz#50c95c7e4c4f54936cfa0116428edc559862d551" + integrity sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ== dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" "@babel/helper-split-export-declaration@7.22.6": version "7.22.6" @@ -507,83 +512,83 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-string-parser@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" - integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== +"@babel/helper-string-parser@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz#7f0871d99824d23137d60f86fcf6130fd5a1b51f" + integrity sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw== -"@babel/helper-validator-identifier@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" - integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== +"@babel/helper-validator-identifier@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz#bd87084ced0c796ec46bda492de6e83d29e89fc2" + integrity sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg== -"@babel/helper-validator-option@^7.22.5", "@babel/helper-validator-option@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" - integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== +"@babel/helper-validator-option@^7.22.5", "@babel/helper-validator-option@^7.25.9", "@babel/helper-validator-option@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz#cf315be940213b354eb4abcc0bd01ebe3f73bc2a" + integrity sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw== -"@babel/helper-wrap-function@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0" - integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g== +"@babel/helper-wrap-function@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz#eec72163044548a0935e9d182bf2d547ec5ff483" + integrity sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw== dependencies: - "@babel/template" "^7.25.9" - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/template" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" -"@babel/helpers@^7.22.6", "@babel/helpers@^7.23.2", "@babel/helpers@^7.26.10": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.0.tgz#53d156098defa8243eab0f32fa17589075a1b808" - integrity sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg== +"@babel/helpers@^7.22.6", "@babel/helpers@^7.23.2", "@babel/helpers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.7.tgz#45abfde7548997e34376c3e69feb475cffb4a607" + integrity sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg== dependencies: - "@babel/template" "^7.27.0" - "@babel/types" "^7.27.0" + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.7" -"@babel/parser@^7.14.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7", "@babel/parser@^7.23.0", "@babel/parser@^7.26.10", "@babel/parser@^7.27.0": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.0.tgz#3d7d6ee268e41d2600091cbd4e145ffee85a44ec" - integrity sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg== +"@babel/parser@^7.14.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7", "@babel/parser@^7.23.0", "@babel/parser@^7.29.7", "@babel/parser@^7.29.8": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.8.tgz#9653716a2f10c677b98fbc63d4bfb000c302cf17" + integrity sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA== dependencies: - "@babel/types" "^7.27.0" + "@babel/types" "^7.29.8" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz#cc2e53ebf0a0340777fff5ed521943e253b4d8fe" - integrity sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz#2b535896d933a85aa92377eaa3d51a437d54a4e3" + integrity sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" "@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz#af9e4fb63ccb8abcb92375b2fcfe36b60c774d30" - integrity sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz#b00711a9e52bf4fe55ef7e54b2ef4a881bf804c8" + integrity sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9": - version "7.25.9" - 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.25.9.tgz#e8dc26fcd616e6c5bf2bd0d5a2c151d4f92a9137" - integrity sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug== + version "7.29.7" + 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.29.7.tgz#2375328852026a3cf6bc0bcf2de7d236f2d5e701" + integrity sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz#807a667f9158acac6f6164b4beb85ad9ebc9e1d1" - integrity sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz#86de98dd8e03836178231ea96c27dab26016a705" + integrity sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" - "@babel/plugin-transform-optional-chaining" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + "@babel/plugin-transform-optional-chaining" "^7.29.7" "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz#de7093f1e7deaf68eadd7cc6b07f2ab82543269e" - integrity sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz#f5d892681dbf4b08753436a5e55000d5ba728d6d" + integrity sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" "@babel/plugin-proposal-async-generator-functions@7.20.7": version "7.20.7" @@ -644,18 +649,18 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-import-assertions@^7.22.5", "@babel/plugin-syntax-import-assertions@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz#620412405058efa56e4a564903b79355020f445f" - integrity sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz#c5cd868505269126cc18882e1f01f7b0e0e24b4e" + integrity sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-syntax-import-attributes@^7.22.5", "@babel/plugin-syntax-import-attributes@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" - integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz#6115264516e95ead0f35a41710906612e447f605" + integrity sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" @@ -736,20 +741,20 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-arrow-functions@^7.22.5", "@babel/plugin-transform-arrow-functions@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz#7821d4410bee5daaadbb4cdd9a6649704e176845" - integrity sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz#d651343f562c03f47951bd1802195d0e10605f27" + integrity sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-async-generator-functions@^7.22.7", "@babel/plugin-transform-async-generator-functions@^7.26.8": - version "7.26.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz#5e3991135e3b9c6eaaf5eff56d1ae5a11df45ff8" - integrity sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz#a5365617921d82a1fee33124a1102bb38a1e677d" + integrity sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA== dependencies: - "@babel/helper-plugin-utils" "^7.26.5" - "@babel/helper-remap-async-to-generator" "^7.25.9" - "@babel/traverse" "^7.26.8" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-remap-async-to-generator" "^7.29.7" + "@babel/traverse" "^7.29.7" "@babel/plugin-transform-async-to-generator@7.22.5": version "7.22.5" @@ -761,308 +766,310 @@ "@babel/helper-remap-async-to-generator" "^7.22.5" "@babel/plugin-transform-async-to-generator@^7.22.5", "@babel/plugin-transform-async-to-generator@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71" - integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz#3b5e8f1fb58133cf701bcf0baaf6f01bfd1a8889" + integrity sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w== dependencies: - "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-remap-async-to-generator" "^7.25.9" + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-remap-async-to-generator" "^7.29.7" "@babel/plugin-transform-block-scoped-functions@^7.22.5", "@babel/plugin-transform-block-scoped-functions@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz#3dc4405d31ad1cbe45293aa57205a6e3b009d53e" - integrity sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz#96d292634434082d6687bcdb81139affedf77e8c" + integrity sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA== dependencies: - "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-block-scoping@^7.22.5", "@babel/plugin-transform-block-scoping@^7.25.9": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.0.tgz#acc2c0d98a7439bbde4244588ddbd4904701d47f" - integrity sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz#baa376691ae16244cd14335422fca6900f54e17d" + integrity sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ== dependencies: - "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-class-properties@^7.22.5", "@babel/plugin-transform-class-properties@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz#a8ce84fedb9ad512549984101fa84080a9f5f51f" - integrity sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz#034897b8a21beec163332fac2de235b14409abdf" + integrity sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-class-static-block@^7.22.5", "@babel/plugin-transform-class-static-block@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz#6c8da219f4eb15cae9834ec4348ff8e9e09664a0" - integrity sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz#fed8efd19f3dd3e1114ee390707c70912778fd7c" + integrity sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A== dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-classes@^7.22.6", "@babel/plugin-transform-classes@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz#7152457f7880b593a63ade8a861e6e26a4469f52" - integrity sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz#61d3e5aaae0c838acc3204d9db7c8dc05c25815b" + integrity sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g== dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-replace-supers" "^7.25.9" - "@babel/traverse" "^7.25.9" - globals "^11.1.0" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-globals" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" + "@babel/traverse" "^7.29.7" "@babel/plugin-transform-computed-properties@^7.22.5", "@babel/plugin-transform-computed-properties@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz#db36492c78460e534b8852b1d5befe3c923ef10b" - integrity sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz#95028787ca31901b9a20b5c6d9605c32346f55ad" + integrity sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/template" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/template" "^7.29.7" -"@babel/plugin-transform-destructuring@^7.22.5", "@babel/plugin-transform-destructuring@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1" - integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ== +"@babel/plugin-transform-destructuring@^7.22.5", "@babel/plugin-transform-destructuring@^7.25.9", "@babel/plugin-transform-destructuring@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz#5781ec6947852e27b64c1165f0db431f408090e4" + integrity sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" "@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.25.9", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz#bad7945dd07734ca52fe3ad4e872b40ed09bb09a" - integrity sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz#b203de9740e4c7ff6b55ce436ed5313b88d70af8" + integrity sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-duplicate-keys@^7.22.5", "@babel/plugin-transform-duplicate-keys@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz#8850ddf57dce2aebb4394bb434a7598031059e6d" - integrity sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz#8f3fe721835cb7a433420841dae90afc962ea7ae" + integrity sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz#6f7259b4de127721a08f1e5165b852fcaa696d31" - integrity sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz#dc6c405e55c01b7657e1827a25332c4ac17e9cac" + integrity sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-dynamic-import@^7.22.5", "@babel/plugin-transform-dynamic-import@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz#23e917de63ed23c6600c5dd06d94669dce79f7b8" - integrity sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz#a83a6faec5bab5b619adf9d0eac6c1c270123c2a" + integrity sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-exponentiation-operator@^7.22.5", "@babel/plugin-transform-exponentiation-operator@^7.26.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz#e29f01b6de302c7c2c794277a48f04a9ca7f03bc" - integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz#00bf002fde8794356171f5d4df200f6bc0d5a303" + integrity sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-export-namespace-from@^7.22.5", "@babel/plugin-transform-export-namespace-from@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz#90745fe55053394f554e40584cda81f2c8a402a2" - integrity sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz#d6014f45cec61d7691335c6c9804204bee801d51" + integrity sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-for-of@^7.22.5", "@babel/plugin-transform-for-of@^7.26.9": - version "7.26.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz#27231f79d5170ef33b5111f07fe5cafeb2c96a56" - integrity sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz#c65a678592117717aacdb10c1b73a9cb85e830be" + integrity sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ== dependencies: - "@babel/helper-plugin-utils" "^7.26.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" "@babel/plugin-transform-function-name@^7.22.5", "@babel/plugin-transform-function-name@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz#939d956e68a606661005bfd550c4fc2ef95f7b97" - integrity sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz#8b87f8a7504dbcd96135167e3fc4f61126a7bd86" + integrity sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg== dependencies: - "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" "@babel/plugin-transform-json-strings@^7.22.5", "@babel/plugin-transform-json-strings@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz#c86db407cb827cded902a90c707d2781aaa89660" - integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz#f57d63dcc05b4481c281acedcd8fc4e3e439a1d4" + integrity sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-literals@^7.22.5", "@babel/plugin-transform-literals@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz#1a1c6b4d4aa59bc4cad5b6b3a223a0abd685c9de" - integrity sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz#b90bd47463326c2a9d779e1bd5e1f88b9f421921" + integrity sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-logical-assignment-operators@^7.22.5", "@babel/plugin-transform-logical-assignment-operators@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz#b19441a8c39a2fda0902900b306ea05ae1055db7" - integrity sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz#9b29425adf5c794967aabe4b046a046a167bac2f" + integrity sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-member-expression-literals@^7.22.5", "@babel/plugin-transform-member-expression-literals@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz#63dff19763ea64a31f5e6c20957e6a25e41ed5de" - integrity sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz#1281689fa2fefc17b110d21ebafd0fe9402d5309" + integrity sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-modules-amd@^7.22.5", "@babel/plugin-transform-modules-amd@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz#49ba478f2295101544abd794486cd3088dddb6c5" - integrity sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz#f05ca662c8a1dc4be2f337af9c7e80369c942d6c" + integrity sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew== dependencies: - "@babel/helper-module-transforms" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-modules-commonjs@^7.22.5", "@babel/plugin-transform-modules-commonjs@^7.26.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb" - integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz#70e6835abf2663dafbe94b8ef1f51de7351ef135" + integrity sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ== dependencies: - "@babel/helper-module-transforms" "^7.26.0" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-modules-systemjs@^7.22.5", "@babel/plugin-transform-modules-systemjs@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz#8bd1b43836269e3d33307151a114bcf3ba6793f8" - integrity sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA== + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.8.tgz#e60a6a42ac63a3095f9cc7264f698a100c8fe05d" + integrity sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA== dependencies: - "@babel/helper-module-transforms" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@babel/traverse" "^7.29.8" "@babel/plugin-transform-modules-umd@^7.22.5", "@babel/plugin-transform-modules-umd@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz#6710079cdd7c694db36529a1e8411e49fcbf14c9" - integrity sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz#391d1c0215aca6307257f2f608598dfe55feb6cf" + integrity sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA== dependencies: - "@babel/helper-module-transforms" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5", "@babel/plugin-transform-named-capturing-groups-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a" - integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz#21e75d847b31189842fa7a77703722ed4b43d27d" + integrity sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-new-target@^7.22.5", "@babel/plugin-transform-new-target@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz#42e61711294b105c248336dcb04b77054ea8becd" - integrity sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz#714147ce7947e1b49cbd84137ca2e75e92b2a067" + integrity sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-nullish-coalescing-operator@^7.22.5", "@babel/plugin-transform-nullish-coalescing-operator@^7.26.6": - version "7.26.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz#fbf6b3c92cb509e7b319ee46e3da89c5bedd31fe" - integrity sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz#8a54cdf88c3f50433a6173117a286195b67714cc" + integrity sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg== dependencies: - "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-numeric-separator@^7.22.5", "@babel/plugin-transform-numeric-separator@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz#bfed75866261a8b643468b0ccfd275f2033214a1" - integrity sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz#0266d5cd42ab87ec40fee45a4e36483cfdcbc66a" + integrity sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-object-rest-spread@^7.22.5", "@babel/plugin-transform-object-rest-spread@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz#0203725025074164808bcf1a2cfa90c652c99f18" - integrity sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz#e0d5060241803922c545676613cc8acbbda0d266" + integrity sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A== dependencies: - "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/plugin-transform-parameters" "^7.25.9" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-transform-destructuring" "^7.29.7" + "@babel/plugin-transform-parameters" "^7.29.7" + "@babel/traverse" "^7.29.7" "@babel/plugin-transform-object-super@^7.22.5", "@babel/plugin-transform-object-super@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz#385d5de135162933beb4a3d227a2b7e52bb4cf03" - integrity sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz#e89283d14fa3c35817d4493ffc6bc649aa10e4eb" + integrity sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-replace-supers" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" "@babel/plugin-transform-optional-catch-binding@^7.22.5", "@babel/plugin-transform-optional-catch-binding@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz#10e70d96d52bb1f10c5caaac59ac545ea2ba7ff3" - integrity sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz#729664f79985be504eba112c51de9f71d009030b" + integrity sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-optional-chaining@^7.22.6", "@babel/plugin-transform-optional-chaining@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz#e142eb899d26ef715435f201ab6e139541eee7dd" - integrity sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A== +"@babel/plugin-transform-optional-chaining@^7.22.6", "@babel/plugin-transform-optional-chaining@^7.25.9", "@babel/plugin-transform-optional-chaining@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz#b84a1b574b3c73001023092567e16c492b720e51" + integrity sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" -"@babel/plugin-transform-parameters@^7.22.5", "@babel/plugin-transform-parameters@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz#b856842205b3e77e18b7a7a1b94958069c7ba257" - integrity sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g== +"@babel/plugin-transform-parameters@^7.22.5", "@babel/plugin-transform-parameters@^7.25.9", "@babel/plugin-transform-parameters@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz#a5ddc3b9bfb534814cb8334cbeba47d9cf9db090" + integrity sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-private-methods@^7.22.5", "@babel/plugin-transform-private-methods@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz#847f4139263577526455d7d3223cd8bda51e3b57" - integrity sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz#cea8bd3ab99533892897a02999d5b752584ad145" + integrity sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug== dependencies: - "@babel/helper-create-class-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-private-property-in-object@^7.22.5", "@babel/plugin-transform-private-property-in-object@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz#9c8b73e64e6cc3cbb2743633885a7dd2c385fe33" - integrity sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz#4a2f6be5aba47be7afbdb4cd7903c46edf3a7661" + integrity sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA== dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - "@babel/helper-create-class-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-property-literals@^7.22.5", "@babel/plugin-transform-property-literals@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz#d72d588bd88b0dec8b62e36f6fda91cedfe28e3f" - integrity sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz#d45817cd72f9e134ab1f7fbb79264cfcb85cf636" + integrity sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-regenerator@^7.22.5", "@babel/plugin-transform-regenerator@^7.25.9": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.0.tgz#822feebef43d6a59a81f696b2512df5b1682db31" - integrity sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA== + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.8.tgz#3a4a4dd7214af9d524f0503bb97c99af5f4abf26" + integrity sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg== dependencies: - "@babel/helper-plugin-utils" "^7.26.5" - regenerator-transform "^0.15.2" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-regexp-modifiers@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz#2f5837a5b5cd3842a919d8147e9903cc7455b850" - integrity sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz#68311c0c10af2198212528863f8542843e424025" + integrity sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-reserved-words@^7.22.5", "@babel/plugin-transform-reserved-words@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz#0398aed2f1f10ba3f78a93db219b27ef417fb9ce" - integrity sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz#a6feeb179b36a5f1fc6e3154c1eb727bdbe35876" + integrity sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-runtime@7.22.9": version "7.22.9" @@ -1077,71 +1084,71 @@ semver "^6.3.1" "@babel/plugin-transform-shorthand-properties@^7.22.5", "@babel/plugin-transform-shorthand-properties@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz#bb785e6091f99f826a95f9894fc16fde61c163f2" - integrity sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz#25c0436b98f4bd9ca4b98e1fbd662743bbaab9bf" + integrity sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-spread@^7.22.5", "@babel/plugin-transform-spread@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz#24a35153931b4ba3d13cec4a7748c21ab5514ef9" - integrity sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A== + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.8.tgz#c894cff38556a5dafeb412e13fc012b6df4b95a2" + integrity sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" "@babel/plugin-transform-sticky-regex@^7.22.5", "@babel/plugin-transform-sticky-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz#c7f02b944e986a417817b20ba2c504dfc1453d32" - integrity sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz#a42c0fd1fa42f7e98e1e0c7757f72a1bbca3a015" + integrity sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-template-literals@^7.22.5", "@babel/plugin-transform-template-literals@^7.26.8": - version "7.26.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz#966b15d153a991172a540a69ad5e1845ced990b5" - integrity sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz#ada97d8e0832bca8edb315888aa654b1570f3835" + integrity sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA== dependencies: - "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-typeof-symbol@^7.22.5", "@babel/plugin-transform-typeof-symbol@^7.26.7": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.0.tgz#044a0890f3ca694207c7826d0c7a65e5ac008aae" - integrity sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz#d848a4677c1ee3485ab017f4018f04597798911c" + integrity sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A== dependencies: - "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-unicode-escapes@^7.22.5", "@babel/plugin-transform-unicode-escapes@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz#a75ef3947ce15363fccaa38e2dd9bc70b2788b82" - integrity sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz#1e99554b0cddfd650d649a9f2b996049893e5720" + integrity sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-unicode-property-regex@^7.22.5", "@babel/plugin-transform-unicode-property-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz#a901e96f2c1d071b0d1bb5dc0d3c880ce8f53dd3" - integrity sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz#44444afc73768c2190fac4d95f7716817b7f204a" + integrity sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-unicode-regex@^7.22.5", "@babel/plugin-transform-unicode-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz#5eae747fe39eacf13a8bd006a4fb0b5d1fa5e9b1" - integrity sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz#c3064b293ff7f1794b71f7650eec8db9896d3e59" + integrity sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-unicode-sets-regex@^7.22.5", "@babel/plugin-transform-unicode-sets-regex@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz#65114c17b4ffc20fa5b163c63c70c0d25621fabe" - integrity sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz#b03ac9f27326f6197e8e574add83bbf33fc34ecd" + integrity sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/preset-env@7.22.9": version "7.22.9" @@ -1331,13 +1338,6 @@ dependencies: regenerator-runtime "^0.13.11" -"@babel/runtime@^7.8.4": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.0.tgz#fbee7cf97c709518ecc1f590984481d5460d4762" - integrity sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw== - dependencies: - regenerator-runtime "^0.14.0" - "@babel/template@7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" @@ -1347,55 +1347,78 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.25.9", "@babel/template@^7.26.9", "@babel/template@^7.27.0": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.0.tgz#b253e5406cc1df1c57dcd18f11760c2dbf40c0b4" - integrity sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA== +"@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.29.7.tgz#4d9d4004f645cdd304de958c725162784ecac700" + integrity sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/traverse@^7.22.8", "@babel/traverse@^7.23.2", "@babel/traverse@^7.29.7", "@babel/traverse@^7.29.8": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.8.tgz#4111014cdc71a0f95d9471907590baa0b8a6b28a" + integrity sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.8" + "@babel/helper-globals" "^7.29.7" + "@babel/parser" "^7.29.8" + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.8" + debug "^4.3.1" + +"@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.7", "@babel/types@^7.29.7", "@babel/types@^7.29.8", "@babel/types@^7.4.4": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.8.tgz#1229eef31d85156d70fa3f4cd859376d0eaf6863" + integrity sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg== dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/parser" "^7.27.0" - "@babel/types" "^7.27.0" + "@babel/helper-string-parser" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" -"@babel/traverse@^7.22.8", "@babel/traverse@^7.23.2", "@babel/traverse@^7.25.9", "@babel/traverse@^7.26.10", "@babel/traverse@^7.26.5", "@babel/traverse@^7.26.8", "@babel/traverse@^7.27.0": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.0.tgz#11d7e644779e166c0442f9a07274d02cd91d4a70" - integrity sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA== +"@cacheable/memory@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@cacheable/memory/-/memory-2.2.0.tgz#72aeb8b051f6d597d10ac8595b94ad8302bd2239" + integrity sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ== dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.27.0" - "@babel/parser" "^7.27.0" - "@babel/template" "^7.27.0" - "@babel/types" "^7.27.0" - debug "^4.3.1" - globals "^11.1.0" + "@cacheable/utils" "^2.5.0" + "@keyv/bigmap" "^1.3.1" + hookified "^1.15.1" + keyv "^5.6.0" -"@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.7", "@babel/types@^7.25.9", "@babel/types@^7.26.10", "@babel/types@^7.27.0", "@babel/types@^7.4.4": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.0.tgz#ef9acb6b06c3173f6632d993ecb6d4ae470b4559" - integrity sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg== +"@cacheable/utils@^2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@cacheable/utils/-/utils-2.5.0.tgz#534c91113aa48fe43baedb169550b6ee070ef303" + integrity sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA== dependencies: - "@babel/helper-string-parser" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" + hashery "^1.5.1" + keyv "^5.6.0" "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@csstools/css-parser-algorithms@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz#74426e93bd1c4dcab3e441f5cc7ba4fb35d94356" - integrity sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A== +"@csstools/css-parser-algorithms@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz#5755370a9a29abaec5515b43c8b3f2cf9c2e3076" + integrity sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ== -"@csstools/css-tokenizer@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz#a5502c8539265fecbd873c1e395a890339f119c2" - integrity sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw== +"@csstools/css-syntax-patches-for-csstree@^1.0.19": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.7.tgz#67a65f4b26766c315ddfd2bdb89ac4c53fdd51e7" + integrity sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig== -"@csstools/media-query-list-parser@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz#e80e17eba1693fceafb8d6f2cfc68c0e7a9ab78a" - integrity sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A== +"@csstools/css-tokenizer@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz#333fedabc3fd1a8e5d0100013731cf19e6a8c5d3" + integrity sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw== + +"@csstools/media-query-list-parser@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz#7aec77bcb89c2da80ef207e73f474ef9e1b3cdf1" + integrity sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ== "@csstools/selector-specificity@^5.0.0": version "5.0.0" @@ -1407,10 +1430,10 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@dual-bundle/import-meta-resolve@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#519c1549b0e147759e7825701ecffd25e5819f7b" - integrity sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg== +"@dual-bundle/import-meta-resolve@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz#cd0b25b3808cd9e684cd6cd549bbf8e1dcf05ee7" + integrity sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg== "@esbuild/android-arm64@0.18.17": version "0.18.17" @@ -1632,70 +1655,72 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== -"@eslint-community/eslint-utils@^4.2.0": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz#b0fc7e06d0c94f801537fd4237edc2706d3b8e4c" - integrity sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w== +"@eslint-community/eslint-utils@^4.8.0": + version "4.10.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz#8911bd72b2c3640a543609e0400b8c4d2e7e7cb6" + integrity sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg== dependencies: eslint-visitor-keys "^3.4.3" "@eslint-community/regexpp@^4.12.1": - version "4.12.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" - integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + 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/config-array@^0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.2.tgz#3060b809e111abfc97adb0bb1172778b90cb46aa" - integrity sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w== +"@eslint/config-array@^0.21.2": + version "0.21.2" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.2.tgz#f29e22057ad5316cf23836cee9a34c81fffcb7e6" + integrity sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw== dependencies: - "@eslint/object-schema" "^2.1.6" + "@eslint/object-schema" "^2.1.7" debug "^4.3.1" - minimatch "^3.1.2" + minimatch "^3.1.5" -"@eslint/config-helpers@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.2.0.tgz#12dc8d65c31c4b6c3ebf0758db6601eb7692ce59" - integrity sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ== +"@eslint/config-helpers@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.4.2.tgz#1bd006ceeb7e2e55b2b773ab318d300e1a66aeda" + integrity sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw== + dependencies: + "@eslint/core" "^0.17.0" -"@eslint/core@^0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.12.0.tgz#5f960c3d57728be9f6c65bd84aa6aa613078798e" - integrity sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg== +"@eslint/core@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.17.0.tgz#77225820413d9617509da9342190a2019e78761c" + integrity sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ== dependencies: "@types/json-schema" "^7.0.15" -"@eslint/eslintrc@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" - integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== +"@eslint/eslintrc@^3.3.6": + version "3.3.6" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.6.tgz#d22bfd6b3a7d8e1f2c0b2f2e6de111b53ec6e13e" + integrity sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA== dependencies: - ajv "^6.12.4" + ajv "^6.14.0" debug "^4.3.2" espree "^10.0.1" globals "^14.0.0" ignore "^5.2.0" import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" + js-yaml "^4.3.0" + minimatch "^3.1.5" strip-json-comments "^3.1.1" -"@eslint/js@9.23.0": - version "9.23.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.23.0.tgz#c09ded4f3dc63b40b933bcaeb853fceddb64da30" - integrity sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw== +"@eslint/js@9.39.5": + version "9.39.5" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.5.tgz#6f2fbcff75500d229d535e0a949ae13472c84787" + integrity sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A== -"@eslint/object-schema@^2.1.6": - version "2.1.6" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" - integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== +"@eslint/object-schema@^2.1.7": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.7.tgz#6e2126a1347e86a4dedf8706ec67ff8e107ebbad" + integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA== -"@eslint/plugin-kit@^0.2.7": - version "0.2.7" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz#9901d52c136fb8f375906a73dcc382646c3b6a27" - integrity sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g== +"@eslint/plugin-kit@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz#9779e3fd9b7ee33571a57435cf4335a1794a6cb2" + integrity sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA== dependencies: - "@eslint/core" "^0.12.0" + "@eslint/core" "^0.17.0" levn "^0.4.1" "@frctl/core@^0.3.5": @@ -1816,33 +1841,36 @@ dependencies: is-negated-glob "^1.0.0" -"@humanfs/core@^0.19.1": - version "0.19.1" - resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" - integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== +"@humanfs/core@^0.19.2": + version "0.19.2" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.2.tgz#a8272ca03b2acf492670222b2320b6c421bfde60" + integrity sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA== + dependencies: + "@humanfs/types" "^0.15.0" "@humanfs/node@^0.16.6": - version "0.16.6" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" - integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + version "0.16.8" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.8.tgz#8f800cccc13f4f8cd3116e2d9c0a94939da3e3ed" + integrity sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ== dependencies: - "@humanfs/core" "^0.19.1" - "@humanwhocodes/retry" "^0.3.0" + "@humanfs/core" "^0.19.2" + "@humanfs/types" "^0.15.0" + "@humanwhocodes/retry" "^0.4.0" + +"@humanfs/types@^0.15.0": + version "0.15.0" + resolved "https://registry.yarnpkg.com/@humanfs/types/-/types-0.15.0.tgz#f2a09f62012390b2bff3fc6fb248ddec8c09a090" + integrity sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q== "@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/retry@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" - integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== - -"@humanwhocodes/retry@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.2.tgz#1860473de7dfa1546767448f333db80cb0ff2161" - integrity sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ== +"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" + integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -1868,17 +1896,24 @@ resolve-from "^5.0.0" "@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + version "0.1.6" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.6.tgz#8dc9afa2ac1506cb1a58f89940f1c124446c8df3" + integrity sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw== -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": - version "0.3.8" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" - integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.2", "@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.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/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": @@ -1886,38 +1921,39 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - "@jridgewell/source-map@^0.3.3": - version "0.3.6" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" - integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== + 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.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== +"@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15", "@jridgewell/sourcemap-codec@^1.5.0": + 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.17", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28", "@jridgewell/trace-mapping@^0.3.9": + 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" -"@keyv/serialize@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@keyv/serialize/-/serialize-1.0.3.tgz#e0fe3710e2a379cb0490cd41e5a5ffa2bab58bf6" - integrity sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g== +"@keyv/bigmap@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@keyv/bigmap/-/bigmap-1.3.1.tgz#fc82fa83947e7ff68c6798d08907db842771ef2c" + integrity sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ== dependencies: - buffer "^6.0.3" + hashery "^1.4.0" + hookified "^1.15.0" + +"@keyv/serialize@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@keyv/serialize/-/serialize-1.1.1.tgz#0c01dd3a3483882af7cf3878d4e71d505c81fc4a" + integrity sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA== "@kwsites/file-exists@^1.1.1": version "1.1.1" @@ -1936,6 +1972,11 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== +"@napi-rs/lzma-linux-x64-gnu@1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz#e57d4306966078662038094fb38eb9146dc3aea9" + integrity sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ== + "@ngtools/webpack@16.2.16": version "16.2.16" resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-16.2.16.tgz#512da8f3459faafd0cc1f7f7cbec96b678377be6" @@ -2036,33 +2077,33 @@ integrity sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw== "@octokit/core@^6.1.4": - version "6.1.4" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-6.1.4.tgz#f5ccf911cc95b1ce9daf6de425d1664392f867db" - integrity sha512-lAS9k7d6I0MPN+gb9bKDt7X8SdxknYqAMh44S5L+lNqIN2NuV8nvv3g8rPp7MuRxcOpxpUIATWprO0C34a8Qmg== + version "6.1.6" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-6.1.6.tgz#302b3e7188c81e43352c6df4dfabbf897ff192c1" + integrity sha512-kIU8SLQkYWGp3pVKiYzA5OSaNF5EE03P/R8zEmmrG6XwOg5oBjXyQVVIauQ0dgau4zYhpZEhJrvIYt6oM+zZZA== dependencies: "@octokit/auth-token" "^5.0.0" - "@octokit/graphql" "^8.1.2" - "@octokit/request" "^9.2.1" - "@octokit/request-error" "^6.1.7" - "@octokit/types" "^13.6.2" + "@octokit/graphql" "^8.2.2" + "@octokit/request" "^9.2.3" + "@octokit/request-error" "^6.1.8" + "@octokit/types" "^14.0.0" before-after-hook "^3.0.2" universal-user-agent "^7.0.0" -"@octokit/endpoint@^10.1.3": - version "10.1.3" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-10.1.3.tgz#bfe8ff2ec213eb4216065e77654bfbba0fc6d4de" - integrity sha512-nBRBMpKPhQUxCsQQeW+rCJ/OPSMcj3g0nfHn01zGYZXuNDvvXudF/TYY6APj5THlurerpFN4a/dQAIAaM6BYhA== +"@octokit/endpoint@^10.1.4": + version "10.1.4" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-10.1.4.tgz#8783be38a32b95af8bcb6523af20ab4eed7a2adb" + integrity sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA== dependencies: - "@octokit/types" "^13.6.2" + "@octokit/types" "^14.0.0" universal-user-agent "^7.0.2" -"@octokit/graphql@^8.1.2": - version "8.2.1" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-8.2.1.tgz#0cb83600e6b4009805acc1c56ae8e07e6c991b78" - integrity sha512-n57hXtOoHrhwTWdvhVkdJHdhTv0JstjDbDRhJfwIRNfFqmSo1DaK/mD2syoNUoLCyqSjBpGAKOG0BuwF392slw== +"@octokit/graphql@^8.2.2": + version "8.2.2" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-8.2.2.tgz#3db48c4ffdf07f99600cee513baf45e73eced4d1" + integrity sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA== dependencies: - "@octokit/request" "^9.2.2" - "@octokit/types" "^13.8.0" + "@octokit/request" "^9.2.3" + "@octokit/types" "^14.0.0" universal-user-agent "^7.0.0" "@octokit/openapi-types@^24.2.0": @@ -2070,6 +2111,11 @@ resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-24.2.0.tgz#3d55c32eac0d38da1a7083a9c3b0cca77924f7d3" integrity sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg== +"@octokit/openapi-types@^25.1.0": + version "25.1.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-25.1.0.tgz#5a72a9dfaaba72b5b7db375fd05e90ca90dc9682" + integrity sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA== + "@octokit/plugin-paginate-rest@^11.4.2": version "11.6.0" resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz#e5e9ff3530e867c3837fdbff94ce15a2468a1f37" @@ -2089,21 +2135,21 @@ dependencies: "@octokit/types" "^13.10.0" -"@octokit/request-error@^6.1.7": - version "6.1.7" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-6.1.7.tgz#44fc598f5cdf4593e0e58b5155fe2e77230ff6da" - integrity sha512-69NIppAwaauwZv6aOzb+VVLwt+0havz9GT5YplkeJv7fG7a40qpLt/yZKyiDxAhgz0EtgNdNcb96Z0u+Zyuy2g== +"@octokit/request-error@^6.1.8": + version "6.1.8" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-6.1.8.tgz#3c7ce1ca6721eabd43dbddc76b44860de1fdea75" + integrity sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ== dependencies: - "@octokit/types" "^13.6.2" + "@octokit/types" "^14.0.0" -"@octokit/request@^9.2.1", "@octokit/request@^9.2.2": - version "9.2.2" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-9.2.2.tgz#754452ec4692d7fdc32438a14e028eba0e6b2c09" - integrity sha512-dZl0ZHx6gOQGcffgm1/Sf6JfEpmh34v3Af2Uci02vzUYz6qEN6zepoRtmybWXIGXFIK8K9ylE3b+duCWqhArtg== +"@octokit/request@^9.2.3": + version "9.2.4" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-9.2.4.tgz#037400946a30f971917f47175053c1075fac713b" + integrity sha512-q8ybdytBmxa6KogWlNa818r0k1wlqzNC+yNkcQDECHvQo8Vmstrg18JwqJHdJdUiHD2sjlwBgSm9kHkOKe2iyA== dependencies: - "@octokit/endpoint" "^10.1.3" - "@octokit/request-error" "^6.1.7" - "@octokit/types" "^13.6.2" + "@octokit/endpoint" "^10.1.4" + "@octokit/request-error" "^6.1.8" + "@octokit/types" "^14.0.0" fast-content-type-parse "^2.0.0" universal-user-agent "^7.0.2" @@ -2117,106 +2163,107 @@ "@octokit/plugin-request-log" "^5.3.1" "@octokit/plugin-rest-endpoint-methods" "^13.3.0" -"@octokit/types@^13.10.0", "@octokit/types@^13.6.2", "@octokit/types@^13.8.0": +"@octokit/types@^13.10.0": version "13.10.0" resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.10.0.tgz#3e7c6b19c0236c270656e4ea666148c2b51fd1a3" integrity sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA== dependencies: "@octokit/openapi-types" "^24.2.0" +"@octokit/types@^14.0.0": + version "14.1.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-14.1.0.tgz#3bf9b3a3e3b5270964a57cc9d98592ed44f840f2" + integrity sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g== + dependencies: + "@octokit/openapi-types" "^25.1.0" + "@one-ini/wasm@0.1.1": version "0.1.1" resolved "https://registry.yarnpkg.com/@one-ini/wasm/-/wasm-0.1.1.tgz#6013659736c9dbfccc96e8a9c2b3de317df39323" integrity sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw== -"@parcel/watcher-android-arm64@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz#507f836d7e2042f798c7d07ad19c3546f9848ac1" - integrity sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA== - -"@parcel/watcher-darwin-arm64@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz#3d26dce38de6590ef79c47ec2c55793c06ad4f67" - integrity sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw== - -"@parcel/watcher-darwin-x64@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz#99f3af3869069ccf774e4ddfccf7e64fd2311ef8" - integrity sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg== - -"@parcel/watcher-freebsd-x64@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz#14d6857741a9f51dfe51d5b08b7c8afdbc73ad9b" - integrity sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ== - -"@parcel/watcher-linux-arm-glibc@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz#43c3246d6892381db473bb4f663229ad20b609a1" - integrity sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA== - -"@parcel/watcher-linux-arm-musl@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz#663750f7090bb6278d2210de643eb8a3f780d08e" - integrity sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q== - -"@parcel/watcher-linux-arm64-glibc@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz#ba60e1f56977f7e47cd7e31ad65d15fdcbd07e30" - integrity sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w== - -"@parcel/watcher-linux-arm64-musl@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz#f7fbcdff2f04c526f96eac01f97419a6a99855d2" - integrity sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg== - -"@parcel/watcher-linux-x64-glibc@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz#4d2ea0f633eb1917d83d483392ce6181b6a92e4e" - integrity sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A== - -"@parcel/watcher-linux-x64-musl@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz#277b346b05db54f55657301dd77bdf99d63606ee" - integrity sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg== - -"@parcel/watcher-win32-arm64@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz#7e9e02a26784d47503de1d10e8eab6cceb524243" - integrity sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw== - -"@parcel/watcher-win32-ia32@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz#2d0f94fa59a873cdc584bf7f6b1dc628ddf976e6" - integrity sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ== - -"@parcel/watcher-win32-x64@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz#ae52693259664ba6f2228fa61d7ee44b64ea0947" - integrity sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA== +"@parcel/watcher-android-arm64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz#99aaa3223d43807c9340af439cad7e9b6d26ada6" + integrity sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA== + +"@parcel/watcher-darwin-arm64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz#024496e586b4744f09ce532bbe89fe38ef02a64e" + integrity sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw== + +"@parcel/watcher-darwin-x64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz#a4621df1359a93d39a332d9bab5ff09016a0608f" + integrity sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw== + +"@parcel/watcher-freebsd-x64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz#7f565ed1a5b3a5e604e6a4799121518265d62a3d" + integrity sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ== + +"@parcel/watcher-linux-arm-glibc@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz#ad7d3825e67b81999165da42593022045abc0889" + integrity sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg== + +"@parcel/watcher-linux-arm-musl@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz#fe7d1cccb2c483215c090e938cf5cf404d2f9a8c" + integrity sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw== + +"@parcel/watcher-linux-arm64-glibc@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz#7e239dcb4646c4c79f006a7131a48238249530da" + integrity sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g== + +"@parcel/watcher-linux-arm64-musl@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz#c58b8d9c6d8d81594be00dd83aab741c1aaf7e0e" + integrity sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA== + +"@parcel/watcher-linux-x64-glibc@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz#5184fa9a770478d86e56875f4ee163a0abdc8791" + integrity sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A== + +"@parcel/watcher-linux-x64-musl@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz#2d1c55aa7246cbc7670e2612058a8a542c9cf246" + integrity sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw== + +"@parcel/watcher-win32-arm64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz#15e09432040fee9e2213aa9c10ed589012526def" + integrity sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ== + +"@parcel/watcher-win32-x64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz#9bee199a2a4accd557b451ac2c1c793f305ae012" + integrity sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A== "@parcel/watcher@^2.4.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.1.tgz#342507a9cfaaf172479a882309def1e991fb1200" - integrity sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg== + version "2.6.0" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.6.0.tgz#99661f6220070b76a766aba6b7e313a087a1be4f" + integrity sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w== dependencies: - detect-libc "^1.0.3" + detect-libc "^2.0.3" is-glob "^4.0.3" - micromatch "^4.0.5" node-addon-api "^7.0.0" + picomatch "^4.0.4" optionalDependencies: - "@parcel/watcher-android-arm64" "2.5.1" - "@parcel/watcher-darwin-arm64" "2.5.1" - "@parcel/watcher-darwin-x64" "2.5.1" - "@parcel/watcher-freebsd-x64" "2.5.1" - "@parcel/watcher-linux-arm-glibc" "2.5.1" - "@parcel/watcher-linux-arm-musl" "2.5.1" - "@parcel/watcher-linux-arm64-glibc" "2.5.1" - "@parcel/watcher-linux-arm64-musl" "2.5.1" - "@parcel/watcher-linux-x64-glibc" "2.5.1" - "@parcel/watcher-linux-x64-musl" "2.5.1" - "@parcel/watcher-win32-arm64" "2.5.1" - "@parcel/watcher-win32-ia32" "2.5.1" - "@parcel/watcher-win32-x64" "2.5.1" + "@parcel/watcher-android-arm64" "2.6.0" + "@parcel/watcher-darwin-arm64" "2.6.0" + "@parcel/watcher-darwin-x64" "2.6.0" + "@parcel/watcher-freebsd-x64" "2.6.0" + "@parcel/watcher-linux-arm-glibc" "2.6.0" + "@parcel/watcher-linux-arm-musl" "2.6.0" + "@parcel/watcher-linux-arm64-glibc" "2.6.0" + "@parcel/watcher-linux-arm64-musl" "2.6.0" + "@parcel/watcher-linux-x64-glibc" "2.6.0" + "@parcel/watcher-linux-x64-musl" "2.6.0" + "@parcel/watcher-win32-arm64" "2.6.0" + "@parcel/watcher-win32-x64" "2.6.0" "@pkgjs/parseargs@^0.11.0": version "0.11.0" @@ -2235,114 +2282,139 @@ dependencies: graceful-fs "4.2.10" -"@pnpm/npm-conf@^2.1.0": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz#bb375a571a0bd63ab0a23bece33033c683e9b6b0" - integrity sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw== +"@pnpm/npm-conf@^3.0.2": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-3.0.3.tgz#17b59982126c86294a8d248aa1d7b185f2df6484" + integrity sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA== dependencies: "@pnpm/config.env-replace" "^1.1.0" "@pnpm/network.ca-file" "^1.0.1" config-chain "^1.1.11" -"@rollup/rollup-android-arm-eabi@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.38.0.tgz#6ba67cc0f3a2d7e3a208256a349c2cb2798f57be" - integrity sha512-ldomqc4/jDZu/xpYU+aRxo3V4mGCV9HeTgUBANI3oIQMOL+SsxB+S2lxMpkFp5UamSS3XuTMQVbsS24R4J4Qjg== - -"@rollup/rollup-android-arm64@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.38.0.tgz#c8806f88fd6727d3cf144c4ffb00f40d451b6618" - integrity sha512-VUsgcy4GhhT7rokwzYQP+aV9XnSLkkhlEJ0St8pbasuWO/vwphhZQxYEKUP3ayeCYLhk6gEtacRpYP/cj3GjyQ== - -"@rollup/rollup-darwin-arm64@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.38.0.tgz#c4654989b97bba0de7205cf5b3342984d4451d5a" - integrity sha512-buA17AYXlW9Rn091sWMq1xGUvWQFOH4N1rqUxGJtEQzhChxWjldGCCup7r/wUnaI6Au8sKXpoh0xg58a7cgcpg== - -"@rollup/rollup-darwin-x64@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.38.0.tgz#77ee357aeeefe3fe8bee33df18c240e391450476" - integrity sha512-Mgcmc78AjunP1SKXl624vVBOF2bzwNWFPMP4fpOu05vS0amnLcX8gHIge7q/lDAHy3T2HeR0TqrriZDQS2Woeg== - -"@rollup/rollup-freebsd-arm64@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.38.0.tgz#ac8028c99221d1cef22788adda465077d5926911" - integrity sha512-zzJACgjLbQTsscxWqvrEQAEh28hqhebpRz5q/uUd1T7VTwUNZ4VIXQt5hE7ncs0GrF+s7d3S4on4TiXUY8KoQA== - -"@rollup/rollup-freebsd-x64@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.38.0.tgz#64376ff0e1541cd8677e74898782ec4935277e02" - integrity sha512-hCY/KAeYMCyDpEE4pTETam0XZS4/5GXzlLgpi5f0IaPExw9kuB+PDTOTLuPtM10TlRG0U9OSmXJ+Wq9J39LvAg== - -"@rollup/rollup-linux-arm-gnueabihf@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.38.0.tgz#7de1584c09adcac08f90d1e500c679c428b6eb36" - integrity sha512-mimPH43mHl4JdOTD7bUMFhBdrg6f9HzMTOEnzRmXbOZqjijCw8LA5z8uL6LCjxSa67H2xiLFvvO67PT05PRKGg== - -"@rollup/rollup-linux-arm-musleabihf@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.38.0.tgz#1d5d0f28d93cdc37d60c381c6bbe649bed4960d5" - integrity sha512-tPiJtiOoNuIH8XGG8sWoMMkAMm98PUwlriOFCCbZGc9WCax+GLeVRhmaxjJtz6WxrPKACgrwoZ5ia/uapq3ZVg== - -"@rollup/rollup-linux-arm64-gnu@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.38.0.tgz#a97f73a43a374e44bef4a9ed84899c26454831ea" - integrity sha512-wZco59rIVuB0tjQS0CSHTTUcEde+pXQWugZVxWaQFdQQ1VYub/sTrNdY76D1MKdN2NB48JDuGABP6o6fqos8mA== - -"@rollup/rollup-linux-arm64-musl@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.38.0.tgz#00e3b646a7976752052ebc72d005808b9e7f2801" - integrity sha512-fQgqwKmW0REM4LomQ+87PP8w8xvU9LZfeLBKybeli+0yHT7VKILINzFEuggvnV9M3x1Ed4gUBmGUzCo/ikmFbQ== - -"@rollup/rollup-linux-loongarch64-gnu@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.38.0.tgz#0d6dcaa3671cf987faace4b34ab7320ee3c18b65" - integrity sha512-hz5oqQLXTB3SbXpfkKHKXLdIp02/w3M+ajp8p4yWOWwQRtHWiEOCKtc9U+YXahrwdk+3qHdFMDWR5k+4dIlddg== - -"@rollup/rollup-linux-powerpc64le-gnu@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.38.0.tgz#54c2d7a4d86767001475f0157c408fd042f7fd8f" - integrity sha512-NXqygK/dTSibQ+0pzxsL3r4Xl8oPqVoWbZV9niqOnIHV/J92fe65pOir0xjkUZDRSPyFRvu+4YOpJF9BZHQImw== - -"@rollup/rollup-linux-riscv64-gnu@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.38.0.tgz#8cb565417b29851a0c549614898bdab689f23187" - integrity sha512-GEAIabR1uFyvf/jW/5jfu8gjM06/4kZ1W+j1nWTSSB3w6moZEBm7iBtzwQ3a1Pxos2F7Gz+58aVEnZHU295QTg== - -"@rollup/rollup-linux-riscv64-musl@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.38.0.tgz#8bc00b75fd07b15c35a54b41a5f052c01dbf925b" - integrity sha512-9EYTX+Gus2EGPbfs+fh7l95wVADtSQyYw4DfSBcYdUEAmP2lqSZY0Y17yX/3m5VKGGJ4UmIH5LHLkMJft3bYoA== - -"@rollup/rollup-linux-s390x-gnu@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.38.0.tgz#1fe4a88b97e36d64dbf1f01cfa7842d269a094cf" - integrity sha512-Mpp6+Z5VhB9VDk7RwZXoG2qMdERm3Jw07RNlXHE0bOnEeX+l7Fy4bg+NxfyN15ruuY3/7Vrbpm75J9QHFqj5+Q== - -"@rollup/rollup-linux-x64-gnu@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.38.0.tgz#11c32c463e68a86e279cda090a9405a7558f9406" - integrity sha512-vPvNgFlZRAgO7rwncMeE0+8c4Hmc+qixnp00/Uv3ht2x7KYrJ6ERVd3/R0nUtlE6/hu7/HiiNHJ/rP6knRFt1w== - -"@rollup/rollup-linux-x64-musl@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.38.0.tgz#520c2a8547672ec6c56a6833f6d38e9380d63dc7" - integrity sha512-q5Zv+goWvQUGCaL7fU8NuTw8aydIL/C9abAVGCzRReuj5h30TPx4LumBtAidrVOtXnlB+RZkBtExMsfqkMfb8g== - -"@rollup/rollup-win32-arm64-msvc@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.38.0.tgz#d27ab565009357014c9f2d6393ee58bd63a63cb8" - integrity sha512-u/Jbm1BU89Vftqyqbmxdq14nBaQjQX1HhmsdBWqSdGClNaKwhjsg5TpW+5Ibs1mb8Es9wJiMdl86BcmtUVXNZg== - -"@rollup/rollup-win32-ia32-msvc@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.38.0.tgz#6c02847c60fcc7a6d74e00a60f350d079558d84d" - integrity sha512-mqu4PzTrlpNHHbu5qleGvXJoGgHpChBlrBx/mEhTPpnAL1ZAYFlvHD7rLK839LLKQzqEQMFJfGrrOHItN4ZQqA== - -"@rollup/rollup-win32-x64-msvc@4.38.0": - version "4.38.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.38.0.tgz#38197da22c1af7b6b5d1cc7541757379193b8e83" - integrity sha512-jjqy3uWlecfB98Psxb5cD6Fny9Fupv9LrDSPTQZUROqjvZmcCqNu4UMl7qqhlUUGpwiAkotj6GYu4SZdcr/nLw== +"@rollup/rollup-android-arm-eabi@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz#2b86c8fff13a065845ddb65f64d814499ace020f" + integrity sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg== + +"@rollup/rollup-android-arm64@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz#af217357ecc06ae5e4f54ef34ee72b1e37f8dbc3" + integrity sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A== + +"@rollup/rollup-darwin-arm64@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz#e9d0adba06e39b632fc8e880100ff06547eda80b" + integrity sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw== + +"@rollup/rollup-darwin-x64@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz#eff983a29db7d8ea7f733f1ce430fc64e159a5e6" + integrity sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A== + +"@rollup/rollup-freebsd-arm64@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz#abe1399a70e819034f492d05dbcc97964310bb57" + integrity sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ== + +"@rollup/rollup-freebsd-x64@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz#b2e0f8c24a362ac7112be3d5549c6940597e0168" + integrity sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg== + +"@rollup/rollup-linux-arm-gnueabihf@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz#a5f2a7e7eb719254a6800db18e9f369d3c623439" + integrity sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA== + +"@rollup/rollup-linux-arm-musleabihf@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz#390c86c797695af87c38d6f005222d920b5bfa22" + integrity sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ== + +"@rollup/rollup-linux-arm64-gnu@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz#1fea78609a15813cda98d93fe8d987c87017f572" + integrity sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ== + +"@rollup/rollup-linux-arm64-musl@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz#3b50031c9916517576098f6e11b38a13147dc463" + integrity sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g== + +"@rollup/rollup-linux-loong64-gnu@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz#b403255546099a4300b17d976ee1776224c090e5" + integrity sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA== + +"@rollup/rollup-linux-loong64-musl@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz#5900610e59c66ee594539c6590566dbfda7082b1" + integrity sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ== + +"@rollup/rollup-linux-ppc64-gnu@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz#a892cc8b8414bc8ae0b267816b5e384e5d321ff2" + integrity sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w== + +"@rollup/rollup-linux-ppc64-musl@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz#d9e60d568b7db4df2196fb2411b0c6918b2360cc" + integrity sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w== + +"@rollup/rollup-linux-riscv64-gnu@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz#5b3141ab43afbd9e50f639e562e94ed256d201cf" + integrity sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ== + +"@rollup/rollup-linux-riscv64-musl@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz#b0fe751015bc3822f9004884eaba5e5cdfde7aa6" + integrity sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA== + +"@rollup/rollup-linux-s390x-gnu@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz#0cb323e850509e1b9bf6d241328a98b0e12e2916" + integrity sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA== + +"@rollup/rollup-linux-x64-gnu@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz#1e7470123e7a8ba8c160a7a043447472d5549542" + integrity sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw== + +"@rollup/rollup-linux-x64-musl@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz#19df9a17d20ff3c17bd8e9cc2553563ae0aa0580" + integrity sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA== + +"@rollup/rollup-openbsd-x64@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz#31c3ca1bd00e80f309a1d0cb8da4bdf59cb2dfa3" + integrity sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ== + +"@rollup/rollup-openharmony-arm64@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz#84561a14381caecb7652e158d10551a5edc0a6fc" + integrity sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ== + +"@rollup/rollup-win32-arm64-msvc@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz#bc532edb20cd39c0b53eee2dfae43b52c2e3be1e" + integrity sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw== + +"@rollup/rollup-win32-ia32-msvc@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz#a6f51492976c9fc19801be298df2f76a3cbebf7a" + integrity sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ== + +"@rollup/rollup-win32-x64-gnu@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz#ae60710b0868b2fe731d9f7c341fa49cbf8e8629" + integrity sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw== + +"@rollup/rollup-win32-x64-msvc@4.62.4": + version "4.62.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz#c3a265fe0f9af4fb63bad86d3829386bc5da0026" + integrity sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q== "@schematics/angular@16.1.8": version "16.1.8" @@ -2382,6 +2454,18 @@ "@sigstore/protobuf-specs" "^0.2.0" tuf-js "^1.1.7" +"@simple-git/args-pathspec@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@simple-git/args-pathspec/-/args-pathspec-1.0.3.tgz#9ef4a2ad5f49ab4056362d03f93f775b93118ca5" + integrity sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA== + +"@simple-git/argv-parser@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@simple-git/argv-parser/-/argv-parser-1.1.1.tgz#275b839c6eeb5030872c73b1ea839a416885da9d" + integrity sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw== + dependencies: + "@simple-git/args-pathspec" "^1.0.3" + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -2410,14 +2494,9 @@ integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@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== + version "2.0.1" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.1.tgz#35adc6222e3662fa2222ce123b961476a746b9ea" + integrity sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ== "@tufjs/canonical-json@1.0.0": version "1.0.0" @@ -2433,9 +2512,9 @@ minimatch "^9.0.0" "@types/body-parser@*": - version "1.19.5" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" - integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + 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" "*" @@ -2463,9 +2542,9 @@ "@types/node" "*" "@types/cors@^2.8.12": - version "2.8.17" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" - integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== + 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" "*" @@ -2474,10 +2553,10 @@ resolved "https://registry.yarnpkg.com/@types/ejs/-/ejs-3.1.5.tgz#49d738257cc73bafe45c13cb8ff240683b4d5117" integrity sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg== -"@types/estree@1.0.7", "@types/estree@^1.0.5", "@types/estree@^1.0.6": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" - integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== +"@types/estree@1.0.9", "@types/estree@^1.0.5", "@types/estree@^1.0.6": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.9.tgz#cf3f0e876d7bee15a93ab925b82bf570a3904a24" + integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== "@types/expect@^1.20.4": version "1.20.4" @@ -2485,9 +2564,9 @@ integrity sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz#41fec4ea20e9c7b22f024ab88a95c6bb288f51b8" - integrity sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA== + version "5.1.3" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.1.3.tgz#9d34c88c0c9ee62b9a6e4d9f8ab8d7e29688e6b4" + integrity sha512-dPfW8NFiOF4wOHc7+N/QSxlY9cfSsenewGbAz8C8U/MULPd/YZ27LvJUIlzaXie7e6Ove9YunJGgC9tbHD2cKw== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2495,9 +2574,9 @@ "@types/send" "*" "@types/express-serve-static-core@^4.17.33": - version "4.19.6" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" - integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== + version "4.19.9" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.9.tgz#b746a8bb6c389af7a31141397bb539f775b0ae84" + integrity sha512-QP2ESEe/ImWY0HDwNAnK9PvEffUyhLTnWkk7KXzHfyeWAnlrDe1fN77bXl6ia8KT3wPlmA7t9/VPRpnf4Ex9sg== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2505,33 +2584,33 @@ "@types/send" "*" "@types/express@*": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.1.tgz#138d741c6e5db8cc273bec5285cd6e9d0779fc9f" - integrity sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ== + version "5.0.6" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.6.tgz#2d724b2c990dcb8c8444063f3580a903f6d500cc" + integrity sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^5.0.0" - "@types/serve-static" "*" + "@types/serve-static" "^2" "@types/express@^4.17.13": - version "4.17.21" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" - integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== + 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" "*" + "@types/serve-static" "^1" "@types/http-errors@*": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" - integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + 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.8": - version "1.17.16" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.16.tgz#dee360707b35b3cc85afcde89ffeebff7d7f9240" - integrity sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w== + 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" "*" @@ -2553,9 +2632,9 @@ "@types/lodash" "*" "@types/lodash@*": - version "4.17.16" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.16.tgz#94ae78fab4a38d73086e962d0b65c30d816bfb0a" - integrity sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g== + version "4.17.25" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.25.tgz#69765ac7bcddb0eb072961cf292524a8f5b3c2c0" + integrity sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ== "@types/mime@^1": version "1.3.5" @@ -2563,18 +2642,25 @@ integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/node-forge@^1.3.0": - version "1.3.11" - resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" - integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + version "1.3.14" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.14.tgz#006c2616ccd65550560c2757d8472eb6d3ecea0b" + integrity sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw== dependencies: "@types/node" "*" "@types/node@*", "@types/node@>=10.0.0", "@types/node@>=18": - version "22.13.16" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.16.tgz#802cff8e4c3b3fc7461c2adcc92d73d89779edad" - integrity sha512-15tM+qA4Ypml/N7kyRdvfRjBQT2RL461uF1Bldn06K0Nzn1lY3nAPgHlsVrJxdZ9WhZiW0Fmc1lOYMtDsAuB3w== + version "26.2.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-26.2.0.tgz#5a4875a862fda8fdc57de8faa579bb81ecba1685" + integrity sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg== dependencies: - undici-types "~6.20.0" + undici-types "~8.3.0" + +"@types/node@^18.19.124": + version "18.19.130" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.130.tgz#da4c6324793a79defb7a62cba3947ec5add00d59" + integrity sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg== + dependencies: + undici-types "~5.26.4" "@types/normalize-package-data@^2.4.3": version "2.4.4" @@ -2582,9 +2668,9 @@ integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== "@types/qs@*": - version "6.9.18" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.18.tgz#877292caa91f7c1b213032b34626505b746624c2" - integrity sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA== + version "6.15.1" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.15.1.tgz#8606884272c63f0db96986bd3548650d8a9388bf" + integrity sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw== "@types/range-parser@*": version "1.2.7" @@ -2597,9 +2683,16 @@ integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/send@*": - version "0.17.4" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" - integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + 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" "*" @@ -2611,14 +2704,22 @@ dependencies: "@types/express" "*" -"@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.7" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" - integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== +"@types/serve-static@^1", "@types/serve-static@^1.13.10": + 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/serve-static@^2": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-2.2.0.tgz#d4a447503ead0d1671132d1ab6bd58b805d8de6a" + integrity sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ== dependencies: "@types/http-errors" "*" "@types/node" "*" - "@types/send" "*" "@types/sockjs@^0.3.33": version "0.3.36" @@ -2635,7 +2736,7 @@ "@types/expect" "^1.20.4" "@types/node" "*" -"@types/ws@^8.5.5": +"@types/ws@^8.5.12", "@types/ws@^8.5.5": version "8.18.1" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.1.tgz#48464e4bf2ddfd17db13d845467f6070ffea4aa9" integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== @@ -2643,34 +2744,34 @@ "@types/node" "*" "@visual-framework/vf-back-to-top@^1.0.1": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@visual-framework/vf-back-to-top/-/vf-back-to-top-1.0.8.tgz#766978ab97d33fdfcf7810494a99a3de756633d5" - integrity sha512-JsPauaYhrZbswPqUKhk/T/SC3p/NJ2bTUg3Bi964Voho558amtIITOV+61sSMFebwArSTG1yxXJw4WX3EnU1vg== + version "1.0.9" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-back-to-top/-/vf-back-to-top-1.0.9.tgz#9deba36324dd8a8fdc3dc77644edf0e544f84221" + integrity sha512-6ahjoDW/Qd6D3bsmEi0L3Pd/XRqrM4jlJKUtfaldYu09PPIoIHFdIis3i4gLfvpfqEmjpWi2BJurrcDrYo3uiA== -"@visual-framework/vf-badge@^3.0.3": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@visual-framework/vf-badge/-/vf-badge-3.0.4.tgz#1c6c2a761550ede565b1b703c646949835da078a" - integrity sha512-x7pKHU2gvGuS+uhZhyCKiK6ItB3dUd2NNQ8viRJX+PZS89c4Yu9AwFbL8+xrxvFzqe4WOvFXQgNH88LKFSAYmw== +"@visual-framework/vf-badge@^3.0.3", "@visual-framework/vf-badge@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-badge/-/vf-badge-3.0.5.tgz#3915e19517179258b011d6cac09c2456cf5bff48" + integrity sha512-RnUvRnBD6S2R457bbvsWK8Z4Xf7S6RXsl36rz3UOzzdfS8T55p+aSlv0p2vpT78Ud4KjQCcZUedDc+Q+ZvVfNA== dependencies: "@visual-framework/vf-box" "^2.4.0" "@visual-framework/vf-stack" "^3.0.1" "@visual-framework/vf-u-fullbleed" "^1.2.3" -"@visual-framework/vf-banner@2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@visual-framework/vf-banner/-/vf-banner-2.0.3.tgz#8bd24b9c7f419ee0c1edaad97be11a29ebc7da05" - integrity sha512-UutHr9JVXJ5qMU5Nhz2G82f2xa/LWtAyf4QjeXST8iUIUwG6V6iTD+Z4N5m6Oi3hWCaRN/eh5mR7TJOYg5S1PQ== +"@visual-framework/vf-banner@^2.0.3": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-banner/-/vf-banner-2.0.6.tgz#6d95650fba1103cf13d0ffe669a3746f9887fe5c" + integrity sha512-Sy6kFdd2wA1op7xm4Mjspc3D3ZsT1MebRP2EaGLjJFwlNcxY77AdVYCTeEVWKXTN4QXM+1in6GEPebpyWylE5g== dependencies: "@visual-framework/vf-box" "^2.4.0" - "@visual-framework/vf-button" "^3.0.1" + "@visual-framework/vf-button" "3.0.2" "@visual-framework/vf-grid" "^1.4.1" - "@visual-framework/vf-stack" "^3.0.0" - "@visual-framework/vf-u-fullbleed" "^1.2.2" + "@visual-framework/vf-stack" "^3.0.1" + "@visual-framework/vf-u-fullbleed" "^1.2.3" -"@visual-framework/vf-blockquote@^1.2.7", "@visual-framework/vf-blockquote@^1.2.8": - version "1.2.13" - resolved "https://registry.yarnpkg.com/@visual-framework/vf-blockquote/-/vf-blockquote-1.2.13.tgz#261c62ff5679142f33ef50121644c8d414074fdc" - integrity sha512-xo2l174/1aAIi1C0EefzT/RsXzJzXN4abd3mrfp7mCp2WRJ1aID/m1E36OUzO1+WZqxI40cxIZ1GcPVsYYH8Vg== +"@visual-framework/vf-blockquote@^1.2.14", "@visual-framework/vf-blockquote@^1.2.8": + version "1.2.14" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-blockquote/-/vf-blockquote-1.2.14.tgz#2c5a01fbe3a8437004e3ee903497fac3117f94eb" + integrity sha512-nq40xOHTQG/63AmozbDdy42kXsIIfz6qmc5ySkeunXOmHgTS3Y7Z5koynV8jzQ9qrVyZ2jBrSWeuEhzl7cmabQ== dependencies: "@visual-framework/vf-profile" "^1.4.1" "@visual-framework/vf-text" "^1.1.1" @@ -2690,15 +2791,86 @@ resolved "https://registry.yarnpkg.com/@visual-framework/vf-button/-/vf-button-3.0.2.tgz#11bd9a65ee4909cc28d48531f7f2e0ef892c0578" integrity sha512-IULZ42+4avu9R9Gnf9bN+w46joPXa4ntzVzRzVgGg5Xuzd9RJKiDQTIjnTuOjsbChsWC0TtMYac5vgZSkCc3pA== -"@visual-framework/vf-button@^3.0.1": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@visual-framework/vf-button/-/vf-button-3.0.3.tgz#9ca3f9dd70d1c70291c5a73f3597855cc682a9b4" - integrity sha512-wz20Be6E4wIBoHusJwtciJV35d7KCkmkPH8oWZtC1lXZY0GHHE/V9BmRSQjRzB/M1hx6oCBxUjpamORQxxJiEg== +"@visual-framework/vf-button@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-button/-/vf-button-3.0.5.tgz#12577d7fff3b58d0ef05d3c230375d48cce78ca7" + integrity sha512-kyL2RXeAMAh3gaS49IrZfMtKQPLnExeT8InsMFVYDDE2LXL6SBLiBdZJEZdTPpB6nqwXpgftblPJQ2FmTlZrpQ== + +"@visual-framework/vf-chatbot-action-prompt@^1.0.0-beta.3": + version "1.0.0-beta.3" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-chatbot-action-prompt/-/vf-chatbot-action-prompt-1.0.0-beta.3.tgz#372e7da370c647a381fd056f2b38e896380fabb6" + integrity sha512-RjcBpFfJwHJ4BvI30DpqApy5swuuqlygyQxhc/83fYH8dFcq3Dmdk06ouLLTL9b8EweFQK84d/laIO9+ffiRKg== + +"@visual-framework/vf-chatbot-dialog@^1.0.0-beta.1": + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-chatbot-dialog/-/vf-chatbot-dialog-1.0.0-beta.1.tgz#468047162a1dd18db635823437c6d8b0dd6ef433" + integrity sha512-0mIvUS4wpgQey7O50DzNtOOt+E0A4a6nlJpGges3KrXsZCKU44sgItopqIHrQ1r3JOd4wO/LMu09Ai5EZ4HcLA== + +"@visual-framework/vf-chatbot-fab@^1.0.0-beta.3": + version "1.0.0-beta.3" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-chatbot-fab/-/vf-chatbot-fab-1.0.0-beta.3.tgz#6a404875be00b8d01e77f279371b876ccf02fdf0" + integrity sha512-Iw9IRnvxk0GooOF4ooGXBjHodh//J+P3KdWYfwNa1J2MHm92Hv4QEAPVeVV+bXsV/CGF3TjaAZMGvO2RTt8fbg== + +"@visual-framework/vf-chatbot-feedback@^1.0.0-beta.4": + version "1.0.0-beta.4" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-chatbot-feedback/-/vf-chatbot-feedback-1.0.0-beta.4.tgz#8e80817045205773a6bd8a046bcec49298625d22" + integrity sha512-WSZgQ+kwYsxG96DhSgKPBurG7v/aaxdpdp2plLdUzYoTY95JuHV1UGtAgp/MeOu1akJoIz6pElQhTBWNxjy6qg== + +"@visual-framework/vf-chatbot-modal@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-chatbot-modal/-/vf-chatbot-modal-1.0.0.tgz#4960c9546b25d88404d089ec0471fc3be14a0d6f" + integrity sha512-N6N6o1tqyXvkuW/e/KHpy2SyMkbJYwtNiQKsQJKzsBzqjUoZLgtrmHHIGU+Nv/ZEdq9Fgj1PEgAb8hgUR8y34Q== + dependencies: + "@visual-framework/vf-chatbot-action-prompt" "^1.0.0-beta.3" + "@visual-framework/vf-chatbot-dialog" "^1.0.0-beta.1" + "@visual-framework/vf-chatbot-fab" "^1.0.0-beta.3" + "@visual-framework/vf-chatbot-feedback" "^1.0.0-beta.4" + "@visual-framework/vf-chatbot-prompt" "^1.0.0-beta.3" + "@visual-framework/vf-chatbot-selector" "^1.0.0-beta.3" + "@visual-framework/vf-chatbot-sources" "^1.0.0-beta.3" + "@visual-framework/vf-chatbot-welcome" "^1.0.0" + +"@visual-framework/vf-chatbot-prompt@^1.0.0-beta.3": + version "1.0.0-beta.3" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-chatbot-prompt/-/vf-chatbot-prompt-1.0.0-beta.3.tgz#6fda56b965d8e300d4af2c908b4c42b997e7f7a8" + integrity sha512-CC1YmKJIzFURg/eXAyniY+mtKyQ8HYgSBOUtXc7CLD9sdpNzPXmdFVt/EWJIUJ4xdxVP+1bpKL3HWa6g3tZxxg== + +"@visual-framework/vf-chatbot-selector@^1.0.0-beta.3": + version "1.0.0-beta.3" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-chatbot-selector/-/vf-chatbot-selector-1.0.0-beta.3.tgz#5c9028800832d7a12887968ee44f578f22f83273" + integrity sha512-kVM/bU1SXlgGn49B8+e2Bz47YH+miNMUP0bZp4puZ+luHqPNYPVtUqXODWtJiESiiV7t6aB4Zm7C/Lvatb5gtg== + +"@visual-framework/vf-chatbot-sources@^1.0.0-beta.3": + version "1.0.0-beta.3" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-chatbot-sources/-/vf-chatbot-sources-1.0.0-beta.3.tgz#c238beaa30618a5decdef25e9901ae4c8c6d9a86" + integrity sha512-C07dC85WFSQqLrzGNrxIhRl75oO8U3kztKYE9HXYANmJbjZ8RtjTf4AIhv+fXOgYX6rbiKENZuNGikGK//y6tw== + +"@visual-framework/vf-chatbot-standalone@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-chatbot-standalone/-/vf-chatbot-standalone-1.0.0.tgz#7db001902d7b4ade801fcfb13cf4065d6889a62b" + integrity sha512-5o3PVnmYRvncpSzeYy1PIYggst5hCqk/hQ32CYOd4GdR94JP15KcruuHYkTPvS9Y1H6kzjjRKQWrggY2P7VL4Q== + dependencies: + "@visual-framework/vf-chatbot-action-prompt" "^1.0.0-beta.3" + "@visual-framework/vf-chatbot-feedback" "^1.0.0-beta.4" + "@visual-framework/vf-chatbot-prompt" "^1.0.0-beta.3" + "@visual-framework/vf-chatbot-selector" "^1.0.0-beta.3" + "@visual-framework/vf-chatbot-sources" "^1.0.0-beta.3" + "@visual-framework/vf-chatbot-welcome" "^1.0.0" + +"@visual-framework/vf-chatbot-welcome@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-chatbot-welcome/-/vf-chatbot-welcome-1.0.0.tgz#4a966a1bbfe7ff1c892d6615c47f17e700d021ff" + integrity sha512-XoguF4MJ3/BnekhCI/cZ4d/0WJXfJ5mZpk8n3EDsdwwS+/j8bXngVPGbdptNRq+KKAMtATPN9PaHP4VhGvO6mA== + +"@visual-framework/vf-chatbot@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-chatbot/-/vf-chatbot-1.0.0.tgz#a73feceb4c9f13bbb8bb6fc00033c773afd2adf9" + integrity sha512-QZNpWFejw1lUqMjjbc26SrZRV2jJkdfwuREjIIFAmnFpgIe9B8Gm2Ba1XoZQLwcZZghHgdyPNouU4SsVuw41rg== "@visual-framework/vf-component-generator@^1.1.6": - version "1.1.7" - resolved "https://registry.yarnpkg.com/@visual-framework/vf-component-generator/-/vf-component-generator-1.1.7.tgz#e89d4d0c310218ae28af8451ebffa44117a633c5" - integrity sha512-4mct1uO43BbJwSLyPCWAQ0nMpAQs8etuyhcJItDnBI3a/7at31vQW5p4tp105mzjWQGsKpy3dehf4dZw0lKhlA== + version "1.1.8" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-component-generator/-/vf-component-generator-1.1.8.tgz#74a048167f4a5f715d679a1fbcf12cd06e8798c9" + integrity sha512-IC/JoWJYUj6cCbeZNmZdX11VIzjU2uwG19tyRwxOFWi1K+wTtfST7ggpwZgCrhwT7F4gp6ra035kxqn2n28USQ== dependencies: gulp-shell "^0.8.0" yeoman-generator "^7.3.3" @@ -2717,18 +2889,18 @@ resolved "https://registry.yarnpkg.com/@visual-framework/vf-config/-/vf-config-1.0.1-alpha.0.tgz#2dda99f7d2766c32cb46b321560ec15c8a3d55fe" integrity sha512-T5XSohedN4OKxqA0n44V8xvpDMAz1zAW0TGa+2a1B3lMpAWAt5WVpG2tdOQknHDQQpq/K/YRxFySSXk+G7f8Ew== -"@visual-framework/vf-content@1.6.16": - version "1.6.16" - resolved "https://registry.yarnpkg.com/@visual-framework/vf-content/-/vf-content-1.6.16.tgz#f424c71e06cc99396dbaf16008a950741c5676f8" - integrity sha512-XAihipKTp+k4Lk2HZ84+TeKat6ido/kVhgaNJXWRry3sceCpORHB6Fd6a1+sJOyiuPH/c2V9OH9215h3A+FuXw== +"@visual-framework/vf-content@^1.6.16": + version "1.6.21" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-content/-/vf-content-1.6.21.tgz#cb85812d0298177630e7812698bf4b5152055289" + integrity sha512-SUOXoaaxRU16YV4U1vI2iTijp5FNWbe50eCTMMijEHuJi2UBuJh5VOSagsom3SA6ShT607QStAULgYSncwcyFQ== dependencies: - "@visual-framework/vf-badge" "^3.0.3" - "@visual-framework/vf-blockquote" "^1.2.7" + "@visual-framework/vf-badge" "^3.0.5" + "@visual-framework/vf-blockquote" "^1.2.14" "@visual-framework/vf-box" "^2.4.0" - "@visual-framework/vf-button" "^3.0.1" + "@visual-framework/vf-button" "^3.0.5" "@visual-framework/vf-divider" "^2.0.1" - "@visual-framework/vf-figure" "^2.0.0" - "@visual-framework/vf-form" "^2.0.2" + "@visual-framework/vf-figure" "^2.0.2" + "@visual-framework/vf-form" "^2.0.3" "@visual-framework/vf-heading" "^1.1.1" "@visual-framework/vf-link" "^2.0.2" "@visual-framework/vf-list" "^1.1.2" @@ -2750,7 +2922,7 @@ highlight.js "^11.0.0" marked "13.0.3" -"@visual-framework/vf-design-tokens@^3.6.5": +"@visual-framework/vf-design-tokens@^3.6.3", "@visual-framework/vf-design-tokens@^3.6.5": version "3.6.5" resolved "https://registry.yarnpkg.com/@visual-framework/vf-design-tokens/-/vf-design-tokens-3.6.5.tgz#0464c4da5be9d76c10132b3f514150148b75b594" integrity sha512-wQPsITRwr1uW/H59shBuFhPkKpLD6R7F/satVBHgaWMBSSYcTFk4dkU1bJ4fHaXsGPwdM/TBUeIF4sm2Nl6dcw== @@ -2760,22 +2932,35 @@ resolved "https://registry.yarnpkg.com/@visual-framework/vf-divider/-/vf-divider-2.0.1.tgz#d9d426f9283b44b332f11bac6607504acc20c1b0" integrity sha512-qVoSxEE1lcXjqk8D5dYYDRql/f/cPf+f3oy4jHfSUN2LeEomOOGyUhIix0xzcWwy0MDimb5O/3WJE3p7L3Mcfg== -"@visual-framework/vf-figure@^2.0.0": +"@visual-framework/vf-extensions-react@^0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-extensions-react/-/vf-extensions-react-0.0.8.tgz#28812f1f1f76716a8c9895a6d490e54e6e844adf" + integrity sha512-EumChtrlYWAalHeMRb9v6otdMYwXP8Y0bixklJAKTjGT+EU7cC+2FD1treeQczMJkriBj7bXp7GnmK+gxguwGA== + dependencies: + prop-types "15.8.1" + react-dom-fragment "1.0.0" + +"@visual-framework/vf-figure@^2.0.2": version "2.0.2" resolved "https://registry.yarnpkg.com/@visual-framework/vf-figure/-/vf-figure-2.0.2.tgz#2c20cbda07dd4da666373fa08567f2ac5de9261a" integrity sha512-YEcOvSTOAAvnrn4oUDeQbk9VLElr2gnq1OCJmd4ZpRcfuN2U7qy+iFRj7Xqt5dVTdhVierHyUtYtaMMMybrCug== -"@visual-framework/vf-font-plex-mono@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@visual-framework/vf-font-plex-mono/-/vf-font-plex-mono-1.1.1.tgz#bbb38e1b7b2182a822fe19d823da9bba80d72d84" - integrity sha512-8y+B4SFrOwLV8M21NC2aZuafgIz8PRvkxIYFbdf1xDRdXLm1nPxUC6wuajMEEd4kBWmD+Le5/CNy2ygyRHGWMw== +"@visual-framework/vf-font-plex-mono@^1.1.3", "@visual-framework/vf-font-plex-mono@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-font-plex-mono/-/vf-font-plex-mono-1.1.4.tgz#0b5440442db6d89aeceb272bf5379b94a9dc2511" + integrity sha512-mXzs/yXRV6ENR3Rc6j7c7IPaPHQiC1SrClTQO/WPz/Q6BigdyuICrEwEGKMsdOzRig5C9cdig8F1lB3idlIYwA== -"@visual-framework/vf-font-plex-sans@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@visual-framework/vf-font-plex-sans/-/vf-font-plex-sans-1.1.1.tgz#25a4e7aa0dcffa83be278df42d6b77423e3e0a21" - integrity sha512-3DM5UZskVMfu4Zr8A6xLbqu5gkfrIfAw1egK64UrNh5pvsCalqirP5L2mmGPfOSrota386LfaZrz1HxESXFLSw== +"@visual-framework/vf-font-plex-sans@^1.1.3", "@visual-framework/vf-font-plex-sans@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-font-plex-sans/-/vf-font-plex-sans-1.1.4.tgz#048278b36233c827081b0b01a8a4304ce791b957" + integrity sha512-PjKdAlqk6uJsbKXb4C5UP+2FiSU4GXdry/hbPKsxeF37tJFHGvy1hijRgLxZebXtTOXvPlYYuuFhg+Y/mmqibQ== + +"@visual-framework/vf-footer@^1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-footer/-/vf-footer-1.2.4.tgz#b8d12e365ea09a7925ec04eeb761e11f32ce8e76" + integrity sha512-OgLUrHEmiADWYxWQi+jtra6P9qqyrLDlVEf4qh2/lGWJxgnxjnOQ/mFIxpGeMJ5Rx9yO1gDv6q2GsGN5ZragyA== -"@visual-framework/vf-form@^2.0.2": +"@visual-framework/vf-form@^2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@visual-framework/vf-form/-/vf-form-2.0.3.tgz#fc444ed88e0c05b520fbf90e45ef29ed58183a83" integrity sha512-mV1gdxOjQRAQRXUn7RX2AbfaMiMaHYAyvrooYpMrsAF+16Fv7y1PrPgcb9oQ4YwW5eXOYA+nXt0hIeHamyhO3Q== @@ -2846,6 +3031,11 @@ resolved "https://registry.yarnpkg.com/@visual-framework/vf-frctl-extensions/-/vf-frctl-extensions-2.0.0.tgz#c3fa6237090fcedaffdc5610b6e46bd0932bd30b" integrity sha512-oRrZJWGSRkuuPGe4I8h7/OSa/cILy7gVDkvhLnqZ2k+BadHBEi8Zsk5rjxHg5xMbjFJ/PeFkTtlwANH+DpR/Ww== +"@visual-framework/vf-global-header@^3.1.6": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-global-header/-/vf-global-header-3.1.6.tgz#de193c62ac90e2fce1ddba313d4933e4bafaac02" + integrity sha512-Cw1Jhyz8pR/G6CgbnBhiw01aGMjsndg//HnKfme9+LD426WnGn6/eEGTHSd4bqTE/A0lWm/TTlO+6e/aTkn3Kw== + "@visual-framework/vf-grid@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@visual-framework/vf-grid/-/vf-grid-1.4.1.tgz#990930180e76b42690df0e52e05fbfe81b4482d7" @@ -2857,9 +3047,9 @@ integrity sha512-mtjuJ/hmyBbpKhvV2T3yF43h/RiDMUVWn17lHIe9JCVbFp4oTrm0D4tfOsKk1/SIkg8CC4jh+lgCjFtkGcPSzg== "@visual-framework/vf-hero@^4.0.3": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@visual-framework/vf-hero/-/vf-hero-4.0.5.tgz#43d5f97f1b4481516dea7ece98bfbe1cd4120587" - integrity sha512-t1QFkdLdNE1zIBIVfyavqrYZzYf6nOzKON5NQwkyPs5LG8vx0i2YxErkDAJsKvw5lTjNdqSi6kiLRN3V+aL55g== + version "4.0.7" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-hero/-/vf-hero-4.0.7.tgz#832321fa14d454c87111893809ea1b38d5db4b7d" + integrity sha512-rlsAUCF0Nh00DGbEtkZJg28bYS8PzvRgZZ+SYXjxXwhSncBuMXm+EyMr/G5nt/aupamRcetoVHZo36a1lujBjg== dependencies: "@visual-framework/vf-box" "^2.4.0" "@visual-framework/vf-stack" "^3.0.1" @@ -2911,19 +3101,24 @@ stylelint-scss "^6.11.1" vinyl-source-stream "^2.0.0" +"@visual-framework/vf-sass-config@2.6.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-sass-config/-/vf-sass-config-2.6.1.tgz#e680d1b2f8fb633d7a3330f7d807572d435afa61" + integrity sha512-IVFFH3N5wWhyDrwxTwmrOaH54X8C4fqBjzzgCGzyEcPWaZ8R3S927adn8G+atjku3V5fnq8Mwqgkt6u3GXw0Xg== + "@visual-framework/vf-sass-config@^2.7.3": version "2.7.3" resolved "https://registry.yarnpkg.com/@visual-framework/vf-sass-config/-/vf-sass-config-2.7.3.tgz#67d3aae60490e7402a7f5d66c53aed308cadaa79" integrity sha512-+sSx4zPnnuLE2+yrrzM6WyVX6nqItggOaHc4qQD29U/24OFq2tCe/kZWRj6Jb4Yl5ZVaFZHXLqKNLpWFeSSkEw== "@visual-framework/vf-sass-starter@^0.1.30": - version "0.1.31" - resolved "https://registry.yarnpkg.com/@visual-framework/vf-sass-starter/-/vf-sass-starter-0.1.31.tgz#d11b5f77ef1a6f27eeec64b1dd02f8aded078e6e" - integrity sha512-K3HKczn/AChU02kdeWUZw7r8/EKxiBtakJNwCkhfM37aiNcazVsD4yMuTWy1Tm6QNJSv0HMMBWQxlOz8YSC/vQ== + version "0.1.33" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-sass-starter/-/vf-sass-starter-0.1.33.tgz#60bc33a6cdc398e8c0faa37305f7dfef8821bb0b" + integrity sha512-ahcNlovA9nxLabi7aUNa2gZYfkgGcVgXzb+1R56Rpp96e4vVccQhOejr2LtdHAa5CTi5psDWBiq/kCM319EFiQ== dependencies: "@visual-framework/vf-design-tokens" "^3.6.5" - "@visual-framework/vf-font-plex-mono" "^1.1.1" - "@visual-framework/vf-font-plex-sans" "^1.1.1" + "@visual-framework/vf-font-plex-mono" "^1.1.4" + "@visual-framework/vf-font-plex-sans" "^1.1.4" "@visual-framework/vf-sass-config" "^2.7.3" "@visual-framework/vf-sass-utilities" "^1.0.1" "@visual-framework/vf-utility-classes" "^2.0.0" @@ -2933,6 +3128,11 @@ resolved "https://registry.yarnpkg.com/@visual-framework/vf-sass-utilities/-/vf-sass-utilities-1.0.1.tgz#89bcc45d154763e098654d50a597f54a2a47f153" integrity sha512-AeZAUep3t6VGlBjLzOEFcuXmUhB5T6iJY1Hk/y/MMBA8fQPtFsC2t5VfLBGzCEyu9XneTrcHaqHFZXaZA42tEQ== +"@visual-framework/vf-search-client-side@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-search-client-side/-/vf-search-client-side-2.0.3.tgz#a63a8b4e3f2f2d7dd25ce2d8f8e03c33a8900c9a" + integrity sha512-QWURI3lqbSYYDUc92OMFaFNQEVAECkyrJ0Ft7HfMD5aRhXFj0eE5o5jxbEcYHs0ztNcoKo0uMvC1rGP9IBYbUQ== + "@visual-framework/vf-search@^1.0.0": version "1.2.1" resolved "https://registry.yarnpkg.com/@visual-framework/vf-search/-/vf-search-1.2.1.tgz#5241ccdfdc06eae3f5ed51ccb12ac25bc1969f99" @@ -2944,9 +3144,9 @@ integrity sha512-QtLe3p7w5reXWnjw4il/OIzIxll7oW6DOKgtrKxjldNmp5INNfP8mMrS3Y0qwhvScz0bhPydROBl5sglH6uU1g== "@visual-framework/vf-tabs@^2.1.5": - version "2.1.10" - resolved "https://registry.yarnpkg.com/@visual-framework/vf-tabs/-/vf-tabs-2.1.10.tgz#624ace671b46bf03709df824e4b5180a3c7d9892" - integrity sha512-sRbSCHaCvvIhjDgOkOSi5NJ6t/HT44itIHjeo6Wjds4TpwNG+LmLocE+yZvEqQ5ybsxfl1irm5ECUOOXhDFNNQ== + version "2.1.11" + resolved "https://registry.yarnpkg.com/@visual-framework/vf-tabs/-/vf-tabs-2.1.11.tgz#abccd3bcaadb1a29f3df2a320aa2c150fc0c9f6b" + integrity sha512-Ehdsyec+BpymzaxqDgnkANJh/IUkrsZ6xs0GBNVTmJUGr2IBkLd3Pi9subcvhKJlhMcj8A+OEWA5EDfXDo5Crg== "@visual-framework/vf-text@^1.1.1": version "1.1.1" @@ -2958,7 +3158,7 @@ resolved "https://registry.yarnpkg.com/@visual-framework/vf-u-fullbleed/-/vf-u-fullbleed-1.2.3.tgz#616b7ca1c95b799dc646afd0377fe113188e2158" integrity sha512-eMkuflzjGgrxV7u0n5do5avn4PGEvsnXs2WDERdp+IT3zFcFumsE/xmhYqW+SYzXx7jDAvvD9kpG7sm3WDuKOQ== -"@visual-framework/vf-utility-classes@^2.0.0": +"@visual-framework/vf-utility-classes@2.0.0", "@visual-framework/vf-utility-classes@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@visual-framework/vf-utility-classes/-/vf-utility-classes-2.0.0.tgz#c0264ba3a016b5d38cfa38d905e1b61862183745" integrity sha512-a1wuEKGd/EjWha0f2wL/TdFKbuiB4Fsl3o/VlzjgJKRkdvlCAuWHWdSB1RXGCeIqwR8VTD04eczn+g75jfmfmA== @@ -3192,10 +3392,10 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.14.0, acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2: - version "8.14.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" - integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== +acorn@^8.15.0, acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2: + version "8.18.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.18.0.tgz#4faf01b2d6d326bfeed97aea1f52220b5f4c1940" + integrity sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ== adjust-sourcemap-loader@^4.0.0: version "4.0.0" @@ -3269,10 +3469,10 @@ ajv@^4.7.0: co "^4.6.0" json-stable-stringify "^1.0.1" -ajv@^6.0.1, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== +ajv@^6.0.1, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.5, ajv@^6.14.0: + version "6.15.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.15.0.tgz#07e982c74626167aa7a2495c53817892d7139492" + integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -3280,9 +3480,9 @@ ajv@^6.0.1, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5: uri-js "^4.2.2" ajv@^8.0.0, ajv@^8.0.1, ajv@^8.9.0: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + version "8.20.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.20.0.tgz#304b3636add88ba7d936760dd50ece006dea95f9" + integrity sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA== dependencies: fast-deep-equal "^3.1.3" fast-uri "^3.0.1" @@ -3373,10 +3573,10 @@ ansi-regex@^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.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== +ansi-regex@^6.0.1, ansi-regex@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" + integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== ansi-styles@^2.2.1: version "2.2.1" @@ -3398,9 +3598,9 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: color-convert "^2.0.1" ansi-styles@^6.1.0, ansi-styles@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + version "6.2.3" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" + integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== ansi-wrap@0.1.0, ansi-wrap@^0.1.0: version "0.1.0" @@ -3431,9 +3631,9 @@ append-buffer@^1.0.2: buffer-equal "^1.0.0" "aproba@^1.0.3 || ^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" - integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.1.0.tgz#75500a190313d95c64e871e7e4284c6ac219f0b1" + integrity sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew== archy@^1.0.0: version "1.0.0" @@ -3675,7 +3875,7 @@ async@^2.6.0: dependencies: lodash "^4.17.14" -async@^3.2.3: +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== @@ -3708,14 +3908,13 @@ autoprefixer@10.4.14: postcss-value-parser "^4.2.0" autoprefixer@^10.4.16: - version "10.4.21" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.21.tgz#77189468e7a8ad1d9a37fbc08efc9f480cf0a95d" - integrity sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ== + version "10.5.4" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.5.4.tgz#3b7dd848b4155514a95ad1f6ce598844bea09697" + integrity sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA== dependencies: - browserslist "^4.24.4" - caniuse-lite "^1.0.30001702" - fraction.js "^4.3.7" - normalize-range "^0.1.2" + browserslist "^4.28.6" + caniuse-lite "^1.0.30001806" + fraction.js "^5.3.4" picocolors "^1.1.1" postcss-value-parser "^4.2.0" @@ -3739,9 +3938,9 @@ axios@0.21.4: follow-redirects "^1.14.0" b4a@^1.6.4: - version "1.6.7" - resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.7.tgz#a99587d4ebbfbd5a6e3b21bdb5d5fa385767abe4" - integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg== + version "1.8.1" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.8.1.tgz#7f16334ca80127aeb26064a28841acbf174840a4" + integrity sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw== babel-loader@9.1.3: version "9.1.3" @@ -3763,12 +3962,12 @@ babel-plugin-istanbul@6.1.1: test-exclude "^6.0.0" babel-plugin-polyfill-corejs2@^0.4.10, babel-plugin-polyfill-corejs2@^0.4.4: - version "0.4.13" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz#7d445f0e0607ebc8fb6b01d7e8fb02069b91dd8b" - integrity sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g== + version "0.4.17" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz#198f970f1c99a856b466d1187e88ce30bd199d91" + integrity sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w== dependencies: - "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.6.4" + "@babel/compat-data" "^7.28.6" + "@babel/helper-define-polyfill-provider" "^0.6.8" semver "^6.3.1" babel-plugin-polyfill-corejs3@^0.11.0: @@ -3795,11 +3994,11 @@ babel-plugin-polyfill-regenerator@^0.5.1: "@babel/helper-define-polyfill-provider" "^0.5.0" babel-plugin-polyfill-regenerator@^0.6.1: - version "0.6.4" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz#428c615d3c177292a22b4f93ed99e358d7906a9b" - integrity sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw== + version "0.6.8" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz#8a6bfd5dd54239362b3d06ce47ac52b2d95d7721" + integrity sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.4" + "@babel/helper-define-polyfill-provider" "^0.6.8" babel-polyfill@^6.3.14: version "6.26.0" @@ -3857,10 +4056,10 @@ balanced-match@^2.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== -bare-events@^2.2.0: - version "2.5.4" - resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.4.tgz#16143d435e1ed9eafd1ab85f12b89b3357a41745" - integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA== +bare-events@^2.7.0: + version "2.9.1" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.9.1.tgz#5c86616966343bcb03a1b3155feab253eadbf349" + integrity sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg== base64-js@^1.2.0, base64-js@^1.3.1: version "1.5.1" @@ -3885,6 +4084,11 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +baseline-browser-mapping@^2.11.12: + version "2.11.12" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.12.tgz#42ac48770bf73d292f60ce8ba4dc5e7ebb242ec3" + integrity sha512-r7WnVImvVCeFpf2DOXfy41aPWzeNg3H/A2X4dKmy1QL0MSyyk/e7z8ihJ3N6Nn2PsdhkVlqnEfnUE4a05P2aTA== + batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" @@ -3957,28 +4161,28 @@ bluebird@^3.7.2: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -body-parser@1.20.3, body-parser@^1.19.0: - version "1.20.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" - integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== +body-parser@^1.19.0, body-parser@~1.20.5: + version "1.20.6" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.6.tgz#60c789c78e0992d906da0a29d71ae01d15c1ed76" + integrity sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g== dependencies: - bytes "3.1.2" + 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.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.13.0" - raw-body "2.5.2" + destroy "~1.2.0" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + on-finished "~2.4.1" + qs "~6.15.1" + raw-body "~2.5.3" type-is "~1.6.18" - unpipe "1.0.0" + unpipe "~1.0.0" bonjour-service@^1.0.11: - version "1.3.0" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.3.0.tgz#80d867430b5a0da64e82a8047fc1e355bdb71722" - integrity sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA== + version "1.4.4" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.4.4.tgz#8ff5b85fa0641e0996bf40bcf61fc0c6727b66d3" + integrity sha512-jCZcVv7eoc4QesRscwEZtSROBen+6LpKAmBIsQYQrsAeVHLyMXWX/t6eIV5KiRZYNUBl8eVqImEEMQ8L5+c/Kw== dependencies: fast-deep-equal "^3.1.3" multicast-dns "^7.2.5" @@ -4016,17 +4220,17 @@ boxen@^5.0.0: wrap-ansi "^7.0.0" brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + version "1.1.18" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.18.tgz#3ce74d89885136be1535341f8c3d4425c29a5cab" + integrity sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== +brace-expansion@^2.0.1, brace-expansion@^2.0.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.1.4.tgz#589dab11c0018d0366be64cd8bf12c8dbecc8326" + integrity sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg== dependencies: balanced-match "^1.0.0" @@ -4132,15 +4336,16 @@ browserslist@^2.11.3: caniuse-lite "^1.0.30000792" electron-to-chromium "^1.3.30" -browserslist@^4.21.10, browserslist@^4.21.5, browserslist@^4.24.0, browserslist@^4.24.4: - version "4.24.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" - integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== +browserslist@^4.21.10, browserslist@^4.21.5, browserslist@^4.24.0, browserslist@^4.28.6, browserslist@^4.28.7: + version "4.28.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.8.tgz#a3c79ceb70028527e5da7dafc887f3200b5168c0" + integrity sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA== dependencies: - caniuse-lite "^1.0.30001688" - electron-to-chromium "^1.5.73" - node-releases "^2.0.19" - update-browserslist-db "^1.1.1" + baseline-browser-mapping "^2.11.12" + caniuse-lite "^1.0.30001809" + electron-to-chromium "^1.5.402" + node-releases "^2.0.53" + update-browserslist-db "^1.3.0" bs-recipes@1.3.4: version "1.3.4" @@ -4173,7 +4378,7 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" -bytes@3.1.2: +bytes@3.1.2, bytes@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== @@ -4248,15 +4453,18 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" -cacheable@^1.8.9: - version "1.8.9" - resolved "https://registry.yarnpkg.com/cacheable/-/cacheable-1.8.9.tgz#f5498999567ae1015761d805bd8bbecd8393fbd4" - integrity sha512-FicwAUyWnrtnd4QqYAoRlNs44/a1jTL7XDKqm5gJ90wz1DQPlC7U2Rd1Tydpv+E7WAr4sQHuw8Q8M3nZMAyecQ== +cacheable@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/cacheable/-/cacheable-2.5.0.tgz#d142d41043e5a865f6053cc70ef4e3ad068bd5ce" + integrity sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g== dependencies: - hookified "^1.7.1" - keyv "^5.3.1" + "@cacheable/memory" "^2.2.0" + "@cacheable/utils" "^2.5.0" + hookified "^1.15.0" + keyv "^5.6.0" + qified "^0.10.1" -call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: +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== @@ -4265,16 +4473,16 @@ call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply- function-bind "^1.1.2" 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== + version "1.0.9" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.9.tgz#39a644700c80bc7d0ca9102fc6d1d43b2fd7eee7" + integrity sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ== dependencies: - call-bind-apply-helpers "^1.0.0" - es-define-property "^1.0.0" - get-intrinsic "^1.2.4" + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + get-intrinsic "^1.3.0" set-function-length "^1.2.2" -call-bound@^1.0.2, call-bound@^1.0.3: +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== @@ -4341,10 +4549,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001688, caniuse-lite@^1.0.30001702: - version "1.0.30001707" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz#c5e104d199e6f4355a898fcd995a066c7eb9bf41" - integrity sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw== +caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001806, caniuse-lite@^1.0.30001809: + version "1.0.30001809" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz#e6cf71f14ddfe008f114dd2a846923be3c03a07b" + integrity sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ== capture-stack-trace@^1.0.0: version "1.0.2" @@ -4356,7 +4564,7 @@ ccount@^1.0.0: resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== -chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: +chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, 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== @@ -4393,9 +4601,9 @@ chalk@^3.0.0: supports-color "^7.1.0" chalk@^5.3.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" - integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== + version "5.6.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz#b1238b6e23ea337af71c7f8a295db5af0c158aea" + integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== character-entities-html4@^1.0.0: version "1.1.4" @@ -4795,15 +5003,15 @@ compressible@~2.0.18: mime-db ">= 1.43.0 < 2" compression@^1.7.4: - version "1.8.0" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.0.tgz#09420efc96e11a0f44f3a558de59e321364180f7" - integrity sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA== + version "1.8.1" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.1.tgz#4a45d909ac16509195a9a28bd91094889c180d79" + integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== dependencies: bytes "3.1.2" compressible "~2.0.18" debug "2.6.9" negotiator "~0.6.4" - on-headers "~1.0.2" + on-headers "~1.1.0" safe-buffer "5.2.1" vary "~1.1.2" @@ -4889,7 +5097,7 @@ console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== -content-disposition@0.5.4: +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== @@ -4911,17 +5119,12 @@ convert-source-map@^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.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" - integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== +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.2: +cookie@~0.7.1, cookie@~0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== @@ -4967,11 +5170,11 @@ copy-webpack-plugin@11.0.0: serialize-javascript "^6.0.0" core-js-compat@^3.31.0, core-js-compat@^3.33.1, core-js-compat@^3.40.0: - version "3.41.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.41.0.tgz#4cdfce95f39a8f27759b667cf693d96e5dda3d17" - integrity sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A== + version "3.50.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.50.0.tgz#d5922c2a692ab1cba6078c920e7c5567421ae08e" + integrity sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q== dependencies: - browserslist "^4.24.4" + browserslist "^4.28.7" core-js@^2.4.0, core-js@^2.5.0: version "2.6.12" @@ -4984,9 +5187,9 @@ core-util-is@~1.0.0: integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cors@~2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + 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" @@ -5012,9 +5215,9 @@ cosmiconfig@^8.2.0: path-type "^4.0.0" cosmiconfig@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" - integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + version "9.0.2" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.2.tgz#9e5615163becf6a82211fb33d2f68947c25d0c5e" + integrity sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg== dependencies: env-paths "^2.2.1" import-fresh "^3.3.0" @@ -5081,9 +5284,9 @@ crypto-random-string@^2.0.0: integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== css-functions-list@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.3.tgz#95652b0c24f0f59b291a9fc386041a19d4f40dbe" - integrity sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA== + version "3.3.3" + resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.3.3.tgz#c4ab5008659de2e3baf3752c8fdef7662f3ffe23" + integrity sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg== css-loader@6.8.1: version "6.8.1" @@ -5111,9 +5314,9 @@ css-select@^4.1.3: nth-check "^2.0.1" css-select@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" - integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + 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" @@ -5130,17 +5333,17 @@ css-tree@^1.1.2, css-tree@^1.1.3: source-map "^0.6.1" css-tree@^3.0.1, css-tree@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-3.1.0.tgz#7aabc035f4e66b5c86f54570d55e05b1346eb0fd" - integrity sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w== + version "3.2.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-3.2.1.tgz#86cac7011561272b30e6b1e042ba6ce047aa7518" + integrity sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA== dependencies: - mdn-data "2.12.2" - source-map-js "^1.0.1" + mdn-data "2.27.1" + source-map-js "^1.2.1" css-what@^6.0.1, css-what@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + version "6.2.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.2.2.tgz#cdcc8f9b6977719fdfbd1de7aec24abf756b9dea" + integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA== cssesc@^3.0.0: version "3.0.0" @@ -5217,10 +5420,10 @@ debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.3.7: - 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== +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.4.0, debug@^4.4.3, debug@~4.4.1: + 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" @@ -5238,13 +5441,6 @@ debug@^3.0.0, debug@^3.0.1: dependencies: ms "^2.1.1" -debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - decamelize-keys@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" @@ -5259,9 +5455,9 @@ decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2: integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decimal.js@^10.2.1: - version "10.5.0" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.5.0.tgz#0f371c7cf6c4898ce0afb09836db73cd82010f22" - integrity sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw== + version "10.6.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.6.0.tgz#e649a43e3ab953a72192ff5983865e509f37ed9a" + integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== decode-uri-component@^0.2.0: version "0.2.2" @@ -5392,7 +5588,7 @@ delegates@^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, 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== @@ -5402,7 +5598,7 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== -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== @@ -5417,10 +5613,10 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== -detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== +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-node@^2.0.4: version "2.1.0" @@ -5657,27 +5853,27 @@ easy-transform-stream@^1.0.1: integrity sha512-ktkaa6XR7COAR3oj02CF3IOgz2m1hCaY3SfzvKT4Svt2MhHw9XCt+ncJNWfe2TGz31iqzNGZ8spdKQflj+Rlog== eazy-logger@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-4.0.1.tgz#2e9fe487fb14ed6ac20d5f01d90dff377d403041" - integrity sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw== + version "4.1.0" + resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-4.1.0.tgz#d4dae8688b0d730ba1ae6065410b7a51df9990b4" + integrity sha512-+mn7lRm+Zf1UT/YaH8WXtpU6PIV2iOjzP6jgKoiaq/VNrjYKp+OHZGe2znaLgDeFkw8cL9ffuaUm+nNnzcYyGw== dependencies: chalk "4.1.2" editions@^6.21.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/editions/-/editions-6.21.0.tgz#8da2d85611106e0891a72619b7bee8e0c830089b" - integrity sha512-ofkXJtn7z0urokN62DI3SBo/5xAtF0rR7tn+S/bSYV79Ka8pTajIIl+fFQ1q88DQEImymmo97M4azY3WX/nUdg== + version "6.22.0" + resolved "https://registry.yarnpkg.com/editions/-/editions-6.22.0.tgz#3913c4eea9aa4586e17bcd25d64d5edf1790657a" + integrity sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ== dependencies: - version-range "^4.13.0" + version-range "^4.15.0" editorconfig@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-1.0.4.tgz#040c9a8e9a6c5288388b87c2db07028aa89f53a3" - integrity sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q== + version "1.0.7" + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-1.0.7.tgz#8d6e178aeb507c206d65e1804c1d7510d110d434" + integrity sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw== dependencies: "@one-ini/wasm" "0.1.1" commander "^10.0.0" - minimatch "9.0.1" + minimatch "^9.0.1" semver "^7.5.3" ee-first@1.1.1: @@ -5692,15 +5888,15 @@ ejs@^3.1.10: dependencies: jake "^10.8.5" -electron-to-chromium@^1.3.30, electron-to-chromium@^1.5.73: - version "1.5.129" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.129.tgz#fafa835aea5d15fcd5cbe9bd6bf1cb5d4b3aa06e" - integrity sha512-JlXUemX4s0+9f8mLqib/bHH8gOHf5elKS6KeWG3sk3xozb/JTq/RLXIv8OKUWiK4Ah00Wm88EFj5PYkFr4RUPA== +electron-to-chromium@^1.3.30, electron-to-chromium@^1.5.402: + version "1.5.402" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.402.tgz#1bd96a2b0352c3d3a49d9a6c0f95269b64f70937" + integrity sha512-/oOpMaPT6Yg+6/1XQhyIPlzgj7Ye9zf+nNM2Uh6OcE2G2oNptWazFa+qB2Pdqqbsc9KnIDzgAntoYN0dbwOXwA== emoji-regex@^10.2.1: - version "10.4.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" - integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== + version "10.6.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.6.0.tgz#bf3d6e8f7f8fd22a65d9703475bc0147357a6b0d" + integrity sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== emoji-regex@^7.0.1: version "7.0.3" @@ -5740,21 +5936,21 @@ encoding@^0.1.13: iconv-lite "^0.6.2" end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + 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" engine.io-client@~6.6.1: - version "6.6.3" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.6.3.tgz#815393fa24f30b8e6afa8f77ccca2f28146be6de" - integrity sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w== + version "6.6.6" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.6.6.tgz#8a8f1e451b1f6d4acf413305445e42133d1cbe9a" + integrity sha512-iY6QdftLQ9pyiPoX082bpf/u1UewnOaJrtJIF9T0++QB34lZrj0uP+Q/bj8AlUsAxqhnkTV2BS8SBZSxOmoV5Q== dependencies: "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" + debug "~4.4.1" engine.io-parser "~5.2.1" - ws "~8.17.1" + ws "~8.21.0" xmlhttprequest-ssl "~2.1.1" engine.io-parser@~5.2.1: @@ -5763,27 +5959,28 @@ engine.io-parser@~5.2.1: integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== engine.io@~6.6.0: - version "6.6.4" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.6.4.tgz#0a89a3e6b6c1d4b0c2a2a637495e7c149ec8d8ee" - integrity sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g== + version "6.6.9" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.6.9.tgz#fd17e9f4e3a256423592574b60ac262e91af4b82" + integrity sha512-clKkw4C7nJ22mGgoVcCg6V/W/TxdNyIOTr89k2ONZu81qqkddPFDF0LXcbAwhzPD8DjkiRCjzuiO6Y+fkpD4vg== dependencies: "@types/cors" "^2.8.12" "@types/node" ">=10.0.0" + "@types/ws" "^8.5.12" accepts "~1.3.4" base64id "2.0.0" cookie "~0.7.2" cors "~2.8.5" - debug "~4.3.1" + debug "~4.4.1" engine.io-parser "~5.2.1" - ws "~8.17.1" + ws "~8.21.0" enhanced-resolve@^5.17.1: - version "5.18.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz#728ab082f8b7b6836de51f1637aab5d3b9568faf" - integrity sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg== + version "5.24.5" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz#b4dad3255b7545f07ba5535189868e9f85f47573" + integrity sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A== dependencies: graceful-fs "^4.2.4" - tapable "^2.2.0" + tapable "^2.3.3" ent@~2.2.0: version "2.2.2" @@ -5805,11 +6002,16 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -entities@^4.2.0, entities@^4.3.0, entities@^4.4.0, entities@^4.5.0: +entities@^4.2.0, entities@^4.3.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== + env-paths@^2.2.0, env-paths@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" @@ -5828,9 +6030,9 @@ errno@^0.1.1: prr "~1.0.1" error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + 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" @@ -5845,14 +6047,14 @@ es-errors@^1.3.0: integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-module-lexer@^1.2.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz#da49f587fd9e68ee2404fe4e256c0c7d3a81be21" - integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== + version "1.7.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" + integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== 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== + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz#a2d0b373205724dfa525d23b0c3e1b1ca582c99b" + integrity sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw== dependencies: es-errors "^1.3.0" @@ -6042,10 +6244,10 @@ eslint-scope@5.1.1, eslint-scope@^5.0.0: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.3.0.tgz#10cd3a918ffdd722f5f3f7b5b83db9b23c87340d" - integrity sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ== +eslint-scope@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" + integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -6067,10 +6269,10 @@ eslint-visitor-keys@^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.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" - integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== +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@^2.7.0: version "2.13.1" @@ -6155,31 +6357,30 @@ eslint@^6.0.0: v8-compile-cache "^2.0.3" eslint@^9.0.0: - version "9.23.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.23.0.tgz#b88f3ab6dc83bcb927fdb54407c69ffe5f2441a6" - integrity sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw== + version "9.39.5" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.5.tgz#2a4e3c8b0f753196efae943c8ffaa8730fc6a3fa" + integrity sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw== dependencies: - "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/eslint-utils" "^4.8.0" "@eslint-community/regexpp" "^4.12.1" - "@eslint/config-array" "^0.19.2" - "@eslint/config-helpers" "^0.2.0" - "@eslint/core" "^0.12.0" - "@eslint/eslintrc" "^3.3.1" - "@eslint/js" "9.23.0" - "@eslint/plugin-kit" "^0.2.7" + "@eslint/config-array" "^0.21.2" + "@eslint/config-helpers" "^0.4.2" + "@eslint/core" "^0.17.0" + "@eslint/eslintrc" "^3.3.6" + "@eslint/js" "9.39.5" + "@eslint/plugin-kit" "^0.4.1" "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" "@humanwhocodes/retry" "^0.4.2" "@types/estree" "^1.0.6" - "@types/json-schema" "^7.0.15" - ajv "^6.12.4" + ajv "^6.14.0" chalk "^4.0.0" cross-spawn "^7.0.6" debug "^4.3.2" escape-string-regexp "^4.0.0" - eslint-scope "^8.3.0" - eslint-visitor-keys "^4.2.0" - espree "^10.3.0" + eslint-scope "^8.4.0" + eslint-visitor-keys "^4.2.1" + espree "^10.4.0" esquery "^1.5.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -6191,7 +6392,7 @@ eslint@^9.0.0: is-glob "^4.0.0" json-stable-stringify-without-jsonify "^1.0.1" lodash.merge "^4.6.2" - minimatch "^3.1.2" + minimatch "^3.1.5" natural-compare "^1.4.0" optionator "^0.9.3" @@ -6205,14 +6406,14 @@ esniff@^2.0.1: event-emitter "^0.3.5" type "^2.7.2" -espree@^10.0.1, espree@^10.3.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" - integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== +espree@^10.0.1, espree@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" + integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== dependencies: - acorn "^8.14.0" + acorn "^8.15.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.2.0" + eslint-visitor-keys "^4.2.1" espree@^3.1.6: version "3.5.4" @@ -6237,9 +6438,9 @@ esprima@^4.0.0, esprima@^4.0.1: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1, esquery@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + 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" @@ -6260,6 +6461,11 @@ estraverse@^5.1.0, estraverse@^5.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -6301,6 +6507,13 @@ eventemitter3@^4.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +events-universal@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/events-universal/-/events-universal-1.0.1.tgz#b56a84fd611b6610e0a2d0f09f80fdf931e2dfe6" + integrity sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw== + dependencies: + bare-events "^2.7.0" + events@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" @@ -6396,43 +6609,43 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: homedir-polyfill "^1.0.1" exponential-backoff@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.2.tgz#a8f26adb96bf78e8cd8ad1037928d5e5c0679d91" - integrity sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA== + version "3.1.3" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.3.tgz#51cf92c1c0493c766053f9d3abee4434c244d2f6" + integrity sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA== express@^4.17.1, express@^4.17.3: - version "4.21.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" - integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== + version "4.22.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.22.2.tgz#c17ae0981e5efc24b22272f0e041c4662503b700" + integrity sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.3" - content-disposition "0.5.4" + body-parser "~1.20.5" + content-disposition "~0.5.4" content-type "~1.0.4" - cookie "0.7.1" - cookie-signature "1.0.6" + 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" + 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" + on-finished "~2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.12" + path-to-regexp "~0.1.12" proxy-addr "~2.0.7" - qs "6.13.0" + qs "~6.15.1" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.19.0" - serve-static "1.16.2" + send "~0.19.0" + serve-static "~1.16.2" setprototypeof "1.2.0" - statuses "2.0.1" + statuses "~2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" @@ -6571,9 +6784,9 @@ fast-levenshtein@^3.0.0: fastest-levenshtein "^1.0.7" fast-uri@^3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" - integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== + version "3.1.5" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.5.tgz#610f37419a030270430cecd68d74e3d4d96725d0" + integrity sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw== fastest-levenshtein@^1.0.16, fastest-levenshtein@^1.0.7: version "1.0.16" @@ -6581,9 +6794,9 @@ fastest-levenshtein@^1.0.16, fastest-levenshtein@^1.0.7: integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fastq@^1.13.0, fastq@^1.6.0: - version "1.19.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" - integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== + 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" @@ -6617,12 +6830,12 @@ file-entry-cache@^1.1.1: flat-cache "^1.2.1" object-assign "^4.0.1" -file-entry-cache@^10.0.7: - version "10.0.7" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-10.0.7.tgz#e0ac34d4b8c44bea8a0a27ceb4dae982f2d32749" - integrity sha512-txsf5fu3anp2ff3+gOJJzRImtrtm/oa9tYLN0iTuINZ++EyVR/nRrg2fKYwvG/pXDofcrvvb0scEbX3NyW/COw== +file-entry-cache@^11.1.1: + version "11.1.5" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-11.1.5.tgz#c8210eb055de63e68685ccfb6a017e386d4577d0" + integrity sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q== dependencies: - flat-cache "^6.1.7" + flat-cache "^6.1.23" file-entry-cache@^2.0.0: version "2.0.0" @@ -6652,9 +6865,9 @@ file-uri-to-path@1.0.0: integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== 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== + version "1.0.6" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.6.tgz#1e8870942a7c636c862f7c49b9394937b6a995a3" + integrity sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA== dependencies: minimatch "^5.0.1" @@ -6717,17 +6930,17 @@ finalhandler@1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -finalhandler@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" - integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== +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" + on-finished "~2.4.1" parseurl "~1.3.3" - statuses "2.0.1" + statuses "~2.0.2" unpipe "~1.0.0" find-cache-dir@^4.0.0: @@ -6871,24 +7084,24 @@ flat-cache@^4.0.0: flatted "^3.2.9" keyv "^4.5.4" -flat-cache@^6.1.7: - version "6.1.7" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-6.1.7.tgz#c04b08316739ad7ef997e1b9ea363443fc2fcb38" - integrity sha512-qwZ4xf1v1m7Rc9XiORly31YaChvKt6oNVHuqqZcoED/7O+ToyNVGobKsIAopY9ODcWpEDKEBAbrSOCBHtNQvew== +flat-cache@^6.1.23: + version "6.1.23" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-6.1.23.tgz#735dc888c271868d7301b3bbb8edba5028afb61d" + integrity sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA== dependencies: - cacheable "^1.8.9" - flatted "^3.3.3" - hookified "^1.7.1" + cacheable "^2.5.0" + flatted "^3.4.2" + hookified "^1.15.0" flatted@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== -flatted@^3.2.7, flatted@^3.2.9, flatted@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" - integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== +flatted@^3.2.7, flatted@^3.2.9, flatted@^3.4.2: + version "3.4.4" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.4.4.tgz#aeeca2a506303f0cee61c59e6c9f2a88d2f29fc6" + integrity sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q== flush-write-stream@^1.0.2: version "1.1.1" @@ -6899,9 +7112,9 @@ flush-write-stream@^1.0.2: readable-stream "^2.3.6" follow-redirects@^1.0.0, follow-redirects@^1.14.0: - version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" - integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + version "1.16.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz#28474a159d3b9d11ef62050a14ed60e4df6d61bc" + integrity sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" @@ -6931,13 +7144,14 @@ foreground-child@^3.1.0: signal-exit "^4.0.1" form-data@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.3.tgz#349c8f2c9d8f8f0c879ee0eb7cc0d300018d6b09" - integrity sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w== + version "3.0.5" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.5.tgz#2ea3ec24f0dcb7e0262a11efb732031240ea8e9f" + integrity sha512-j23EibVLnp4zNXGW7LjryXYa2X6U/M96yoOX+ybZxwkYajdxRNEqYY3zhh7y0i6kfISKS2jr+EJq1YTUDEv5+w== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" es-set-tostringtag "^2.1.0" + hasown "^2.0.4" mime-types "^2.1.35" forwarded@0.2.0: @@ -6945,11 +7159,16 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fraction.js@^4.2.0, fraction.js@^4.3.7: +fraction.js@^4.2.0: version "4.3.7" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== +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== + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -6957,7 +7176,7 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -fresh@0.5.2, fresh@^0.5.2: +fresh@0.5.2, fresh@^0.5.2, fresh@~0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== @@ -7033,9 +7252,9 @@ fs-mkdirp-stream@^2.0.1: streamx "^2.12.0" fs-monkey@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.6.tgz#8ead082953e88d992cf3ff844faa907b26756da2" - integrity sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.1.0.tgz#632aa15a20e71828ed56b24303363fb1414e5997" + integrity sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw== fs.realpath@^1.0.0: version "1.0.0" @@ -7246,10 +7465,10 @@ glob-stream@^6.1.0: to-absolute-glob "^2.0.0" unique-stream "^2.0.2" -glob-stream@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-8.0.2.tgz#09e5818e41c16dd85274d72c7a7158d307426313" - integrity sha512-R8z6eTB55t3QeZMmU1C+Gv+t5UnNRkA55c5yo67fAVfxODxieTwsjNG7utxS/73NdP1NbDgCrhVEg2h00y4fFw== +glob-stream@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-8.0.3.tgz#87e63153aadf05bd0207cde1a253ee39d91458b9" + integrity sha512-fqZVj22LtFJkHODT+M4N1RJQ3TjnnQhfE9GwZI8qXscYarnhpip70poMldRnP8ipQ/w0B621kOhfc53/J9bd/A== dependencies: "@gulpjs/to-absolute-glob" "^4.0.0" anymatch "^3.1.3" @@ -7287,9 +7506,9 @@ glob-watcher@^6.0.0: chokidar "^3.5.3" glob@^10.2.2, glob@^10.4.2: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + 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" @@ -7383,11 +7602,6 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - globals@^12.1.0: version "12.4.0" resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" @@ -7582,13 +7796,13 @@ gulp-autoprefixer@^9.0.0: vinyl-sourcemaps-apply "^0.2.1" gulp-babel@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/gulp-babel/-/gulp-babel-8.0.0.tgz#e0da96f4f2ec4a88dd3a3030f476e38ab2126d87" - integrity sha512-oomaIqDXxFkg7lbpBou/gnUkX51/Y/M2ZfSjL2hdqXTAlSWZcgZtd2o0cOH0r/eE8LWD0+Q/PsLsr2DKOoqToQ== + version "8.1.0" + resolved "https://registry.yarnpkg.com/gulp-babel/-/gulp-babel-8.1.0.tgz#d0c1cb4b53d6002eec350b866b54e9807a4c7ea3" + integrity sha512-QtFF9+h3xrVjfo79h7HCY4S8k4qNEcOz7ffpfavlscv0F0glfTQyv4kEYvX+YykTm4qllMF4aZfjeqLjzddTYA== dependencies: plugin-error "^1.0.1" replace-ext "^1.0.0" - through2 "^2.0.0" + through2 "^3.0.0" vinyl-sourcemaps-apply "^0.2.0" gulp-better-rollup@^4.0.1: @@ -7625,17 +7839,17 @@ gulp-cli@^2.2.0: v8flags "^3.2.0" yargs "^7.1.0" -gulp-cli@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-3.0.0.tgz#577008f5323fad6106b44db24803c27c3a649841" - integrity sha512-RtMIitkT8DEMZZygHK2vEuLPqLPAFB4sntSxg4NoDta7ciwGZ18l7JuhCTiS5deOJi2IoK0btE+hs6R4sfj7AA== +gulp-cli@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-3.1.0.tgz#92590e9b209142b176c95ad5c7066d2592017268" + integrity sha512-zZzwlmEsTfXcxRKiCHsdyjZZnFvXWM4v1NqBJSYbuApkvVKivjcmOS2qruAJ+PkEHLFavcDKH40DPc1+t12a9Q== dependencies: "@gulpjs/messages" "^1.1.0" chalk "^4.1.2" copy-props "^4.0.0" gulplog "^2.2.0" interpret "^3.1.1" - liftoff "^5.0.0" + liftoff "^5.0.1" mute-stdout "^2.0.0" replace-homedir "^2.0.0" semver-greatest-satisfied-range "^2.0.0" @@ -7670,9 +7884,9 @@ gulp-plugin-extras@^0.2.2: easy-transform-stream "^1.0.1" gulp-rename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-2.0.0.tgz#9bbc3962b0c0f52fc67cd5eaff6c223ec5b9cf6c" - integrity sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-2.1.0.tgz#3a9900f81f3a8338409ea5ea542affc25080d9f4" + integrity sha512-dGuzuH8jQGqCMqC544IEPhs5+O2l+IkdoSZsgd4kY97M1CxQeI3qrmweQBIrxLBbjbe/8uEWK8HHcNBc3OCy4g== gulp-sass-lint@1.4.0: version "1.4.0" @@ -7750,15 +7964,15 @@ gulp@^4.0.2: undertaker "^1.2.1" vinyl-fs "^3.0.0" -gulp@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/gulp/-/gulp-5.0.0.tgz#78f4b8ac48a0bf61b354d39e5be844de2c5cc3f3" - integrity sha512-S8Z8066SSileaYw1S2N1I64IUc/myI2bqe2ihOBzO6+nKpvNSg7ZcWJt/AwF8LC/NVN+/QZ560Cb/5OPsyhkhg== +gulp@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-5.0.1.tgz#c43f37aa34569e101fb6da4e0b464677305acd36" + integrity sha512-PErok3DZSA5WGMd6XXV3IRNO0mlB+wW3OzhFJLEec1jSERg2j1bxJ6e5Fh6N6fn3FH2T9AP4UYNb/pYlADB9sA== dependencies: glob-watcher "^6.0.0" - gulp-cli "^3.0.0" + gulp-cli "^3.1.0" undertaker "^2.0.0" - vinyl-fs "^4.0.0" + vinyl-fs "^4.0.2" gulplog@^1.0.0: version "1.0.0" @@ -7780,9 +7994,9 @@ handle-thing@^2.0.0: integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== handlebars@^4.7.7: - version "4.7.8" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" - integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + version "4.7.9" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.9.tgz#6f139082ab58dc4e5a0e51efe7db5ae890d56a0f" + integrity sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ== dependencies: minimist "^1.2.5" neo-async "^2.6.2" @@ -7880,10 +8094,17 @@ has-yarn@^2.1.0: resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== -hasown@^2.0.0, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== +hashery@^1.4.0, hashery@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/hashery/-/hashery-1.5.1.tgz#4ba82ad54911ac617467870845d57a9fe508a400" + integrity sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ== + dependencies: + hookified "^1.15.0" + +hasown@^2.0.0, hasown@^2.0.2, hasown@^2.0.3, hasown@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.4.tgz#8c62d8cb90beb2aad5d0a5b67581ad9854c3f003" + integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A== dependencies: function-bind "^1.1.2" @@ -7918,10 +8139,15 @@ homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" -hookified@^1.7.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/hookified/-/hookified-1.8.1.tgz#74a8c97d36e5f8004d230ee2156a607cc84c358c" - integrity sha512-GrO2l93P8xCWBSTBX9l2BxI78VU/MAAYag+pG8curS3aBGy0++ZlxrQ7PdUOUVMbn5BwkGb6+eRrnf43ipnFEA== +hookified@^1.15.0, hookified@^1.15.1: + version "1.15.1" + resolved "https://registry.yarnpkg.com/hookified/-/hookified-1.15.1.tgz#b1fafeaa5489cdc29cb85546a8f837ed4ffbbcb6" + integrity sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg== + +hookified@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/hookified/-/hookified-2.2.0.tgz#1d024ac1668973dd5bcc4a96ab9ccdb7639ef8d4" + integrity sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA== hosted-git-info@^2.1.4: version "2.8.9" @@ -8002,26 +8228,15 @@ htmlparser2@^8.0.2: entities "^4.4.0" http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + version "4.2.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#205f4db64f8562b76a4ff9235aa5279839a09dd5" + integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - http-errors@~1.6.2: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" @@ -8032,10 +8247,32 @@ http-errors@~1.6.2: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" +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-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-parser-js@>=0.5.1: - version "0.5.9" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.9.tgz#b817b3ca0edea6236225000d795378707c169cec" - integrity sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw== + version "0.5.10" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.10.tgz#b3277bd6d7ed5588e20ea73bf724fcbe44609075" + integrity sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA== http-proxy-agent@^4.0.1: version "4.0.1" @@ -8056,9 +8293,9 @@ http-proxy-agent@^5.0.0: debug "4" http-proxy-middleware@^2.0.3: - version "2.0.7" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz#915f236d92ae98ef48278a95dedf17e991936ec6" - integrity sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA== + version "2.0.10" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.10.tgz#b2df7b705203d7a8c269ac8450cf96b00c532f94" + integrity sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" @@ -8100,7 +8337,7 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.24, 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== @@ -8146,10 +8383,10 @@ ignore@^5.2.0, ignore@^5.2.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== -ignore@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.3.tgz#397ef9315dfe0595671eefe8b633fec6943ab733" - integrity sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA== +ignore@^7.0.3, ignore@^7.0.5: + version "7.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.6.tgz#6a57aaef4c90df27ac3590875d29e8f11988c88e" + integrity sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw== image-size@~0.5.0: version "0.5.5" @@ -8157,19 +8394,19 @@ image-size@~0.5.0: integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== immutable@^3: - version "3.8.2" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" - integrity sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg== + version "3.8.3" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.3.tgz#0a8d2494a94d4b2d4f0e99986e74dd25d1e9a859" + integrity sha512-AUY/VyX0E5XlibOmWt10uabJzam1zlYjwiEgQSDc5+UIkFNaF9WM0JxXKaNMGf+F/ffUF+7kRKXM9A7C0xXqMg== immutable@^4.0.0: - version "4.3.7" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" - integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== + version "4.3.9" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.9.tgz#c98349e05e9c6e2a4d8fe88ac0b363e0d536b544" + integrity sha512-ObHy4YN7ycwZOUCLI1/6svfyAFu7vL8RhAvVu/bh/RZW9EPlOyDaQ9jDQWCtdqzaXUjgXZCW1migtHE7YI7UGQ== immutable@^5.0.2: - version "5.1.1" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.1.1.tgz#d4cb552686f34b076b3dcf23c4384c04424d8354" - integrity sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg== + version "5.1.9" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.1.9.tgz#ac23c3a01992ab665e14ac9ffff298f28cd74a0c" + integrity sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg== import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.1" @@ -8219,10 +8456,10 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -index-to-position@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/index-to-position/-/index-to-position-1.0.0.tgz#baca236eb6e8c2b750b9225313c31751f84ef357" - integrity sha512-sCO7uaLVhRJ25vz1o8s9IFM3nVS4DkuQnyjMwiQPKvQuBYBDmb8H7zx8ki7nVh4HJQOdVWebyvLE0qt+clruxA== +index-to-position@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/index-to-position/-/index-to-position-1.2.0.tgz#c800eb34dacf4dbf96b9b06c7eb78d5f704138b4" + integrity sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw== indexes-of@^1.0.1: version "1.0.1" @@ -8242,7 +8479,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, 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== @@ -8359,13 +8596,10 @@ invert-kv@^1.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== -ip-address@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" - integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== - dependencies: - jsbn "1.1.0" - sprintf-js "^1.1.3" +ip-address@^10.1.1: + version "10.4.0" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.4.0.tgz#c5910bc541b6eae287765d1e4846be0308a05d93" + integrity sha512-oSK96Grm3aP6OrS263xVxbNDGVL7rzBtYdpGqlDG8iQdoenDoTs/nkki+DflYbAEE8Xl6o5YxhxlrKvI3nqKXQ== ipaddr.js@1.9.1: version "1.9.1" @@ -8373,9 +8607,9 @@ ipaddr.js@1.9.1: integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== ipaddr.js@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" - integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== + version "2.5.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.5.0.tgz#7d4b6c39f9392fb61cf807de6e425e22c10e061f" + integrity sha512-aq+t5NAc+cS6rZQQVWC2x98CPqGtKKTMDd4Gaodv0wShnItdKg/51djkGJ1hqH+Oy0ivDftCbSLCQob8zso01w== is-absolute@^1.0.0: version "1.0.0" @@ -8385,12 +8619,12 @@ is-absolute@^1.0.0: is-relative "^1.0.0" is-windows "^1.0.1" -is-accessor-descriptor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4" - integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA== +is-accessor-descriptor@^1.0.1, is-accessor-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.2.tgz#fff67ca43f7acc57edbc557335c2e2c62b98e41e" + integrity sha512-AIbwAcazqP3R65dGvqk1V+a+vE5Fg1yu/ZKMOiBWSUIXXiwQkYmXQcVa2O0nh0tSDKDFKxG2mY7dB1Sr4hEP1g== dependencies: - hasown "^2.0.0" + hasown "^2.0.3" is-alphabetical@^1.0.0: version "1.0.4" @@ -8448,12 +8682,12 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.11.0, is-core-module@^2.16.0, is-core-module@^2.8.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== +is-core-module@^2.11.0, is-core-module@^2.16.1, is-core-module@^2.8.1: + version "2.16.2" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.2.tgz#3e07450a8080ebce3fbf0cac494f4d2ab324e082" + integrity sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA== dependencies: - hasown "^2.0.2" + hasown "^2.0.3" is-data-descriptor@^1.0.1: version "1.0.1" @@ -8468,19 +8702,19 @@ is-decimal@^1.0.0: integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== is-descriptor@^0.1.0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33" - integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg== + version "0.1.8" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.8.tgz#c1ea9d2fb20cd51e812e438a455a7f78443a5a17" + integrity sha512-SceYGWXvdqlWa/OnQ5FQuV+NxvNmMRhMw/w9AHkH71hTzveND4BTYgvp16g+oITK47qbOl/3D0bl0iygehWAWQ== dependencies: is-accessor-descriptor "^1.0.1" is-data-descriptor "^1.0.1" is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306" - integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw== + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.4.tgz#7934d74f609d0dbe754b80186d501026a78739b5" + integrity sha512-bv5z95W0dDtLfKwDfkTNxaRxmISBD3eQBKJeVxv2AQ7MjuUnDNG7cIQqvFtMOUYhsILWHhMayWdoGqNqYYYjww== dependencies: - is-accessor-descriptor "^1.0.1" + is-accessor-descriptor "^1.0.2" is-data-descriptor "^1.0.1" is-directory@^0.3.1: @@ -8935,9 +9169,9 @@ istanbul-lib-source-maps@^4.0.1: source-map "^0.6.1" istanbul-reports@^3.0.5: - version "3.1.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" - integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + 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" @@ -8960,14 +9194,13 @@ jackspeak@^3.1.2: "@pkgjs/parseargs" "^0.11.0" jake@^10.8.5: - version "10.9.2" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" - integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== + 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.3" - chalk "^4.0.2" + async "^3.2.6" filelist "^1.0.4" - minimatch "^3.1.2" + picocolors "^1.1.1" jasmine-core@^4.1.0, jasmine-core@~4.6.0: version "4.6.1" @@ -9005,35 +9238,30 @@ js-beautify@^1.13.13: nopt "^7.2.1" js-cookie@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc" - integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw== + version "3.0.8" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.8.tgz#444e6f4b27a5d844594fef61c9d6bca5f0787688" + integrity sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw== -js-tokens@^4.0.0: +"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-yaml@^3.13.1, js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4, js-yaml@^3.9.0: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + version "3.15.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.15.1.tgz#24bc95028f361cdaaa84745b06a109c4486773c0" + integrity sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag== dependencies: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== +js-yaml@^4.1.0, js-yaml@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.3.1.tgz#01216c001d67f48e2cd560d708c7af21090a3848" + integrity sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ== dependencies: argparse "^2.0.1" -jsbn@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" - integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== - jsdom@^16.4.0: version "16.7.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" @@ -9072,16 +9300,11 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -jsesc@^3.0.2: +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== -jsesc@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" - integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== - json-buffer@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" @@ -9128,12 +9351,12 @@ json-stable-stringify-without-jsonify@^1.0.1: integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.2.1.tgz#addb683c2b78014d0b78d704c2fcbdf0695a60e2" - integrity sha512-Lp6HbbBgosLmJbjx0pBLbgvx68FaFU1sdkmBuckmhhJ88kL13OA51CDtR2yJB50eCNMH9wRqtQNNiAqQH4YXnA== + version "1.3.0" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz#8903cfac42ea1a0f97f35d63a4ce0518f0cc6a70" + integrity sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg== dependencies: call-bind "^1.0.8" - call-bound "^1.0.3" + call-bound "^1.0.4" isarray "^2.0.5" jsonify "^0.0.1" object-keys "^1.1.1" @@ -9163,9 +9386,9 @@ jsonfile@^4.0.0: graceful-fs "^4.1.6" jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + version "6.2.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.1.tgz#b6e31717f22cc37330b081ce0051ed5de53af2f6" + integrity sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q== dependencies: universalify "^2.0.0" optionalDependencies: @@ -9295,12 +9518,12 @@ keyv@^4.5.4: dependencies: json-buffer "3.0.1" -keyv@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-5.3.2.tgz#32edd461b51d44d42926eb72946236d79c71ae78" - integrity sha512-Lji2XRxqqa5Wg+CHLVfFKBImfJZ4pCSccu9eVWK6w4c2SDFLd8JAn1zqTuSFnsxb7ope6rMsnIHfp+eBbRBRZQ== +keyv@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-5.6.0.tgz#03044074c6b4d072d0a62c7b9fa649537baf0105" + integrity sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw== dependencies: - "@keyv/serialize" "^1.0.3" + "@keyv/serialize" "^1.1.1" kind-of@^1.1.0: version "1.1.0" @@ -9341,10 +9564,10 @@ known-css-properties@^0.3.0: resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.3.0.tgz#a3d135bbfc60ee8c6eacf2f7e7e6f2d4755e49a4" integrity sha512-QMQcnKAiQccfQTqtBh/qwquGZ2XK/DXND1jrcN9M8gMMy99Gwla7GQjndVUsEqIaRyP6bsFRuhwRj5poafBGJQ== -known-css-properties@^0.35.0: - version "0.35.0" - resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.35.0.tgz#f6f8e40ab4e5700fa32f5b2ef5218a56bc853bd6" - integrity sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A== +known-css-properties@^0.37.0: + version "0.37.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.37.0.tgz#10ebe49b9dbb6638860ff8a002fb65a053f4aec5" + integrity sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ== known-css-properties@^0.5.0: version "0.5.0" @@ -9352,9 +9575,9 @@ known-css-properties@^0.5.0: integrity sha512-LOS0CoS8zcZnB1EjLw4LLqDXw8nvt3AGH5dXLQP3D9O1nLLA+9GC5GnPl5mmF+JiQAtSX4VyZC7KvEtcA4kUtA== ky@^1.2.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/ky/-/ky-1.8.0.tgz#0f4c83be590555a2b435d11459b460324b0038fc" - integrity sha512-DoKGmG27nT8t/1F9gV8vNzggJ3mLAyD49J8tTMWHeZvS8qLc7GlyTieicYtFzvDznMe/q2u38peOjkWc5/pjvw== + version "1.14.3" + resolved "https://registry.yarnpkg.com/ky/-/ky-1.14.3.tgz#d7fcc6ac93d1588accee72cc44dcc6cf84c0bdaa" + integrity sha512-9zy9lkjac+TR1c2tG+mkNSVlyOpInnWdSMiue4F+kq8TwJSgv6o8jhLRg8Ho6SnZ9wOYUq/yozts9qQCfk7bIw== last-run@^1.1.0: version "1.1.1" @@ -9391,12 +9614,12 @@ latest-version@^9.0.0: package-json "^10.0.0" launch-editor@^2.6.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.10.0.tgz#5ca3edfcb9667df1e8721310f3a40f1127d4bc42" - integrity sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA== + version "2.14.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.14.1.tgz#f7e0da3f58aaea03fea01074d840b5f739ed7ddc" + integrity sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA== dependencies: - picocolors "^1.0.0" - shell-quote "^1.8.1" + picocolors "^1.1.1" + shell-quote "^1.8.4" lazystream@^1.0.0: version "1.0.1" @@ -9485,10 +9708,10 @@ liftoff@^3.1.0: rechoir "^0.6.2" resolve "^1.1.7" -liftoff@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-5.0.0.tgz#0e5ed275bc334caec0e551ecf08bb22be583e236" - integrity sha512-a5BQjbCHnB+cy+gsro8lXJ4kZluzOijzJ1UVVfyJYZC+IP2pLv1h4+aysQeKuTmyO8NAqfyQAk4HWaP/HjcKTg== +liftoff@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-5.0.1.tgz#e2329e7f1e19e98c8dba71185f2078e6dbbc5c1f" + integrity sha512-wwLXMbuxSF8gMvubFcFRp56lkFV69twvbU5vDPbaw+Q+/rF8j0HKjGbIdlSi+LuJm9jf7k9PB+nTxnsLMPcv2Q== dependencies: extend "^3.0.2" findup-sync "^5.0.0" @@ -9530,9 +9753,9 @@ load-json-file@^4.0.0: strip-bom "^3.0.0" loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + version "4.3.2" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.2.tgz#9913d3a15971f8f635915e601fb5c9d495d918e9" + integrity sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w== loader-utils@3.2.1: version "3.2.1" @@ -9588,9 +9811,9 @@ locate-path@^7.1.0: p-locate "^6.0.0" lodash-es@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" - integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + version "4.18.1" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.18.1.tgz#b962eeb80d9d983a900bf342961fb7418ca10b1d" + integrity sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A== lodash._basecopy@^3.0.0: version "3.0.1" @@ -9724,9 +9947,9 @@ lodash.template@^3.0.0: lodash.templatesettings "^3.0.0" lodash.template@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + version "4.18.1" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.18.1.tgz#9968d00568070d03e358505b5a28b0cbd8fbfd5f" + integrity sha512-5urZrLnV/VD6zHK5KsVtZgt7H19v51mIzoS0aBNH8yp3I8tbswrEjOABOPY8m8uB7NuibubLrMX+Y0PXsU9X+w== dependencies: lodash._reinterpolate "^3.0.0" lodash.templatesettings "^4.0.0" @@ -9757,9 +9980,9 @@ lodash@^3.3.1: integrity sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ== lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + version "4.18.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" + integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== log-symbols@^2.0.0: version "2.2.0" @@ -9810,6 +10033,13 @@ longest-streak@^2.0.1: resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== +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" + loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" @@ -10037,15 +10267,15 @@ mdn-data@2.0.14: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== -mdn-data@2.12.2: - version "2.12.2" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.12.2.tgz#9ae6c41a9e65adf61318b32bff7b64fbfb13f8cf" - integrity sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA== +mdn-data@2.27.1: + version "2.27.1" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.27.1.tgz#e37b9c50880b75366c4d40ac63d9bbcacdb61f0e" + integrity sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ== -mdn-data@^2.15.0: - version "2.18.0" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.18.0.tgz#518adc4811817a8b8c88e0e67d985b8f42e968d5" - integrity sha512-gtCy1yim/vpHF/tq3B4Z43x3zKWpYeb4IM3d/Mf4oMYcNuoXOYEaqtoFlLHw9zd7+WNN3jNh6/WXyUrD3OIiwQ== +mdn-data@^2.25.0: + version "2.31.0" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.31.0.tgz#535740b00a5e3729f34d127c974733c4caf59895" + integrity sha512-+q2nMMt5Rd+PFSC6Nypqn0nU/po6kUPNIHEKYo3xxdl7ASK+Uam3zHOkSBVyw+Wjvb+dkWXfNJqIM0RWJio/MQ== media-typer@0.3.0: version "0.3.0" @@ -10182,7 +10412,7 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8: +micromatch@^4.0.2, 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== @@ -10200,7 +10430,7 @@ mime-db@1.52.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.27, mime-types@^2.1.31, mime-types@^2.1.35, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@^2.1.35, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34, mime-types@~2.1.35: 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== @@ -10249,33 +10479,26 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.1.tgz#8a555f541cf976c622daf078bb28f29fb927c253" - integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.2, minimatch@^3.0.4, 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== +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== 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== + version "5.1.9" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.9.tgz#1293ef15db0098b394540e8f9f744f9fda8dee4b" + integrity sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw== dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.0, minimatch@^9.0.3, minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== +minimatch@^9.0.0, minimatch@^9.0.1, minimatch@^9.0.3, minimatch@^9.0.4: + version "9.0.9" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.9.tgz#9b0cb9fcb78087f6fd7eababe2511c4d3d60574e" + integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg== dependencies: - brace-expansion "^2.0.1" + brace-expansion "^2.0.2" minimatch@~3.0.2: version "3.0.8" @@ -10332,9 +10555,9 @@ minipass-fetch@^3.0.0: encoding "^0.1.13" minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + version "1.0.7" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.7.tgz#145c383d5ae294b36030aa80d4e872d08bebcb73" + integrity sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA== dependencies: minipass "^3.0.0" @@ -10373,9 +10596,9 @@ minipass@^5.0.0: integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3, minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + version "7.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b" + integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" @@ -10480,14 +10703,14 @@ mute-stream@0.0.8: integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nan@^2.12.1: - version "2.22.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.2.tgz#6b504fd029fb8f38c0990e52ad5c26772fdacfbb" - integrity sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ== + version "2.28.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.28.0.tgz#126717fd359d5a03d3edf7c44e6ce9b707fb57f5" + integrity sha512-fTsDz99OTq2sVePhGdp4qQhggZFtKr64ZNVyVajRKtMOkJxYekplBh577PiJB12v/D3s2E5cGtOI45LWp6rnLQ== -nanoid@^3.3.6, 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== +nanoid@^3.3.17, nanoid@^3.3.6: + version "3.3.18" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.18.tgz#f66a2de1199ffde0fcf21c8a5f13106b1c081913" + integrity sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w== nanomatch@^1.2.9: version "1.2.13" @@ -10512,9 +10735,9 @@ natural-compare@^1.4.0: integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== needle@^3.1.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-3.3.1.tgz#63f75aec580c2e77e209f3f324e2cdf3d29bd049" - integrity sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q== + version "3.5.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-3.5.0.tgz#aa2023642cb41b11a11babb733fd8fa952919112" + integrity sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w== dependencies: iconv-lite "^0.6.3" sax "^1.2.4" @@ -10563,9 +10786,9 @@ node-addon-api@^7.0.0: integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== node-forge@^1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + version "1.4.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.4.0.tgz#1c7b7d8bdc2d078739f58287d589d903a11b2fc2" + integrity sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ== node-gyp-build@^4.2.2: version "4.8.4" @@ -10594,10 +10817,10 @@ node-localstorage@^0.6.0: resolved "https://registry.yarnpkg.com/node-localstorage/-/node-localstorage-0.6.0.tgz#45a0601c6932dfde6644a23361f1be173c75d3af" integrity sha512-t9dKMce8qUs2KK02ZiBgzZSykUxc+5UcML7/20a62ruHwfh7+bNQvrH/auxY5gFNexTwAFdr+DbptxlLq4+7qQ== -node-releases@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" - integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== +node-releases@^2.0.53: + version "2.0.53" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.53.tgz#0fe5ad8a7935e075172f574e56f0c20f07fa41af" + integrity sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ== nopt@^6.0.0: version "6.0.0" @@ -10810,16 +11033,16 @@ nunjucks@^3.2.3: commander "^5.1.0" nwsapi@^2.2.0: - version "2.2.20" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.20.tgz#22e53253c61e7b0e7e93cef42c891154bcca11ef" - integrity sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA== + version "2.2.24" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.24.tgz#f8927043d4c9b516abdebe804a32c8d1f9484d1f" + integrity sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A== object-assign@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" integrity sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ== -object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0: +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, 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== @@ -10833,7 +11056,7 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.13.3: +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== @@ -10913,13 +11136,6 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -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" - on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -10927,10 +11143,17 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== +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" + +on-headers@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" + integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: version "1.4.0" @@ -11273,13 +11496,13 @@ parse-json@^5.2.0: lines-and-columns "^1.1.6" parse-json@^8.0.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-8.2.0.tgz#794a590dcf54588ec2282ce6065f15121fa348a0" - integrity sha512-eONBZy4hm2AgxjNFd8a4nyDJnzUAH0g34xSQAwWEVGCjdZ4ZL7dKZBfq267GWP/JaS9zW62Xs2FeAdDvpHHJGQ== + version "8.3.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-8.3.0.tgz#88a195a2157025139a2317a4f2f9252b61304ed5" + integrity sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ== dependencies: "@babel/code-frame" "^7.26.2" - index-to-position "^1.0.0" - type-fest "^4.37.0" + index-to-position "^1.1.0" + type-fest "^4.39.1" parse-node-version@^1.0.0, parse-node-version@^1.0.1: version "1.0.1" @@ -11313,11 +11536,11 @@ parse5@6.0.1: integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== parse5@^7.0.0: - version "7.2.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.2.1.tgz#8928f55915e6125f430cc44309765bf17556a33a" - integrity sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ== + version "7.3.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.3.0.tgz#d7e224fa72399c7a175099f45fc2ad024b05ec05" + integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw== dependencies: - entities "^4.5.0" + entities "^6.0.0" parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" @@ -11406,16 +11629,16 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -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-to-regexp@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4" integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ== +path-to-regexp@~0.1.12: + version "0.1.13" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.13.tgz#9b22ec16bc3ab88d05a0c7e369869421401ab17d" + integrity sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA== + path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -11454,11 +11677,21 @@ picocolors@^1.0.0, picocolors@^1.1.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@2.3.1, picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: +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@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" + integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== + +picomatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.5.tgz#51ea57a17d86f605f81039595fbc40ed06a55fab" + integrity sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -11659,10 +11892,10 @@ postcss-selector-parser@^3.1.0: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-selector-parser@^7.0.0, postcss-selector-parser@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262" - integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== +postcss-selector-parser@^7.0.0, postcss-selector-parser@^7.1.0, postcss-selector-parser@^7.1.1: + version "7.1.5" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz#ee7b090724eb60739b530660e5b402200e694a97" + integrity sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -11710,12 +11943,12 @@ postcss@^6.0.14, postcss@^6.0.17, postcss@^6.0.23, postcss@^6.0.6, postcss@^6.0. source-map "^0.6.1" supports-color "^5.4.0" -postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.27, postcss@^8.4.31, postcss@^8.4.32, postcss@^8.5.3: - version "8.5.3" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" - integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== +postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.27, postcss@^8.4.31, postcss@^8.4.32, postcss@^8.5.6: + version "8.5.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.26.tgz#6e75135780c7e10df3433bf2266c552d35c8c620" + integrity sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ== dependencies: - nanoid "^3.3.8" + nanoid "^3.3.17" picocolors "^1.1.1" source-map-js "^1.2.1" @@ -11819,6 +12052,15 @@ promised-handlebars@^2.0.1: dependencies: deep-aplus "^1.0.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" + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" @@ -11858,9 +12100,9 @@ pump@^2.0.0: once "^1.3.1" pump@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" - integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== + version "3.0.4" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.4.tgz#1f313430527fa8b905622ebd22fe1444e757ab3c" + integrity sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA== dependencies: end-of-stream "^1.1.0" once "^1.3.1" @@ -11891,17 +12133,25 @@ pupa@^2.1.1: dependencies: escape-goat "^2.0.0" +qified@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/qified/-/qified-0.10.1.tgz#0640bf21bbe6ca540db290ad8f5fde4d870b8bda" + integrity sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA== + dependencies: + hookified "^2.1.1" + qjobs@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== -qs@6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== +qs@~6.15.1: + version "6.15.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.3.tgz#76852132a58ed5c7c0ef67e4441b9bb5d6061b3b" + integrity sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A== dependencies: - side-channel "^1.0.6" + es-define-property "^1.0.1" + side-channel "^1.1.1" querystringify@^2.1.1: version "2.2.0" @@ -11934,20 +12184,25 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -range-parser@^1.2.1, range-parser@~1.2.0, range-parser@~1.2.1: +range-parser@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.3.0.tgz#d7f19be812bb62721472b45d3be219ef09572b47" + integrity sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw== + +range-parser@~1.2.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.2, raw-body@^2.3.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== +raw-body@^2.3.2, 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.0" - iconv-lite "0.4.24" - unpipe "1.0.0" + bytes "~3.1.2" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + unpipe "~1.0.0" rc@1.2.8, rc@^1.0.1, rc@^1.1.6, rc@^1.2.8: version "1.2.8" @@ -11959,6 +12214,19 @@ rc@1.2.8, rc@^1.0.1, rc@^1.1.6, rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-dom-fragment@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/react-dom-fragment/-/react-dom-fragment-1.0.0.tgz#2a5c9e6e09cd5d17a535546121ec02191eef316d" + integrity sha512-eA/TWY5/fo7lck+wD5yEWKEMU8CBvt+DCUlPCso3gT1SnoySmrVaV7h1MIG4qINAluepmFsHu5TATnuxEGPc5g== + dependencies: + "@babel/core" "^7.9.0" + rollup-plugin-eslint "^7.0.0" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + read-package-json-fast@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" @@ -12031,7 +12299,7 @@ read-pkg@^9.0.0: type-fest "^4.6.0" unicorn-magic "^0.1.0" -"readable-stream@2 || 3", readable-stream@3, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +"readable-stream@2 || 3", readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -12128,10 +12396,10 @@ reflect-metadata@^0.1.2: resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.14.tgz#24cf721fe60677146bb77eeb0e1f9dece3d65859" integrity sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A== -regenerate-unicode-properties@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" - integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== +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" @@ -12155,18 +12423,6 @@ regenerator-runtime@^0.13.11: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -regenerator-transform@^0.15.2: - version "0.15.2" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" - integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== - dependencies: - "@babel/runtime" "^7.8.4" - regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" @@ -12192,17 +12448,17 @@ regexpp@^2.0.1: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpu-core@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.2.0.tgz#0e5190d79e542bf294955dccabae04d3c7d53826" - integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== +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.0" + regenerate-unicode-properties "^10.2.2" regjsgen "^0.8.0" - regjsparser "^0.12.0" + regjsparser "^0.13.0" unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" + unicode-match-property-value-ecmascript "^2.2.1" registry-auth-token@^3.0.1: version "3.4.0" @@ -12220,11 +12476,11 @@ registry-auth-token@^4.0.0: rc "1.2.8" registry-auth-token@^5.0.2: - version "5.1.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.1.0.tgz#3c659047ecd4caebd25bc1570a3aa979ae490eca" - integrity sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw== + version "5.1.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.1.1.tgz#f1ff69c8e492e7edee07110b4752dd0a8aa82853" + integrity sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q== dependencies: - "@pnpm/npm-conf" "^2.1.0" + "@pnpm/npm-conf" "^3.0.2" registry-url@^3.0.3: version "3.1.0" @@ -12252,12 +12508,12 @@ regjsgen@^0.8.0: resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== -regjsparser@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc" - integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== +regjsparser@^0.13.0: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.13.2.tgz#f654734b5c588b22ba3e21693b30523417180808" + integrity sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ== dependencies: - jsesc "~3.0.2" + jsesc "~3.1.0" remark-parse@^4.0.0: version "4.0.0" @@ -12489,12 +12745,13 @@ resolve@1.22.2: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.4.0: - version "1.22.10" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" - integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.11, resolve@^1.4.0: + version "1.22.12" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.12.tgz#f5b2a680897c69c238a13cd16b15671f8b73549f" + integrity sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA== dependencies: - is-core-module "^2.16.0" + es-errors "^1.3.0" + is-core-module "^2.16.1" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -12568,45 +12825,66 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +rollup-plugin-eslint@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-eslint/-/rollup-plugin-eslint-7.0.0.tgz#a6dbcbc14699a7a02155697c0c3dfa26cca59a9b" + integrity sha512-u35kXiY11ULeNQGTlRkYx7uGJ/hS/Dx3wj8f9YVC3oMLTGU9fOqQJsAKYtBFZU3gJ8Vt3gu8ppB1vnKl+7gatQ== + dependencies: + eslint "^6.0.0" + rollup-pluginutils "^2.7.1" + rollup-plugin-includepaths@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/rollup-plugin-includepaths/-/rollup-plugin-includepaths-0.2.4.tgz#eb21d2d05ad410856a7c2f0612a85983fd11cc62" integrity sha512-iZen+XKVExeCzk7jeSZPJKL7B67slZNr8GXSC5ROBXtDGXDBH8wdjMfdNW5hf9kPt+tHyIvWh3wlE9bPrZL24g== +rollup-pluginutils@^2.7.1: + version "2.8.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" + rollup@^3.27.1: - version "3.29.5" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.5.tgz#8a2e477a758b520fb78daf04bca4c522c1da8a54" - integrity sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w== + version "3.30.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.30.0.tgz#3fa506fee2c5ba9d540a38da87067376cd55966d" + integrity sha512-kQvGasUgN+AlWGliFn2POSajRQEsULVYFGTvOZmK06d7vCD+YhZztt70kGk3qaeAXeWYL5eO7zx+rAubBc55eA== optionalDependencies: fsevents "~2.3.2" rollup@^4.0.0: - version "4.38.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.38.0.tgz#e1ef4939aef0e1295f750ae4f73d1c8b7fc3abb8" - integrity sha512-5SsIRtJy9bf1ErAOiFMFzl64Ex9X5V7bnJ+WlFMb+zmP459OSWCEG7b0ERZ+PEU7xPt4OG3RHbrp1LJlXxYTrw== + version "4.62.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.62.4.tgz#96d2e62070f0b0ac63424edd0c93a7fb864ef069" + integrity sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg== dependencies: - "@types/estree" "1.0.7" + "@types/estree" "1.0.9" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.38.0" - "@rollup/rollup-android-arm64" "4.38.0" - "@rollup/rollup-darwin-arm64" "4.38.0" - "@rollup/rollup-darwin-x64" "4.38.0" - "@rollup/rollup-freebsd-arm64" "4.38.0" - "@rollup/rollup-freebsd-x64" "4.38.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.38.0" - "@rollup/rollup-linux-arm-musleabihf" "4.38.0" - "@rollup/rollup-linux-arm64-gnu" "4.38.0" - "@rollup/rollup-linux-arm64-musl" "4.38.0" - "@rollup/rollup-linux-loongarch64-gnu" "4.38.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.38.0" - "@rollup/rollup-linux-riscv64-gnu" "4.38.0" - "@rollup/rollup-linux-riscv64-musl" "4.38.0" - "@rollup/rollup-linux-s390x-gnu" "4.38.0" - "@rollup/rollup-linux-x64-gnu" "4.38.0" - "@rollup/rollup-linux-x64-musl" "4.38.0" - "@rollup/rollup-win32-arm64-msvc" "4.38.0" - "@rollup/rollup-win32-ia32-msvc" "4.38.0" - "@rollup/rollup-win32-x64-msvc" "4.38.0" + "@napi-rs/lzma-linux-x64-gnu" "1.5.1" + "@rollup/rollup-android-arm-eabi" "4.62.4" + "@rollup/rollup-android-arm64" "4.62.4" + "@rollup/rollup-darwin-arm64" "4.62.4" + "@rollup/rollup-darwin-x64" "4.62.4" + "@rollup/rollup-freebsd-arm64" "4.62.4" + "@rollup/rollup-freebsd-x64" "4.62.4" + "@rollup/rollup-linux-arm-gnueabihf" "4.62.4" + "@rollup/rollup-linux-arm-musleabihf" "4.62.4" + "@rollup/rollup-linux-arm64-gnu" "4.62.4" + "@rollup/rollup-linux-arm64-musl" "4.62.4" + "@rollup/rollup-linux-loong64-gnu" "4.62.4" + "@rollup/rollup-linux-loong64-musl" "4.62.4" + "@rollup/rollup-linux-ppc64-gnu" "4.62.4" + "@rollup/rollup-linux-ppc64-musl" "4.62.4" + "@rollup/rollup-linux-riscv64-gnu" "4.62.4" + "@rollup/rollup-linux-riscv64-musl" "4.62.4" + "@rollup/rollup-linux-s390x-gnu" "4.62.4" + "@rollup/rollup-linux-x64-gnu" "4.62.4" + "@rollup/rollup-linux-x64-musl" "4.62.4" + "@rollup/rollup-openbsd-x64" "4.62.4" + "@rollup/rollup-openharmony-arm64" "4.62.4" + "@rollup/rollup-win32-arm64-msvc" "4.62.4" + "@rollup/rollup-win32-ia32-msvc" "4.62.4" + "@rollup/rollup-win32-x64-gnu" "4.62.4" + "@rollup/rollup-win32-x64-msvc" "4.62.4" fsevents "~2.3.2" run-async@^0.1.0: @@ -12737,10 +13015,10 @@ sass@1.85.0: optionalDependencies: "@parcel/watcher" "^2.4.1" -sax@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" - integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== +sax@^1.2.4, sax@^1.5.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.1.tgz#4c23cf608c0b693ab54b4b5888e92cfe977b9843" + integrity sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q== saxes@^5.0.1: version "5.0.1" @@ -12759,9 +13037,9 @@ schema-utils@^3.2.0: ajv-keywords "^3.5.2" schema-utils@^4.0.0, schema-utils@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.0.tgz#3b669f04f71ff2dfb5aba7ce2d5a9d79b35622c0" - integrity sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g== + 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" @@ -12842,9 +13120,9 @@ semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.0.0, semver@^7.1.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: - version "7.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" - integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + version "7.8.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.5.tgz#39b646037dd50c14fb451e7e4cac58ed8b863f69" + integrity sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA== send@0.16.2: version "0.16.2" @@ -12865,33 +13143,33 @@ send@0.16.2: range-parser "~1.2.0" statuses "~1.4.0" -send@0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" - integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== +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 "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" + fresh "~0.5.2" + http-errors "~2.0.1" mime "1.6.0" ms "2.1.3" - on-finished "2.4.1" + on-finished "~2.4.1" range-parser "~1.2.1" - statuses "2.0.1" + statuses "~2.0.2" -serialize-javascript@^6.0.0, serialize-javascript@^6.0.2: +serialize-javascript@^6.0.0: 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-index@1.9.1, serve-index@^1.9.1: +serve-index@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== @@ -12904,6 +13182,19 @@ serve-index@1.9.1, serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" +serve-index@^1.9.1: + version "1.9.2" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.2.tgz#2988e3612106d78a5e4849ddff552ce7bd3d9bcb" + integrity sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ== + dependencies: + accepts "~1.3.8" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.8.0" + mime-types "~2.1.35" + parseurl "~1.3.3" + serve-static@1.13.2: version "1.13.2" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" @@ -12914,15 +13205,15 @@ serve-static@1.13.2: parseurl "~1.3.2" send "0.16.2" -serve-static@1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" - integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== +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.0" + send "~0.19.1" server-destroy@1.0.1: version "1.0.1" @@ -12961,7 +13252,7 @@ setprototypeof@1.1.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== -setprototypeof@1.2.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== @@ -12997,23 +13288,23 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" - integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== +shell-quote@^1.8.4: + version "1.10.0" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.10.0.tgz#482033e192e4f5c07151521ffa03400ec71b1b0f" + integrity sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA== shelljs@^0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8" integrity sha512-B1vvzXQlJ77SURr3SIUQ/afh+LwecDKAVKE1wqkBlr2PCHoZDaF6MFD+YX1u9ddQjR4z2CKx1tdqvS2Xfs5h1A== -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== +side-channel-list@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.1.tgz#c2e0b5a14a540aebee3bbc6c3f8666cc9b509127" + integrity sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w== dependencies: es-errors "^1.3.0" - object-inspect "^1.13.3" + object-inspect "^1.13.4" side-channel-map@^1.0.1: version "1.0.1" @@ -13036,14 +13327,14 @@ side-channel-weakmap@^1.0.2: object-inspect "^1.13.3" side-channel-map "^1.0.1" -side-channel@^1.0.6: - version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" - integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== +side-channel@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.1.tgz#ea02c62e05dc4bea67d4442f0fb71ee192f8e0ab" + integrity sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ== dependencies: es-errors "^1.3.0" - object-inspect "^1.13.3" - side-channel-list "^1.0.0" + object-inspect "^1.13.4" + side-channel-list "^1.0.1" side-channel-map "^1.0.1" side-channel-weakmap "^1.0.2" @@ -13069,13 +13360,15 @@ sigstore@^1.3.0: make-fetch-happen "^11.0.1" simple-git@^3.20.0: - version "3.27.0" - resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.27.0.tgz#f4b09e807bda56a4a3968f635c0e4888d3decbd5" - integrity sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA== + version "3.36.0" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.36.0.tgz#019b28c0a35847ee34299c6fb63770ab1b2dffb7" + integrity sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q== dependencies: "@kwsites/file-exists" "^1.1.1" "@kwsites/promise-deferred" "^1.1.1" - debug "^4.3.5" + "@simple-git/args-pathspec" "^1.0.3" + "@simple-git/argv-parser" "^1.1.0" + debug "^4.4.0" slash@^1.0.0: version "1.0.0" @@ -13163,40 +13456,40 @@ snapdragon@^0.8.1: use "^3.1.0" socket.io-adapter@~2.5.2: - version "2.5.5" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz#c7a1f9c703d7756844751b6ff9abfc1780664082" - integrity sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg== + version "2.5.8" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.8.tgz#c9fcabf602dbd5b09258ca98e5ec6a7ae4360698" + integrity sha512-6Oy52pbg+kvdCVvjcN+FnY7BvxZ7cIHNScbvztT/It5d0vbwoJoVZmF2gjJmnV0/4WlXRfG15zc45ySk9Ah8bw== dependencies: - debug "~4.3.4" - ws "~8.17.1" + debug "~4.4.1" + ws "~8.21.0" socket.io-client@^4.4.1: - version "4.8.1" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.8.1.tgz#1941eca135a5490b94281d0323fe2a35f6f291cb" - integrity sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ== + version "4.8.3" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.8.3.tgz#62717edd46a318c918125b57e92dc7f8bb71c34c" + integrity sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g== dependencies: "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.2" + debug "~4.4.1" engine.io-client "~6.6.1" socket.io-parser "~4.2.4" socket.io-parser@~4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" - integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + version "4.2.7" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.7.tgz#679e51fe24d1c81df90fc5f7efe4a5f432fe99c0" + integrity sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg== dependencies: "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" + debug "~4.4.1" socket.io@^4.4.1, socket.io@^4.7.2: - version "4.8.1" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.8.1.tgz#fa0eaff965cc97fdf4245e8d4794618459f7558a" - integrity sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg== + version "4.8.3" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.8.3.tgz#ca6ba1431c69532e1e0a6f496deebeb601dbc4df" + integrity sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A== dependencies: accepts "~1.3.4" base64id "~2.0.0" cors "~2.8.5" - debug "~4.3.2" + debug "~4.4.1" engine.io "~6.6.0" socket.io-adapter "~2.5.2" socket.io-parser "~4.2.4" @@ -13220,11 +13513,11 @@ socks-proxy-agent@^7.0.0: socks "^2.6.2" socks@^2.6.2: - version "2.8.4" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.4.tgz#07109755cdd4da03269bda4725baa061ab56d5cc" - integrity sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ== + version "2.8.9" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.9.tgz#aa5f130ca0f88a43fa44faf4869c50d22aa27752" + integrity sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw== dependencies: - ip-address "^9.0.5" + ip-address "^10.1.1" smart-buffer "^4.2.0" sort-keys@^5.0.0: @@ -13234,7 +13527,7 @@ sort-keys@^5.0.0: dependencies: is-plain-obj "^4.0.0" -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2, source-map-js@^1.2.1: +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2, 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== @@ -13277,7 +13570,7 @@ source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, sourc resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@0.7.4, source-map@^0.7.3: +source-map@0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== @@ -13287,6 +13580,11 @@ source-map@^0.5.1, source-map@^0.5.6: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== +source-map@^0.7.3: + version "0.7.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02" + integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== + sparkles@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" @@ -13319,9 +13617,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.21" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz#6d6e980c9df2b6fc905343a3b2d702a6239536c3" - integrity sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg== + version "3.0.23" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz#b069e687b1291a32f126893ed76a27a745ee2133" + integrity sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw== spdy-transport@^3.0.0: version "3.0.0" @@ -13365,11 +13663,6 @@ split@0.2: dependencies: through "2" -sprintf-js@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" - integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -13412,12 +13705,7 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.4.0 < 2", statuses@~1.5.0: +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== @@ -13432,6 +13720,11 @@ statuses@~1.4.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== +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== + stream-combiner@~0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" @@ -13474,16 +13767,15 @@ streamroller@^3.1.5: fs-extra "^8.1.0" streamx@^2.12.0, streamx@^2.12.5, streamx@^2.13.2, streamx@^2.14.0: - version "2.22.0" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.22.0.tgz#cd7b5e57c95aaef0ff9b2aef7905afa62ec6e4a7" - integrity sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw== + version "2.28.0" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.28.0.tgz#035ab56057b7ed2211b51d532e6973f0f99fbf11" + integrity sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw== dependencies: + events-universal "^1.0.0" fast-fifo "^1.3.2" text-decoder "^1.1.0" - optionalDependencies: - bare-events "^2.2.0" -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"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== @@ -13501,6 +13793,15 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, 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@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -13565,7 +13866,7 @@ stringify-entities@^1.0.1: is-alphanumerical "^1.0.0" is-hexadecimal "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"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== @@ -13593,12 +13894,19 @@ strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +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, strip-ansi@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + version "7.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz#d22a269522836a627af8d04b5c3fd2c7fa3e32e3" + integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== dependencies: - ansi-regex "^6.0.1" + ansi-regex "^6.2.2" strip-bom-string@^1.0.0: version "1.0.0" @@ -13673,52 +13981,53 @@ stylelint-order@^6.0.0: postcss-sorting "^8.0.2" stylelint-scss@^6.11.1: - version "6.11.1" - resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-6.11.1.tgz#03860aab250112825b2deb77ca7ff1e2ba3a5414" - integrity sha512-e4rYo0UY+BIMtGeGanghrvHTjcryxgZbyFxUedp8dLFqC4P70aawNdYjRrQxbnKhu3BNr4+lt5e/53tcKXiwFA== + version "6.14.0" + resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-6.14.0.tgz#b3f69e6e6236807aef021caf995fdf00255d80f0" + integrity sha512-ZKmHMZolxeuYsnB+PCYrTpFce0/QWX9i9gh0hPXzp73WjuIMqUpzdQaBCrKoLWh6XtCFSaNDErkMPqdjy1/8aA== dependencies: css-tree "^3.0.1" is-plain-object "^5.0.0" - known-css-properties "^0.35.0" - mdn-data "^2.15.0" + known-css-properties "^0.37.0" + mdn-data "^2.25.0" postcss-media-query-parser "^0.2.3" postcss-resolve-nested-selector "^0.1.6" - postcss-selector-parser "^7.1.0" + postcss-selector-parser "^7.1.1" postcss-value-parser "^4.2.0" stylelint@^16.0.0: - version "16.17.0" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.17.0.tgz#12f31389283883d8d15bb5c019830af8176998a1" - integrity sha512-I9OwVIWRMqVm2Br5iTbrfSqGRPWQUlvm6oXO1xZuYYu0Gpduy67N8wXOZv15p6E/JdlZiAtQaIoLKZEWk5hrjw== - dependencies: - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - "@csstools/media-query-list-parser" "^4.0.2" + version "16.26.1" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.26.1.tgz#7048accf9c3990dc074dff13c6f3cdc35c780c95" + integrity sha512-v20V59/crfc8sVTAtge0mdafI3AdnzQ2KsWe6v523L4OA1bJO02S7MO2oyXDCS6iWb9ckIPnqAFVItqSBQr7jw== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-syntax-patches-for-csstree" "^1.0.19" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/media-query-list-parser" "^4.0.3" "@csstools/selector-specificity" "^5.0.0" - "@dual-bundle/import-meta-resolve" "^4.1.0" + "@dual-bundle/import-meta-resolve" "^4.2.1" balanced-match "^2.0.0" colord "^2.9.3" cosmiconfig "^9.0.0" css-functions-list "^3.2.3" css-tree "^3.1.0" - debug "^4.3.7" + debug "^4.4.3" fast-glob "^3.3.3" fastest-levenshtein "^1.0.16" - file-entry-cache "^10.0.7" + file-entry-cache "^11.1.1" global-modules "^2.0.0" globby "^11.1.0" globjoin "^0.1.4" html-tags "^3.3.1" - ignore "^7.0.3" + ignore "^7.0.5" imurmurhash "^0.1.4" is-plain-object "^5.0.0" - known-css-properties "^0.35.0" + known-css-properties "^0.37.0" mathml-tag-names "^2.1.3" meow "^13.2.0" micromatch "^4.0.8" normalize-path "^3.0.0" picocolors "^1.1.1" - postcss "^8.5.3" + postcss "^8.5.6" postcss-resolve-nested-selector "^0.1.6" postcss-safe-parser "^7.0.1" postcss-selector-parser "^7.1.0" @@ -13849,16 +14158,16 @@ svg-tags@^1.0.0: integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== svgo@^2.7.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" - integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + version "2.8.3" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.3.tgz#8de2fa579f3f7429dec3fb86471005cf46fb483a" + integrity sha512-5EZD0pafXX6PphdwOGCiVLDSaV1xyuQao2blHajHLsPxr07q4mmEjdtXEWgG07ae2mIz8Ex2CDXNCTiXhy3Khw== dependencies: - "@trysound/sax" "0.2.0" commander "^7.2.0" css-select "^4.1.3" css-tree "^1.1.3" csso "^4.2.0" picocolors "^1.0.0" + sax "^1.5.0" stable "^0.1.8" symbol-observable@4.0.0: @@ -13916,10 +14225,10 @@ table@^6.9.0: string-width "^4.2.3" strip-ansi "^6.0.1" -tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tapable@^2.1.1, tapable@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.3.tgz#5da7c9992c46038221267985ab28421a8879f160" + integrity sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A== tar@^6.1.11, tar@^6.1.2: version "6.2.1" @@ -13973,14 +14282,13 @@ term-size@^1.2.0: execa "^0.7.0" terser-webpack-plugin@^5.3.10: - version "5.3.14" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz#9031d48e57ab27567f02ace85c7d690db66c3e06" - integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== + version "5.6.1" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz#47bc41bd8b8fab8383b62ec763b7394829097e7b" + integrity sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ== 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.19.2: @@ -13994,12 +14302,12 @@ terser@5.19.2: source-map-support "~0.5.20" terser@^5.31.1: - version "5.39.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.39.0.tgz#0e82033ed57b3ddf1f96708d123cca717d86ca3a" - integrity sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw== + version "5.49.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.49.2.tgz#cc08cfb6097e5da650bfd45c769ebd15c514fc23" + integrity sha512-rGbJiKeQ4WDe3EXlDAIaQcwftVfv2Q8o1awFNfvXolJYKkb1AuZY1RTOmqx4LJXZENbWZA7eIsYGHuEzHsi1nQ== dependencies: "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" + acorn "^8.15.0" commander "^2.20.0" source-map-support "~0.5.20" @@ -14013,9 +14321,9 @@ test-exclude@^6.0.0: minimatch "^3.0.4" text-decoder@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.3.tgz#b19da364d981b2326d5f43099c310cc80d770c65" - integrity sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA== + version "1.2.7" + resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.7.tgz#5d073a9a74b9c0a9d28dfadcab96b604af57d8ba" + integrity sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ== dependencies: b4a "^1.6.4" @@ -14041,14 +14349,15 @@ throat@^6.0.1: resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== -through2-filter@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.1.0.tgz#4a1b45d2b76b3ac93ec137951e372c268efc1a4e" - integrity sha512-VhZsTsfrIJjyUi6GeecnwcOJlmoqgIdGFDjqnV5ape+F1DN8GejfPO66XyIhoinxmxGImiUTrq9RwpTN5yszGA== +through2-filter@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" + integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== dependencies: - through2 "^4.0.2" + through2 "~2.0.0" + xtend "~4.0.0" -through2@^2.0.0, through2@^2.0.2, through2@^2.0.3: +through2@^2.0.0, through2@^2.0.2, through2@^2.0.3, through2@~2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -14056,7 +14365,7 @@ through2@^2.0.0, through2@^2.0.2, through2@^2.0.3: readable-stream "~2.3.6" xtend "~4.0.1" -through2@^3.0.1: +through2@^3.0.0, through2@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== @@ -14064,13 +14373,6 @@ through2@^3.0.1: inherits "^2.0.4" readable-stream "2 || 3" -through2@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" - integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== - dependencies: - readable-stream "3" - through@2, through@^2.3.6, through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -14099,9 +14401,9 @@ tmp@^0.0.33: os-tmpdir "~1.0.2" tmp@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" - integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + version "0.2.7" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.7.tgz#26f4db11d1601ce8012dcb8a798ece1c06a99059" + integrity sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw== to-absolute-glob@^2.0.0: version "2.0.2" @@ -14162,7 +14464,7 @@ to-through@^3.0.0: dependencies: streamx "^2.12.5" -toidentifier@1.0.1: +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== @@ -14267,10 +14569,10 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-fest@^4.37.0, type-fest@^4.6.0: - version "4.39.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.39.0.tgz#c7758be50a83a5b879e7a59ea52421e9816b3928" - integrity sha512-w2IGJU1tIgcrepg9ZJ82d8UmItNQtOFJG0HCUE3SzMokKkTsruVDALl2fAdiEzJlfduoU+VyXJWIIUZ+6jV+nw== +type-fest@^4.39.1, type-fest@^4.6.0: + version "4.41.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58" + integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== type-is@~1.6.18: version "1.6.18" @@ -14302,20 +14604,20 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@~5.1.3: +typescript@~5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== ua-parser-js@^0.7.30: - version "0.7.40" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.40.tgz#c87d83b7bb25822ecfa6397a0da5903934ea1562" - integrity sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ== + version "0.7.41" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.41.tgz#9f6dee58c389e8afababa62a4a2dc22edb69a452" + integrity sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg== ua-parser-js@^1.0.33: - version "1.0.40" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.40.tgz#ac6aff4fd8ea3e794a6aa743ec9c2fc29e75b675" - integrity sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew== + 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== uglify-js@^3.1.4: version "3.19.3" @@ -14363,10 +14665,15 @@ undertaker@^2.0.0: last-run "^2.0.0" undertaker-registry "^2.0.0" -undici-types@~6.20.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" - integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici-types@~8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-8.3.0.tgz#44e9fc9f3244648cdea35e4f9bb2d681e9410809" + integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ== unherit@^1.0.4: version "1.1.3" @@ -14389,15 +14696,15 @@ unicode-match-property-ecmascript@^2.0.0: unicode-canonical-property-names-ecmascript "^2.0.0" unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71" - integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== +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.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" - integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + 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.1.0: version "0.1.0" @@ -14465,12 +14772,12 @@ unique-slug@^4.0.0: imurmurhash "^0.1.4" unique-stream@^2.0.2: - version "2.3.1" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" - integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== + version "2.4.0" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.4.0.tgz#5d995309556b5ba324197a3f541d675a0a052ff4" + integrity sha512-V6QarSfeSgDipGA9EZdoIzu03ZDlOFkk+FbEP5cwgrZXN3iIkYR91IjU2EnM6rB835kGQsqHX8qncObTXV+6KA== dependencies: json-stable-stringify-without-jsonify "^1.0.1" - through2-filter "^3.0.0" + through2-filter "3.0.0" unique-string@^1.0.0: version "1.0.0" @@ -14525,9 +14832,9 @@ unist-util-visit@^1.1.0: unist-util-visit-parents "^2.0.0" universal-user-agent@^7.0.0, universal-user-agent@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-7.0.2.tgz#52e7d0e9b3dc4df06cc33cb2b9fd79041a54827e" - integrity sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q== + version "7.0.3" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-7.0.3.tgz#c05870a58125a2dc00431f2df815a77fe69736be" + integrity sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A== universalify@^0.1.0: version "0.1.2" @@ -14544,7 +14851,7 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -unpipe@1.0.0, unpipe@~1.0.0: +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== @@ -14567,10 +14874,10 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" - integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== +update-browserslist-db@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.3.0.tgz#9ff2604d5b949051639c01a223a16619f8a2b2c7" + integrity sha512-x/M6q3w4Ybp91CNaS4S69UnliqR3BzRpOT6LWbksjth0S/+jhfaPJsWjt/TewpT8j9eLIojUf5jr29WextHroA== dependencies: escalade "^3.2.0" picocolors "^1.1.1" @@ -14729,10 +15036,10 @@ vary@^1, vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -version-range@^4.13.0: - version "4.14.0" - resolved "https://registry.yarnpkg.com/version-range/-/version-range-4.14.0.tgz#91c12e4665756a9101d1af43faeda399abe0edec" - integrity sha512-gjb0ARm9qlcBAonU4zPwkl9ecKkas+tC2CGwFfptTCWWIVTWY1YUbT2zZKsOAF1jR/tNxxyLwwG0cb42XlYcTg== +version-range@^4.15.0: + version "4.15.0" + resolved "https://registry.yarnpkg.com/version-range/-/version-range-4.15.0.tgz#89df1e921b14d37515aab5e42ed4ac0515cab2c1" + integrity sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg== vfile-location@^2.0.0: version "2.0.6" @@ -14787,13 +15094,13 @@ vinyl-fs@^3.0.0: vinyl "^2.0.0" vinyl-sourcemap "^1.1.0" -vinyl-fs@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-4.0.0.tgz#06cb36efc911c6e128452f230b96584a9133c3a1" - integrity sha512-7GbgBnYfaquMk3Qu9g22x000vbYkOex32930rBnc3qByw6HfMEAoELjCjoJv4HuEQxHAurT+nvMHm6MnJllFLw== +vinyl-fs@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-4.0.2.tgz#d46557653e4a7109f29d626a9cf478680c7f8c70" + integrity sha512-XRFwBLLTl8lRAOYiBqxY279wY46tVxLaRhSwo3GzKEuLz1giffsOquWWboD/haGf5lx+JyTigCFfe7DWHoARIA== dependencies: fs-mkdirp-stream "^2.0.1" - glob-stream "^8.0.0" + glob-stream "^8.0.3" graceful-fs "^4.2.11" iconv-lite "^0.6.3" is-valid-glob "^1.0.0" @@ -14804,7 +15111,7 @@ vinyl-fs@^4.0.0: streamx "^2.14.0" to-through "^3.0.0" value-or-function "^4.0.0" - vinyl "^3.0.0" + vinyl "^3.0.1" vinyl-sourcemap "^2.0.0" vinyl-source-stream@^2.0.0: @@ -14868,13 +15175,12 @@ vinyl@^2.0.0, vinyl@^2.1.0, vinyl@^2.2.1: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" -vinyl@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-3.0.0.tgz#11e14732bf56e2faa98ffde5157fe6c13259ff30" - integrity sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g== +vinyl@^3.0.0, vinyl@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-3.0.1.tgz#5f5ff85255bda2b5da25e4b3bd80b3fc077fb5a9" + integrity sha512-0QwqXteBNXgnLCdWdvPQBX6FXRHtIH3VhJPTd5Lwn28tJXc34YqSCWUmkOvtJHBmB3gGoPtrOKk3Ts8/kEZ9aA== dependencies: clone "^2.1.2" - clone-stats "^1.0.0" remove-trailing-separator "^1.1.0" replace-ext "^2.0.0" teex "^1.0.1" @@ -14926,11 +15232,10 @@ w3c-xmlserializer@^2.0.0: xml-name-validator "^3.0.0" watchpack@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" - integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== + version "2.5.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.5.2.tgz#e12e82d84674266fc1c6dbfe38891b92ff0522ec" + integrity sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg== dependencies: - glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" wbuf@^1.1.0, wbuf@^1.7.3: @@ -15024,9 +15329,9 @@ webpack-merge@5.9.0: wildcard "^2.0.0" webpack-sources@^3.0.0, webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + version "3.5.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.5.1.tgz#76c2418486dcc02b2aa0694c104176c2858fe84a" + integrity sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw== webpack-subresource-integrity@5.1.0: version "5.1.0" @@ -15065,9 +15370,9 @@ webpack@5.94.0: webpack-sources "^3.2.3" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + version "0.7.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.5.tgz#569d22764ab21f2de20af0e74b411e8ae5a0fa46" + integrity sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA== dependencies: http-parser-js ">=0.5.1" safe-buffer ">=5.1.0" @@ -15161,7 +15466,7 @@ wordwrap@^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", wrap-ansi@^7.0.0: +"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== @@ -15187,6 +15492,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +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@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" @@ -15243,19 +15557,14 @@ write@^0.2.1: mkdirp "^0.5.1" ws@^7.4.6: - version "7.5.10" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" - integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== - -ws@^8.13.0: - version "8.18.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.1.tgz#ea131d3784e1dfdff91adb0a4a116b127515e3cb" - integrity sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w== + version "7.5.13" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.13.tgz#12aa507eaca76c295c278b1aebf4698ab2c1845f" + integrity sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA== -ws@~8.17.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" - integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== +ws@^8.13.0, ws@~8.21.0: + version "8.21.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.21.3.tgz#660b4faddb6a3e575c86e078126919961f4de4fc" + integrity sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw== x-is-string@^0.1.0: version "0.1.0" @@ -15297,7 +15606,7 @@ xmlhttprequest-ssl@~2.1.1: resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz#e9e8023b3f29ef34b97a859f584c5e6c61418e23" integrity sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ== -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -15358,7 +15667,7 @@ yargs@17.1.1: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@17.7.2, yargs@^17.2.1, yargs@^17.3.1: +yargs@17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== @@ -15372,9 +15681,9 @@ yargs@17.7.2, yargs@^17.2.1, yargs@^17.3.1: yargs-parser "^21.1.1" yargs@^16.1.1, yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + version "16.2.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.2.tgz#c56731dca0d2788ae0866dd3c83907d6bab85f7d" + integrity sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w== dependencies: cliui "^7.0.2" escalade "^3.1.1" @@ -15384,6 +15693,19 @@ yargs@^16.1.1, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.2.1, yargs@^17.3.1: + version "17.7.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.3.tgz#779dffe6bcafec596a7172e983289a588647faaa" + integrity sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g== + 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" + yargs@^7.1.0: version "7.1.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.2.tgz#63a0a5d42143879fdbb30370741374e0641d55db" @@ -15431,9 +15753,9 @@ yocto-queue@^0.1.0: integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== yocto-queue@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.2.1.tgz#36d7c4739f775b3cbc28e6136e21aa057adec418" - integrity sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg== + 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== yosay@^3.0.0: version "3.0.0"