From d583887f9ed8601b3796098ea9dbba1295f93a20 Mon Sep 17 00:00:00 2001 From: ghiscoding Date: Mon, 20 Jan 2025 21:23:32 -0500 Subject: [PATCH] feat: add `rowspan` implementation --- package.json | 32 +- src/app/app-routing.module.ts | 4 + src/app/app.component.html | 10 +- src/app/app.module.ts | 4 + src/app/examples/grid-colspan.component.ts | 10 +- src/app/examples/grid43.component.html | 88 +++ src/app/examples/grid43.component.scss | 30 + src/app/examples/grid43.component.ts | 415 ++++++++++ src/app/examples/grid44.component.html | 91 +++ src/app/examples/grid44.component.scss | 50 ++ src/app/examples/grid44.component.ts | 238 ++++++ .../components/angular-slickgrid.component.ts | 1 + test/cypress/e2e/example43.cy.ts | 406 ++++++++++ test/cypress/e2e/example44.cy.ts | 463 +++++++++++ yarn.lock | 745 ++++++++++++------ 15 files changed, 2313 insertions(+), 274 deletions(-) create mode 100644 src/app/examples/grid43.component.html create mode 100644 src/app/examples/grid43.component.scss create mode 100644 src/app/examples/grid43.component.ts create mode 100644 src/app/examples/grid44.component.html create mode 100644 src/app/examples/grid44.component.scss create mode 100644 src/app/examples/grid44.component.ts create mode 100644 test/cypress/e2e/example43.cy.ts create mode 100644 test/cypress/e2e/example44.cy.ts diff --git a/package.json b/package.json index ba4f04513..d2c7487f5 100644 --- a/package.json +++ b/package.json @@ -53,13 +53,13 @@ }, "dependencies": { "@ngx-translate/core": "^15.0.0", - "@slickgrid-universal/common": "~5.11.0", - "@slickgrid-universal/custom-footer-component": "~5.11.0", - "@slickgrid-universal/empty-warning-component": "~5.11.0", - "@slickgrid-universal/event-pub-sub": "~5.10.2", - "@slickgrid-universal/pagination-component": "~5.11.0", - "@slickgrid-universal/row-detail-view-plugin": "~5.11.0", - "@slickgrid-universal/rxjs-observable": "~5.11.0", + "@slickgrid-universal/common": "~5.12.0", + "@slickgrid-universal/custom-footer-component": "~5.12.0", + "@slickgrid-universal/empty-warning-component": "~5.12.0", + "@slickgrid-universal/event-pub-sub": "~5.12.0", + "@slickgrid-universal/pagination-component": "~5.12.0", + "@slickgrid-universal/row-detail-view-plugin": "~5.12.0", + "@slickgrid-universal/rxjs-observable": "~5.12.0", "dequal": "^2.0.3", "rxjs": "^7.8.1" }, @@ -91,13 +91,13 @@ "@ng-select/ng-select": "^13.9.1", "@ngx-translate/http-loader": "^8.0.0", "@popperjs/core": "^2.11.8", - "@release-it/conventional-changelog": "^9.0.4", - "@slickgrid-universal/composite-editor-component": "~5.11.0", - "@slickgrid-universal/custom-tooltip-plugin": "~5.11.0", - "@slickgrid-universal/excel-export": "~5.11.0", - "@slickgrid-universal/graphql": "~5.11.0", - "@slickgrid-universal/odata": "~5.11.0", - "@slickgrid-universal/text-export": "~5.11.0", + "@release-it/conventional-changelog": "^10.0.0", + "@slickgrid-universal/composite-editor-component": "~5.12.0", + "@slickgrid-universal/custom-tooltip-plugin": "~5.12.0", + "@slickgrid-universal/excel-export": "~5.12.0", + "@slickgrid-universal/graphql": "~5.12.0", + "@slickgrid-universal/odata": "~5.12.0", + "@slickgrid-universal/text-export": "~5.12.0", "@types/fnando__sparkline": "^0.3.7", "@types/jest": "^29.5.14", "@types/node": "^22.10.7", @@ -106,7 +106,7 @@ "bootstrap": "^5.3.3", "copyfiles": "^2.4.1", "custom-event-polyfill": "^1.0.7", - "cypress": "^13.17.0", + "cypress": "^14.0.0", "cypress-real-events": "^1.13.0", "dompurify": "^3.2.3", "eslint": "^9.18.0", @@ -119,7 +119,7 @@ "ngx-bootstrap": "^18.1.3", "npm-run-all2": "^7.0.2", "prettier": "^3.4.2", - "release-it": "^17.11.0", + "release-it": "^18.1.1", "rimraf": "^5.0.10", "rxjs": "^7.8.1", "sass": "^1.83.4", diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index a4158e5cf..7f98e1963 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -40,6 +40,8 @@ import { GridTradingComponent } from './examples/grid-trading.component'; import { GridTreeDataHierarchicalComponent } from './examples/grid-tree-data-hierarchical.component'; import { GridTreeDataParentChildComponent } from './examples/grid-tree-data-parent-child.component'; import { Grid18Component } from './examples/grid18.component'; +import { Grid43Component } from './examples/grid43.component'; +import { Grid44Component } from './examples/grid44.component'; import { SwtCommonGridTestComponent } from './examples/swt-common-grid-test.component'; import { NgModule } from '@angular/core'; @@ -85,6 +87,8 @@ const routes: Routes = [ { path: 'resize-by-content', component: GridResizeByContentComponent }, { path: 'rowdetail', component: GridRowDetailComponent }, { path: 'rowmove', component: GridRowMoveComponent }, + { path: 'rowspan-timesheets', component: Grid43Component }, + { path: 'rowspan-large', component: Grid44Component }, { path: 'selection', component: GridRowSelectionComponent }, { path: 'trading', component: GridTradingComponent }, { path: 'tree-data-parent-child', component: GridTreeDataParentChildComponent }, diff --git a/src/app/app.component.html b/src/app/app.component.html index 7ac0520ed..7bb295a95 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -172,7 +172,15 @@ 41- Drag & Drop + + diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 8f75ea11e..301b97b60 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -56,6 +56,8 @@ import { GridTradingComponent } from './examples/grid-trading.component'; import { GridTreeDataHierarchicalComponent } from './examples/grid-tree-data-hierarchical.component'; import { GridTreeDataParentChildComponent } from './examples/grid-tree-data-parent-child.component'; import { Grid18Component } from './examples/grid18.component'; +import { Grid43Component } from './examples/grid43.component'; +import { Grid44Component } from './examples/grid44.component'; import { HomeComponent } from './examples/home.component'; import { CustomPagerComponent } from './examples/grid-custom-pager.component'; import { RowDetailPreloadComponent } from './examples/rowdetail-preload.component'; @@ -145,6 +147,8 @@ export function appInitializerFactory(translate: TranslateService, injector: Inj GridTreeDataParentChildComponent, GridTreeDataHierarchicalComponent, Grid18Component, + Grid43Component, + Grid44Component, RowDetailPreloadComponent, RowDetailViewComponent, SwtCommonGridTestComponent, diff --git a/src/app/examples/grid-colspan.component.ts b/src/app/examples/grid-colspan.component.ts index 66929d585..eeda7f61e 100644 --- a/src/app/examples/grid-colspan.component.ts +++ b/src/app/examples/grid-colspan.component.ts @@ -59,7 +59,11 @@ export class GridColspanComponent implements OnInit { showPreHeaderPanel: true, preHeaderPanelHeight: 28, explicitInitialization: true, - colspanCallback: this.renderDifferentColspan, + dataView: { + globalItemMetadataProvider: { + getRowMetadata: (item: any, row: any) => this.renderDifferentColspan(item, row), + }, + }, gridMenu: { iconButtonContainer: 'preheader', // we can display the grid menu icon in either the preheader or in the column header (default) }, @@ -142,8 +146,8 @@ export class GridColspanComponent implements OnInit { * Your callback will always have the "item" argument which you can use to decide on the colspan * Your return must always be in the form of:: return { columns: {}} */ - renderDifferentColspan(item: any): ItemMetadata { - if (item.id % 2 === 1) { + renderDifferentColspan(item: any, row: number): ItemMetadata { + if (item.id % 2 === 1 || row % 2 === 1) { return { columns: { duration: { diff --git a/src/app/examples/grid43.component.html b/src/app/examples/grid43.component.html new file mode 100644 index 000000000..179d6ce97 --- /dev/null +++ b/src/app/examples/grid43.component.html @@ -0,0 +1,88 @@ +
+

+ Example 43: colspan/rowspan - Employees Timesheets + + + code + + + +

+ +
+

+ NOTES: rowspan is an opt-in feature, because of its small perf hit (it needs to loop through all row + metadatas to map all rowspan), and requires the enableCellRowSpan grid option to be enabled to work properly. + The colspan/rowspan are both using DataView item metadata and are both based on row indexes and + will not keep the row in sync with the data. It is really up to you the user to update the metadata logic of how and + where the cells should span when a side effect kicks in. (i.e: Filtering/Sorting/Paging/Column Reorder... will + not change/update the spanning in the grid by itself and that is why they these features are all disabled in this + example). Also, column/row freezing (pinning) are also not supported, or at least not recommended unless you know exactly + what you're doing (like in this demo here because we know our pinning doesn't intersect)! Any freezing column/row that could + intersect with a colspan/rowspan will cause problems. +

+
+ + + + + + + + + +
diff --git a/src/app/examples/grid43.component.scss b/src/app/examples/grid43.component.scss new file mode 100644 index 000000000..77d968cad --- /dev/null +++ b/src/app/examples/grid43.component.scss @@ -0,0 +1,30 @@ +#grid43 { + --slick-border-color: #d4d4d4; + // --slick-cell-border-left: 1px solid var(--slick-border-color); + --slick-header-menu-display: none; + --slick-header-column-height: 20px; + --slick-grid-border-color: #d4d4d4; + --slick-row-selected-color: #d4ebfd; + --slick-cell-active-box-shadow: inset 0 0 0 1px #3ca4ff; + + --slick-row-mouse-hover-box-shadow: 0; + --slick-cell-odd-background-color: #fff; + --slick-cell-border-right: 1px solid var(--slick-border-color); + --slick-cell-border-bottom: 0; + --slick-cell-border-top: 1px solid var(--slick-border-color); + --slick-header-filter-row-border-bottom: 1px solid var(--slick-border-color); + --slick-cell-border-left: 0; + --slick-cell-box-shadow: none; + --slick-row-mouse-hover-color: #fff; + --slick-cell-display: flex; + + .slick-cell.rowspan { + // background: white; + z-index: 9; + } + .slick-cell { + display: flex; + align-items: center; + /* justify-content: center; */ + } +} diff --git a/src/app/examples/grid43.component.ts b/src/app/examples/grid43.component.ts new file mode 100644 index 000000000..bf74c4580 --- /dev/null +++ b/src/app/examples/grid43.component.ts @@ -0,0 +1,415 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { AngularGridInstance, Column, Editors, GridOption, type ItemMetadata } from './../modules/angular-slickgrid'; +import { ExcelExportService } from '@slickgrid-universal/excel-export'; + +@Component({ + styleUrls: ['grid43.component.scss'], + templateUrl: './grid43.component.html', + encapsulation: ViewEncapsulation.None, +}) +export class Grid43Component implements OnInit { + columnDefinitions: Column[] = []; + angularGrid!: AngularGridInstance; + gridOptions!: GridOption; + dataset: any[] = []; + isEditable = false; + showSubTitle = true; + metadata: ItemMetadata | Record = { + // 10001: Davolio + 0: { + columns: { + 1: { rowspan: 2 }, + 2: { colspan: 2 }, + 6: { colspan: 3 }, + 10: { colspan: 3, rowspan: 10 }, + 13: { colspan: 2 }, + 17: { colspan: 2, rowspan: 2 }, + }, + }, + // 10002: (Buchanan... name not shown since Davolio has rowspan=2) + 1: { + columns: { + 3: { colspan: 3 }, + 6: { colspan: 4 }, + 13: { colspan: 2, rowspan: 5 }, + 15: { colspan: 2 }, + }, + }, + // 10003: Fuller + 2: { + columns: { + 2: { colspan: 3, rowspan: 2 }, + 5: { colspan: 2 }, + 7: { colspan: 3 }, + 15: { colspan: 2 }, + 17: { colspan: 2 }, + }, + }, + // 10004: Leverling + 3: { + columns: { + 6: { colspan: 4 }, + 16: { colspan: 2 }, + }, + }, + // 10005: Peacock + 4: { + columns: { + 2: { colspan: 4 }, + 7: { colspan: 3 }, + 15: { colspan: 2, rowspan: 2 }, + 17: { colspan: 2 }, + }, + }, + // 10006: Janet + 5: { + columns: { + 2: { colspan: 2 }, + 4: { colspan: 3 }, + 7: { colspan: 3 }, + 17: { colspan: 2 }, + }, + }, + // 10007: Suyama + 6: { + columns: { + 2: { colspan: 2 }, + 5: { colspan: 2 }, + 7: { colspan: 3 }, + 14: { colspan: 2 }, + 16: { colspan: 3 }, + }, + }, + // 10008: Robert + 7: { + columns: { + 2: { colspan: 3 }, + 5: { colspan: 3 }, + 13: { colspan: 3, rowspan: 2 }, + 16: { colspan: 2 }, + }, + }, + // 10009: Andrew + 8: { + columns: { + 2: { colspan: 3 }, + 7: { colspan: 3, rowspan: 2 }, + 17: { colspan: 2 }, + }, + }, + // 10010: Michael + 9: { + columns: { + 2: { colspan: 3 }, + 5: { colspan: 2 }, + 13: { colspan: 3 }, + 16: { colspan: 3 }, + }, + }, + }; + + angularGridReady(angularGrid: AngularGridInstance) { + this.angularGrid = angularGrid; + } + + ngOnInit(): void { + // define the grid options & columns and then create the grid itself + this.defineGrid(); + + // mock a dataset + this.dataset = this.loadData(); + } + + defineGrid() { + this.columnDefinitions = [ + { id: 'employeeID', name: 'Employee ID', field: 'employeeID', minWidth: 100 }, + { id: 'employeeName', name: 'Employee Name', field: 'employeeName', editor: { model: Editors.text }, minWidth: 120 }, + { id: '9:00', name: '9:00 AM', field: '9:00', editor: { model: Editors.text }, minWidth: 120 }, + { id: '9:30', name: '9:30 AM', field: '9:30', editor: { model: Editors.text }, minWidth: 120 }, + { id: '10:00', name: '10:00 AM', field: '10:00', editor: { model: Editors.text }, minWidth: 120 }, + { id: '10:30', name: '10:30 AM', field: '10:30', editor: { model: Editors.text }, minWidth: 120 }, + { id: '11:00', name: '11:00 AM', field: '11:00', editor: { model: Editors.text }, minWidth: 120 }, + { id: '11:30', name: '11:30 AM', field: '11:30', editor: { model: Editors.text }, minWidth: 120 }, + { id: '12:00', name: '12:00 PM', field: '12:00', editor: { model: Editors.text }, minWidth: 120 }, + { id: '12:30', name: '12:30 PM', field: '12:30', editor: { model: Editors.text }, minWidth: 120 }, + { id: '1:00', name: '1:00 PM', field: '1:00', editor: { model: Editors.text }, minWidth: 120 }, + { id: '1:30', name: '1:30 PM', field: '1:30', editor: { model: Editors.text }, minWidth: 120 }, + { id: '2:00', name: '2:00 PM', field: '2:00', editor: { model: Editors.text }, minWidth: 120 }, + { id: '2:30', name: '2:30 PM', field: '2:30', editor: { model: Editors.text }, minWidth: 120 }, + { id: '3:00', name: '3:00 PM', field: '3:00', editor: { model: Editors.text }, minWidth: 120 }, + { id: '3:30', name: '3:30 PM', field: '3:30', editor: { model: Editors.text }, minWidth: 120 }, + { id: '4:00', name: '4:00 PM', field: '4:00', editor: { model: Editors.text }, minWidth: 120 }, + { id: '4:30', name: '4:30 PM', field: '4:30', editor: { model: Editors.text }, minWidth: 120 }, + { id: '5:00', name: '5:00 PM', field: '5:00', editor: { model: Editors.text }, minWidth: 120 }, + ]; + + this.gridOptions = { + autoResize: { + bottomPadding: 30, + rightPadding: 50, + }, + enableCellNavigation: true, + enableColumnReorder: true, + enableCellRowSpan: true, + enableExcelExport: true, + externalResources: [new ExcelExportService()], + enableExcelCopyBuffer: true, + autoEdit: true, + editable: false, + datasetIdPropertyName: 'employeeID', + frozenColumn: 0, + gridHeight: 348, + rowHeight: 30, + dataView: { + globalItemMetadataProvider: { + getRowMetadata: (_item, row) => { + return (this.metadata as Record)[row]; + }, + }, + }, + rowTopOffsetRenderType: 'top', // rowspan doesn't render well with 'transform', default is 'top' + }; + } + + navigateDown() { + this.angularGrid?.slickGrid?.navigateDown(); + } + + navigateUp() { + this.angularGrid?.slickGrid?.navigateUp(); + } + + navigateNext() { + this.angularGrid?.slickGrid?.navigateNext(); + } + + navigatePrev() { + this.angularGrid?.slickGrid?.navigatePrev(); + } + + toggleEditing() { + this.isEditable = !this.isEditable; + this.angularGrid.slickGrid.setOptions({ editable: this.isEditable }); + } + + loadData() { + return [ + { + employeeID: 10001, + employeeName: 'Davolio', + '9:00': 'Analysis Tasks', + '9:30': 'Analysis Tasks', + '10:00': 'Team Meeting', + '10:30': 'Testing', + '11:00': 'Development', + '11:30': 'Development', + '12:00': 'Development', + '12:30': 'Support', + '1:00': 'Lunch Break', + '1:30': 'Lunch Break', + '2:00': 'Lunch Break', + '2:30': 'Testing', + '3:00': 'Testing', + '3:30': 'Development', + '4:00': 'Conference', + '4:30': 'Team Meeting', + '5:00': 'Team Meeting', + }, + { + employeeID: 10002, + employeeName: 'Buchanan', + '9:00': 'Task Assign', + '9:30': 'Support', + '10:00': 'Support', + '10:30': 'Support', + '11:00': 'Testing', + '11:30': 'Testing', + '12:00': 'Testing', + '12:30': 'Testing', + '1:00': 'Lunch Break', + '1:30': 'Lunch Break', + '2:00': 'Lunch Break', + '2:30': 'Development', + '3:00': 'Development', + '3:30': 'Check Mail', + '4:00': 'Check Mail', + '4:30': 'Team Meeting', + '5:00': 'Team Meeting', + }, + { + employeeID: 10003, + employeeName: 'Fuller', + '9:00': 'Check Mail', + '9:30': 'Check Mail', + '10:00': 'Check Mail', + '10:30': 'Analysis Tasks', + '11:00': 'Analysis Tasks', + '11:30': 'Support', + '12:00': 'Support', + '12:30': 'Support', + '1:00': 'Lunch Break', + '1:30': 'Lunch Break', + '2:00': 'Lunch Break', + '2:30': 'Development', + '3:00': 'Development', + '3:30': 'Team Meeting', + '4:00': 'Team Meeting', + '4:30': 'Development', + '5:00': 'Development', + }, + { + employeeID: 10004, + employeeName: 'Leverling', + '9:00': 'Testing', + '9:30': 'Check Mail', + '10:00': 'Check Mail', + '10:30': 'Support', + '11:00': 'Testing', + '11:30': 'Testing', + '12:00': 'Testing', + '12:30': 'Testing', + '1:00': 'Lunch Break', + '1:30': 'Lunch Break', + '2:00': 'Lunch Break', + '2:30': 'Development', + '3:00': 'Development', + '3:30': 'Check Mail', + '4:00': 'Conference', + '4:30': 'Conference', + '5:00': 'Team Meeting', + }, + { + employeeID: 10005, + employeeName: 'Peacock', + '9:00': 'Task Assign', + '9:30': 'Task Assign', + '10:00': 'Task Assign', + '10:30': 'Task Assign', + '11:00': 'Check Mail', + '11:30': 'Support', + '12:00': 'Support', + '12:30': 'Support', + '1:00': 'Lunch Break', + '1:30': 'Lunch Break', + '2:00': 'Lunch Break', + '2:30': 'Development', + '3:00': 'Development', + '3:30': 'Team Meeting', + '4:00': 'Team Meeting', + '4:30': 'Testing', + '5:00': 'Testing', + }, + { + employeeID: 10006, + employeeName: 'Janet', + '9:00': 'Testing', + '9:30': 'Testing', + '10:00': 'Support', + '10:30': 'Support', + '11:00': 'Support', + '11:30': 'Team Meeting', + '12:00': 'Team Meeting', + '12:30': 'Team Meeting', + '1:00': 'Lunch Break', + '1:30': 'Lunch Break', + '2:00': 'Lunch Break', + '2:30': 'Development', + '3:00': 'Development', + '3:30': 'Team Meeting', + '4:00': 'Team Meeting', + '4:30': 'Development', + '5:00': 'Development', + }, + { + employeeID: 10007, + employeeName: 'Suyama', + '9:00': 'Analysis Tasks', + '9:30': 'Analysis Tasks', + '10:00': 'Testing', + '10:30': 'Development', + '11:00': 'Development', + '11:30': 'Testing', + '12:00': 'Testing', + '12:30': 'Testing', + '1:00': 'Lunch Break', + '1:30': 'Lunch Break', + '2:00': 'Lunch Break', + '2:30': 'Support', + '3:00': 'Build', + '3:30': 'Build', + '4:00': 'Check Mail', + '4:30': 'Check Mail', + '5:00': 'Check Mail', + }, + { + employeeID: 10008, + employeeName: 'Robert', + '9:00': 'Task Assign', + '9:30': 'Task Assign', + '10:00': 'Task Assign', + '10:30': 'Development', + '11:00': 'Development', + '11:30': 'Development', + '12:00': 'Testing', + '12:30': 'Support', + '1:00': 'Lunch Break', + '1:30': 'Lunch Break', + '2:00': 'Lunch Break', + '2:30': 'Check Mail', + '3:00': 'Check Mail', + '3:30': 'Check Mail', + '4:00': 'Team Meeting', + '4:30': 'Team Meeting', + '5:00': 'Build', + }, + { + employeeID: 10009, + employeeName: 'Andrew', + '9:00': 'Check Mail', + '9:30': 'Team Meeting', + '10:00': 'Team Meeting', + '10:30': 'Support', + '11:00': 'Testing', + '11:30': 'Development', + '12:00': 'Development', + '12:30': 'Development', + '1:00': 'Lunch Break', + '1:30': 'Lunch Break', + '2:00': 'Lunch Break', + '2:30': 'Check Mail', + '3:00': 'Check Mail', + '3:30': 'Check Mail', + '4:00': 'Team Meeting', + '4:30': 'Development', + '5:00': 'Development', + }, + { + employeeID: 10010, + employeeName: 'Michael', + '9:00': 'Task Assign', + '9:30': 'Task Assign', + '10:00': 'Task Assign', + '10:30': 'Analysis Tasks', + '11:00': 'Analysis Tasks', + '11:30': 'Development', + '12:00': 'Development', + '12:30': 'Development', + '1:00': 'Lunch Break', + '1:30': 'Lunch Break', + '2:00': 'Lunch Break', + '2:30': 'Testing', + '3:00': 'Testing', + '3:30': 'Testing', + '4:00': 'Build', + '4:30': 'Build', + '5:00': 'Build', + }, + ]; + } + + toggleSubTitle() { + this.showSubTitle = !this.showSubTitle; + const action = this.showSubTitle ? 'remove' : 'add'; + document.querySelector('.subtitle')?.classList[action]('hidden'); + } +} diff --git a/src/app/examples/grid44.component.html b/src/app/examples/grid44.component.html new file mode 100644 index 000000000..098476849 --- /dev/null +++ b/src/app/examples/grid44.component.html @@ -0,0 +1,91 @@ +
+

+ Example 44: colspan/rowspan with large dataset + + + code + + + +

+ +
+

+ This page demonstrates colspan & rowspan using DataView with item metadata. Note: + colspan & rowspan are rendered via row/cell indexes, any operations that could change these + indexes (i.e. Filtering/Sorting/Paging/Column Reorder) will require you to implement proper logic to recalculate these + indexes (it becomes your responsability). This demo does not show this because it is up to you to decide what to do when the + span changes shape (i.e. you default to 3 rowspan but you filter a row in the middle, how do you want to proceed?). +

+
+ +
+
+ + + + +
+ + +
+ + +
+
+
+ + + +
diff --git a/src/app/examples/grid44.component.scss b/src/app/examples/grid44.component.scss new file mode 100644 index 000000000..ea9fca584 --- /dev/null +++ b/src/app/examples/grid44.component.scss @@ -0,0 +1,50 @@ +#grid44 { + --slick-cell-active-box-shadow: inset 0 0 0 1px #e35ddc; + + .slick-row.even .slick-cell.cell-very-high { + background-color: #f0ffe0; + } + .slick-row.odd .slick-cell.cell-var-span { + background-color: #87ceeb; + } + .slick-row .slick-cell.rowspan { + background-color: #95b7a2; + z-index: 10; + } + .slick-row[data-row='3'] .slick-cell.l3.rowspan { + background-color: #95b7a2; + } + .slick-row[data-row='2'] .slick-cell.l3.r5 { + background-color: #ddfffc; + } + .slick-row[data-row='0'] .slick-cell.rowspan, + .slick-row[data-row='8'] .slick-cell.rowspan { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAQ0lEQVQYV2N8/fr1fwY84M6dOwyM+BSBFKioqOBWBFMAsgSrScgKsCpCV4ChCJsCFEW4FMAV4VMAVnT8+PH/IG/iAwDA1DlezHn8bwAAAABJRU5ErkJggg==); + } + .slick-row[data-row='8'] .slick-cell.rowspan:nth-child(4) { + background: #f0ffe0; + } + .slick-row[data-row='12'] .slick-cell.rowspan { + background: #bd8b8b; + } + .slick-row[data-row='15'] .slick-cell.rowspan { + background: #edc12e; + } + .slick-row[data-row='85'] .slick-cell.rowspan { + background: #8baebd; + } + .slick-cell.active { + /* use a different active cell color to make it a bit more obvious */ + box-shadow: inset 0 0 0 1px #e35ddc; + } + .cellValue { + float: right; + font-size: 14px; + } + .valueComment { + color: #7c8983; + font-size: 12px; + font-style: italic; + width: fit-content; + } +} diff --git a/src/app/examples/grid44.component.ts b/src/app/examples/grid44.component.ts new file mode 100644 index 000000000..1591eddbc --- /dev/null +++ b/src/app/examples/grid44.component.ts @@ -0,0 +1,238 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import { AngularGridInstance, Column, Formatter, GridOption, type ItemMetadata } from './../modules/angular-slickgrid'; + +const rowCellValueFormatter: Formatter = (row, cell, value) => { + return `
${value.toFixed(2)}
${row}.${cell}
`; +}; + +@Component({ + styleUrls: ['grid44.component.scss'], + templateUrl: './grid44.component.html', + encapsulation: ViewEncapsulation.None, +}) +export class Grid44Component implements OnInit { + columnDefinitions: Column[] = []; + gridOptions!: GridOption; + angularGrid!: AngularGridInstance; + dataLn: number | string = 'loading...'; + dataset: any[] = []; + showSubTitle = true; + scrollToRow = 100; + metadata: Record = { + 0: { + columns: { + 1: { rowspan: 3 }, + }, + }, + 2: { + columns: { + 0: { rowspan: 3 }, + 3: { colspan: 3 }, + }, + }, + 3: { + columns: { + 1: { rowspan: 5, colspan: 1, cssClass: 'cell-var-span' }, + // 1: { rowspan: 3, colspan: 2, cssClass: "cell-var-span" }, + 3: { rowspan: 3, colspan: 5 }, + }, + }, + 8: { + columns: { + 1: { rowspan: 80 }, + 3: { rowspan: 1999, colspan: 2, cssClass: 'cell-very-high' }, + }, + }, + 12: { + columns: { + 11: { rowspan: 3 }, + }, + }, + 15: { + columns: { + 18: { colspan: 4, rowspan: 3 }, + }, + }, + 85: { + columns: { + 5: { rowspan: 20 }, + }, + }, + }; + + angularGridReady(angularGrid: AngularGridInstance) { + this.angularGrid = angularGrid; + } + + ngOnInit(): void { + // define the grid options & columns and then create the grid itself + this.defineGrid(); + + // mock a dataset + this.loadData(500); + } + + defineGrid() { + this.columnDefinitions = [ + { id: 'title', name: 'Title', field: 'title', minWidth: 80 }, + { id: 'revenueGrowth', name: 'Revenue Growth', field: 'revenueGrowth', formatter: rowCellValueFormatter, minWidth: 120 }, + { + id: 'pricingPolicy', + name: 'Pricing Policy', + field: 'pricingPolicy', + minWidth: 110, + sortable: true, + formatter: rowCellValueFormatter, + }, + { id: 'policyIndex', name: 'Policy Index', field: 'policyIndex', minWidth: 100, formatter: rowCellValueFormatter }, + { id: 'expenseControl', name: 'Expense Control', field: 'expenseControl', minWidth: 110, formatter: rowCellValueFormatter }, + { id: 'excessCash', name: 'Excess Cash', field: 'excessCash', minWidth: 100, formatter: rowCellValueFormatter }, + { id: 'netTradeCycle', name: 'Net Trade Cycle', field: 'netTradeCycle', minWidth: 110, formatter: rowCellValueFormatter }, + { id: 'costCapital', name: 'Cost of Capital', field: 'costCapital', minWidth: 100, formatter: rowCellValueFormatter }, + { id: 'revenueGrowth2', name: 'Revenue Growth', field: 'revenueGrowth2', formatter: rowCellValueFormatter, minWidth: 120 }, + { + id: 'pricingPolicy2', + name: 'Pricing Policy', + field: 'pricingPolicy2', + minWidth: 110, + sortable: true, + formatter: rowCellValueFormatter, + }, + { id: 'policyIndex2', name: 'Policy Index', field: 'policyIndex2', minWidth: 100, formatter: rowCellValueFormatter }, + { + id: 'expenseControl2', + name: 'Expense Control', + field: 'expenseControl2', + minWidth: 110, + formatter: rowCellValueFormatter, + }, + { id: 'excessCash2', name: 'Excess Cash', field: 'excessCash2', minWidth: 100, formatter: rowCellValueFormatter }, + { id: 'netTradeCycle2', name: 'Net Trade Cycle', field: 'netTradeCycle2', minWidth: 110, formatter: rowCellValueFormatter }, + { id: 'costCapital2', name: 'Cost of Capital', field: 'costCapital2', minWidth: 100, formatter: rowCellValueFormatter }, + { id: 'revenueGrowth3', name: 'Revenue Growth', field: 'revenueGrowth3', formatter: rowCellValueFormatter, minWidth: 120 }, + { + id: 'pricingPolicy3', + name: 'Pricing Policy', + field: 'pricingPolicy3', + minWidth: 110, + sortable: true, + formatter: rowCellValueFormatter, + }, + { id: 'policyIndex3', name: 'Policy Index', field: 'policyIndex3', minWidth: 100, formatter: rowCellValueFormatter }, + { + id: 'expenseControl3', + name: 'Expense Control', + field: 'expenseControl3', + minWidth: 110, + formatter: rowCellValueFormatter, + }, + { id: 'excessCash3', name: 'Excess Cash', field: 'excessCash3', minWidth: 100, formatter: rowCellValueFormatter }, + { id: 'netTradeCycle3', name: 'Net Trade Cycle', field: 'netTradeCycle3', minWidth: 110, formatter: rowCellValueFormatter }, + { id: 'costCapital3', name: 'Cost of Capital', field: 'costCapital3', minWidth: 100, formatter: rowCellValueFormatter }, + ]; + + this.gridOptions = { + enableCellNavigation: true, + enableColumnReorder: true, + enableCellRowSpan: true, + gridHeight: 600, + gridWidth: 900, + rowHeight: 30, + dataView: { + globalItemMetadataProvider: { + getRowMetadata: (item: any, row: number) => this.renderDifferentColspan(item, row), + }, + }, + rowTopOffsetRenderType: 'top', // rowspan doesn't render well with 'transform', default is 'top' + }; + } + + clearScrollTo() { + this.scrollToRow = 0; + document.querySelector('#nRow')?.focus(); + } + + loadData(count: number) { + this.dataLn = 'loading...'; + + // add a delay just to show the "loading" text before it loads all data + setTimeout(() => { + // mock data + const tmpArray: any[] = []; + for (let i = 0; i < count; i++) { + tmpArray[i] = { + id: i, + title: 'Task ' + i, + revenueGrowth: Math.random() * Math.pow(10, Math.random() * 3), + pricingPolicy: Math.random() * Math.pow(10, Math.random() * 3), + policyIndex: Math.random() * Math.pow(10, Math.random() * 3), + expenseControl: Math.random() * Math.pow(10, Math.random() * 3), + excessCash: Math.random() * Math.pow(10, Math.random() * 3), + netTradeCycle: Math.random() * Math.pow(10, Math.random() * 3), + costCapital: Math.random() * Math.pow(10, Math.random() * 3), + revenueGrowth2: Math.random() * Math.pow(10, Math.random() * 3), + pricingPolicy2: Math.random() * Math.pow(10, Math.random() * 3), + policyIndex2: Math.random() * Math.pow(10, Math.random() * 3), + expenseControl2: Math.random() * Math.pow(10, Math.random() * 3), + excessCash2: Math.random() * Math.pow(10, Math.random() * 3), + netTradeCycle2: Math.random() * Math.pow(10, Math.random() * 3), + costCapital2: Math.random() * Math.pow(10, Math.random() * 3), + revenueGrowth3: Math.random() * Math.pow(10, Math.random() * 3), + pricingPolicy3: Math.random() * Math.pow(10, Math.random() * 3), + policyIndex3: Math.random() * Math.pow(10, Math.random() * 3), + expenseControl3: Math.random() * Math.pow(10, Math.random() * 3), + excessCash3: Math.random() * Math.pow(10, Math.random() * 3), + netTradeCycle3: Math.random() * Math.pow(10, Math.random() * 3), + costCapital3: Math.random() * Math.pow(10, Math.random() * 3), + }; + } + + // let's keep column 3-4 as the row spanning from row 8 until the end of the grid + this.metadata[8].columns![3].rowspan = tmpArray.length - 8; + + this.angularGrid?.dataView?.beginUpdate(); + this.angularGrid?.dataView?.setItems(tmpArray); + this.angularGrid?.dataView?.endUpdate(); + this.dataLn = count; + }, 20); + } + + /** + * A callback to render different row column span + * Your callback will always have the "item" argument which you can use to decide on the colspan + * Your return object must always be in the form of:: { columns: { [columnName]: { colspan: number|'*' } }} + */ + renderDifferentColspan(_item: any, row: number): any { + return (this.metadata[row] as ItemMetadata)?.attributes + ? this.metadata[row] + : (this.metadata[row] = { attributes: { 'data-row': row }, ...this.metadata[row] }); + } + + handleToggleSpans() { + const cell = this.metadata[3].columns![1]; + if (cell.colspan === 1) { + cell.rowspan = 3; + cell.colspan = 2; + } else { + cell.rowspan = 5; + cell.colspan = 1; + } + + // row index 3 can have a rowspan of up to 5 rows, so we need to invalidate from row 3 + 5 (-1 because of zero index) + // so: 3 + 5 - 1 => row indexes 3 to 7 + this.angularGrid.slickGrid?.invalidateRows([3, 4, 5, 6, 7]); + this.angularGrid.slickGrid?.render(); + } + + handleScrollTo() { + // const args = event.detail && event.detail.args; + this.angularGrid.slickGrid?.scrollRowToTop(this.scrollToRow); + return false; + } + + toggleSubTitle() { + this.showSubTitle = !this.showSubTitle; + const action = this.showSubTitle ? 'remove' : 'add'; + document.querySelector('.subtitle')?.classList[action]('hidden'); + } +} diff --git a/src/app/modules/angular-slickgrid/components/angular-slickgrid.component.ts b/src/app/modules/angular-slickgrid/components/angular-slickgrid.component.ts index 4dee59392..0c215b718 100644 --- a/src/app/modules/angular-slickgrid/components/angular-slickgrid.component.ts +++ b/src/app/modules/angular-slickgrid/components/angular-slickgrid.component.ts @@ -1052,6 +1052,7 @@ export class AngularSlickgridComponent implements AfterViewInit, On } } + // @deprecated @user `dataview.globalItemMetadataProvider.getRowMetadata` // did the user add a colspan callback? If so, hook it into the DataView getItemMetadata if (gridOptions?.colspanCallback && dataView && dataView.getItem && dataView.getItemMetadata) { dataView.getItemMetadata = (rowNumber: number) => { diff --git a/test/cypress/e2e/example43.cy.ts b/test/cypress/e2e/example43.cy.ts new file mode 100644 index 000000000..343e68bcf --- /dev/null +++ b/test/cypress/e2e/example43.cy.ts @@ -0,0 +1,406 @@ +describe('Example 43 - colspan/rowspan - Employees Timesheets', { retries: 0 }, () => { + const GRID_ROW_HEIGHT = 30; + const fullTitles = [ + 'Employee ID', + 'Employee Name', + '9:00 AM', + '9:30 AM', + '10:00 AM', + '10:30 AM', + '11:00 AM', + '11:30 AM', + '12:00 PM', + '12:30 PM', + '1:00 PM', + '1:30 PM', + '2:00 PM', + '2:30 PM', + '3:00 PM', + '3:30 PM', + '4:00 PM', + '4:30 PM', + '5:00 PM', + ]; + + it('should display Example title', () => { + cy.visit(`${Cypress.config('baseUrl')}/rowspan-timesheets`); + cy.get('h2').should('contain', 'Example 43: colspan/rowspan - Employees Timesheets'); + }); + + it('should have exact column titles', () => { + cy.get('.slick-header-columns') + .children() + .each(($child, index) => expect($child.text()).to.eq(fullTitles[index])); + }); + + it('should expect 1st column to be frozen (frozen)', () => { + cy.get('.grid-canvas-left .slick-cell.frozen').should('have.length', 10); + cy.get('.grid-canvas-right .slick-cell:not(.frozen)').should('have.length.above', 60); + }); + + describe('Spanning', () => { + it('should expect "Davolio", "Check Mail", and "Development" to all have rowspan of 2 in morning hours', () => { + cy.get(`[data-row=0] > .slick-cell.l1.r1.rowspan`).should('contain', 'Davolio'); + cy.get(`[data-row=0] > .slick-cell.l1.r1.rowspan`).should(($el) => + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 2) + ); + + cy.get(`[data-row=2] > .slick-cell.l2.r4.rowspan`).should('contain', 'Check Mail'); + cy.get(`[data-row=2] > .slick-cell.l2.r4.rowspan`).should(($el) => + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 2) + ); + + cy.get(`[data-row=8] > .slick-cell.l7.r9.rowspan`).should('contain', 'Development'); + cy.get(`[data-row=8] > .slick-cell.l7.r9.rowspan`).should(($el) => + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 2) + ); + }); + + it('should expect "Lunch Break" to span over 3 columns and over all rows', () => { + cy.get(`[data-row=0] > .slick-cell.l10.r12.rowspan`).should('contain', 'Lunch Break'); + cy.get(`[data-row=0] > .slick-cell.l10.r12.rowspan`).should(($el) => + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 10) + ); + }); + + it('should expect a large "Development" section that spans over multiple columns & rows in the afternoon', () => { + cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan`).should('contain', 'Development'); + cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan`).should(($el) => + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 5) + ); + }); + }); + + describe('Basic Key Navigations', () => { + it('should start at Employee 10001, then type "End" key and expect to be in "Team Meeting" between 4:30-5:00pm', () => { + cy.get('[data-row=0] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l0.r0.active').should('contain', '10001'); + cy.get('@active_cell').type('{end}'); + cy.get('[data-row=0] > .slick-cell.l17.r18.active').should('contain', 'Team Meeting'); + }); + + it('should start at Employee 10002, then type "End" key and also expect to be in "Team Meeting" between 4:30-5:00pm', () => { + cy.get('[data-row=1] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=1] > .slick-cell.l0.r0.active').should('contain', '10002'); + cy.get('@active_cell').type('{end}'); + cy.get('[data-row=0] > .slick-cell.l17.r18.active').should('contain', 'Team Meeting'); + }); + + it('should start at Employee 10004, then type "ArrowRight" key twice and expect to be in "Check Mail" between 9:00-10:30am', () => { + cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004'); + cy.get('@active_cell').type('{rightarrow}{rightarrow}'); + cy.get('[data-row=2] > .slick-cell.l2.r4.active').should('contain', 'Check Mail'); + }); + + it('should start at Employee 10004, then type "ArrowRight" key 4x times and expect to be in "Testing" between 11:00-1:00pm', () => { + cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004'); + cy.get('@active_cell').type('{rightarrow}{rightarrow}{rightarrow}{rightarrow}'); + cy.get('[data-row=3] > .slick-cell.l6.r9.active').should('contain', 'Testing'); + }); + + it('should start at Employee 10004, then type "ArrowRight" key 5x times and expect to be in "Lunch Break"', () => { + cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004'); + cy.get('@active_cell').type('{rightarrow}{rightarrow}{rightarrow}{rightarrow}{rightarrow}'); + cy.get(`[data-row=0] > .slick-cell.l10.r12.rowspan`).should('contain', 'Lunch Break'); + }); + + it('should start at Employee 10004, then type "ArrowRight" key 6x times and expect to be in "Development" between 2:30-3:30pm', () => { + cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004'); + cy.get('@active_cell').type('{rightarrow}{rightarrow}{rightarrow}{rightarrow}{rightarrow}{rightarrow}'); + cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan.active`).should('contain', 'Development'); + }); + + // then rollback by going backward + it('should be on Employee 10004 row at previous "Development" cell, then type "ArrowLeft" key once and expect to be in "Lunch Break"', () => { + cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan`).as('active_cell').click(); + cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan`).should('contain', 'Development'); + cy.get('@active_cell').type('{leftarrow}'); + cy.get(`[data-row=0] > .slick-cell.l10.r12.rowspan.active`).should('contain', 'Lunch Break'); + }); + + it('should start at Employee 10004, type "End" and be at "Team Meeting" at 5pm, then type "ArrowLeft" key once and expect to be in "Conference" between 4:00-5:00pm', () => { + cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004'); + cy.get('@active_cell').type('{end}'); + cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).should('contain', 'Team Meeting'); + cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).type('{leftarrow}'); + cy.get(`[data-row=3] > .slick-cell.l16.r17.active`).should('contain', 'Conference'); + }); + + it('should start at Employee 10004, type "End" and be at "Team Meeting" at 5pm, then type "ArrowLeft" key 3x times and expect to be back to "Development" between 2:30-3:30pm', () => { + cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004'); + cy.get('@active_cell').type('{end}'); + cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).should('contain', 'Team Meeting'); + cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).type('{leftarrow}{leftarrow}{leftarrow}'); + cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan.active`).should('contain', 'Development'); + }); + + it('should start at Employee 10004, type "End" and be at "Team Meeting" at 5pm, then type "ArrowLeft" key 4x times and expect to be back to "Lunch Break"', () => { + cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004'); + cy.get('@active_cell').type('{end}'); + cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).as('active_cell').should('contain', 'Team Meeting'); + cy.get('@active_cell').type('{leftarrow}{leftarrow}{leftarrow}{leftarrow}'); + cy.get(`[data-row=0] > .slick-cell.l10.r12.rowspan.active`).should('contain', 'Lunch Break'); + }); + + it('should start at Employee 10004, type "End" and be at "Team Meeting" at 5pm, then type "ArrowLeft" key 5x times and expect to be back to "Testing" between 11:00-1:00pm', () => { + cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004'); + cy.get('@active_cell').type('{end}'); + cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).as('active_cell').should('contain', 'Team Meeting'); + cy.get('@active_cell').type('{leftarrow}{leftarrow}{leftarrow}{leftarrow}{leftarrow}'); + cy.get(`[data-row=3] > .slick-cell.l6.r9.active`).should('contain', 'Testing'); + }); + + // going down + it('should start at 10am "Team Meeting, then type "ArrowDown" key once and expect to be in "Support" between 9:30-11:00am', () => { + cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting'); + cy.get('@active_cell').type('{downarrow}'); + cy.get(`[data-row=1] > .slick-cell.l3.r5.active`).should('contain', 'Support'); + }); + + it('should start at 10am "Team Meeting, then type "ArrowDown" key twice and expect to be in "Check Email" between 9:00-10:30am', () => { + cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting'); + cy.get('@active_cell').type('{downarrow}{downarrow}'); + cy.get(`[data-row=2] > .slick-cell.l2.r4.active`).should('contain', 'Check Mail'); + }); + + it('should start at 10am "Team Meeting, then type "ArrowDown" key 3x times and expect to be in "Task Assign" between 9:00-11:00am', () => { + cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting'); + cy.get('@active_cell').type('{downarrow}{downarrow}{downarrow}'); + cy.get(`[data-row=4] > .slick-cell.l2.r5.active`).should('contain', 'Task Assign'); + }); + + it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times and expect to be in "Support" between 10:00-11:30am', () => { + cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting'); + cy.get('@active_cell').type('{downarrow}{downarrow}{downarrow}{downarrow}'); + cy.get(`[data-row=5] > .slick-cell.l4.r6.active`).should('contain', 'Support'); + }); + + // going up from inverse + it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times, then "ArrowUp" once and expect to be in "Task Assign" between 9:00-11:00am', () => { + cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting'); + cy.get('@active_cell').type('{downarrow}{downarrow}{downarrow}{downarrow}{uparrow}'); + cy.get(`[data-row=4] > .slick-cell.l2.r5.active`).should('contain', 'Task Assign'); + }); + + it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times, then "ArrowUp" 2x times and expect to be in "Task Assign" between 9:00-11:00am', () => { + cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting'); + cy.get('@active_cell').type('{downarrow}{downarrow}{downarrow}{downarrow}{uparrow}{uparrow}'); + cy.get(`[data-row=2] > .slick-cell.l2.r4.active`).should('contain', 'Check Mail'); + }); + + it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times, then "ArrowUp" 3x times and expect to be in "Support" between 10:00-11:30am', () => { + cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting'); + cy.get('@active_cell').type('{downarrow}{downarrow}{downarrow}{downarrow}{uparrow}{uparrow}{uparrow}'); + cy.get(`[data-row=1] > .slick-cell.l3.r5.active`).should('contain', 'Support'); + }); + + it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times, then "ArrowUp" 4x times and expect to be back to same "Team Meeting"', () => { + cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting'); + cy.get('@active_cell').type('{downarrow}{downarrow}{downarrow}{downarrow}{uparrow}{uparrow}{uparrow}{uparrow}'); + cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting'); + }); + }); + + describe('Grid Navigate Functions', () => { + it('should start at Employee 10004, then type "Navigate Right" twice and expect to be in "Check Mail" between 9:00-10:30am', () => { + cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-test="goto-next"]').click().click(); + cy.get('[data-row=2] > .slick-cell.l2.r4.active').should('contain', 'Check Mail'); + }); + + it('should start at Employee 10004, then type "Navigate Right" 4x times and expect to be in "Testing" between 11:00-1:00pm', () => { + cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004'); + cy.get('[data-test="goto-next"]').click().click().click().click(); + cy.get('[data-row=3] > .slick-cell.l6.r9.active').should('contain', 'Testing'); + }); + + it('should start at Employee 10004, then type "Navigate Right" 5x times and expect to be in "Lunch Break"', () => { + cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004'); + cy.get('[data-test="goto-next"]').click().click().click().click().click(); + cy.get(`[data-row=0] > .slick-cell.l10.r12.rowspan`).should('contain', 'Lunch Break'); + }); + + it('should start at Employee 10004, then type "Navigate Right" 6x times and expect to be in "Development" between 2:30-3:30pm', () => { + cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004'); + cy.get('[data-test="goto-next"]').click().click().click().click().click().click(); + cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan.active`).should('contain', 'Development'); + }); + + // then rollback by going backward + it('should be on Employee 10004 row at previous "Development" cell, then type "Navigate Left" once and expect to be in "Lunch Break"', () => { + cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan`).as('active_cell').click(); + cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan`).should('contain', 'Development'); + cy.get('[data-test="goto-prev"]').click(); + cy.get(`[data-row=0] > .slick-cell.l10.r12.rowspan.active`).should('contain', 'Lunch Break'); + }); + + it('should start at Employee 10004, type "End" and be at "Team Meeting" at 5pm, then type "Navigate Left" once and expect to be in "Conference" between 4:00-5:00pm', () => { + cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004'); + cy.get('@active_cell').type('{end}'); + cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).should('contain', 'Team Meeting'); + cy.get('[data-test="goto-prev"]').click(); + cy.get(`[data-row=3] > .slick-cell.l16.r17.active`).should('contain', 'Conference'); + }); + + it('should start at Employee 10004, type "End" and be at "Team Meeting" at 5pm, then type "Navigate Left" 3x times and expect to be back to "Development" between 2:30-3:30pm', () => { + cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004'); + cy.get('@active_cell').type('{end}'); + cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).should('contain', 'Team Meeting'); + cy.get('[data-test="goto-prev"]').click().click().click(); + cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan.active`).should('contain', 'Development'); + }); + + it('should start at Employee 10004, type "End" and be at "Team Meeting" at 5pm, then type "Navigate Left" 4x times and expect to be back to "Lunch Break"', () => { + cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004'); + cy.get('@active_cell').type('{end}'); + cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).as('active_cell').should('contain', 'Team Meeting'); + cy.get('[data-test="goto-prev"]').click().click().click().click(); + cy.get(`[data-row=0] > .slick-cell.l10.r12.rowspan.active`).should('contain', 'Lunch Break'); + }); + + it('should start at Employee 10004, type "End" and be at "Team Meeting" at 5pm, then type "Navigate Left" 5x times and expect to be back to "Testing" between 11:00-1:00pm', () => { + cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004'); + cy.get('@active_cell').type('{end}'); + cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).as('active_cell').should('contain', 'Team Meeting'); + cy.get('[data-test="goto-prev"]').click().click().click().click().click(); + cy.get(`[data-row=3] > .slick-cell.l6.r9.active`).should('contain', 'Testing'); + }); + + // going down + it('should start at 10am "Team Meeting, then type "ArrowDown" key once and expect to be in "Support" between 9:30-11:00am', () => { + cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting'); + cy.get('[data-test="goto-down"]').click(); + cy.get(`[data-row=1] > .slick-cell.l3.r5.active`).should('contain', 'Support'); + }); + + it('should start at 10am "Team Meeting, then type "ArrowDown" key twice and expect to be in "Check Email" between 9:00-10:30am', () => { + cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting'); + cy.get('[data-test="goto-down"]').click().click(); + cy.get(`[data-row=2] > .slick-cell.l2.r4.active`).should('contain', 'Check Mail'); + }); + + it('should start at 10am "Team Meeting, then type "ArrowDown" key 3x times and expect to be in "Task Assign" between 9:00-11:00am', () => { + cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting'); + cy.get('[data-test="goto-down"]').click().click().click(); + cy.get(`[data-row=4] > .slick-cell.l2.r5.active`).should('contain', 'Task Assign'); + }); + + it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times and expect to be in "Support" between 10:00-11:30am', () => { + cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting'); + cy.get('[data-test="goto-down"]').click().click().click().click(); + cy.get(`[data-row=5] > .slick-cell.l4.r6.active`).should('contain', 'Support'); + }); + + // going up from inverse + it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times, then "ArrowUp" once and expect to be in "Task Assign" between 9:00-11:00am', () => { + cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting'); + cy.get('[data-test="goto-down"]').click().click().click().click(); + cy.get('[data-test="goto-up"]').click(); + cy.get(`[data-row=4] > .slick-cell.l2.r5.active`).should('contain', 'Task Assign'); + }); + + it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times, then "ArrowUp" 2x times and expect to be in "Task Assign" between 9:00-11:00am', () => { + cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting'); + cy.get('[data-test="goto-down"]').click().click().click().click(); + cy.get('[data-test="goto-up"]').click().click(); + cy.get(`[data-row=2] > .slick-cell.l2.r4.active`).should('contain', 'Check Mail'); + }); + + it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times, then "ArrowUp" 3x times and expect to be in "Support" between 10:00-11:30am', () => { + cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting'); + cy.get('[data-test="goto-down"]').click().click().click().click(); + cy.get('[data-test="goto-up"]').click().click().click(); + cy.get(`[data-row=1] > .slick-cell.l3.r5.active`).should('contain', 'Support'); + }); + + it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times, then "ArrowUp" 4x times and expect to be back to same "Team Meeting"', () => { + cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting'); + cy.get('[data-test="goto-down"]').click().click().click().click(); + cy.get('[data-test="goto-up"]').click().click().click().click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting'); + }); + }); + + describe('Grid Editing', () => { + it('should toggle editing', () => { + cy.get('#isEditable').contains('false'); + cy.get('[data-row=0] > .slick-cell.l4.r4').click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active .editor-text').should('not.exist'); + + cy.get('[data-test=toggle-editing]').click(); + cy.get('#isEditable').contains('true'); + + cy.get('[data-row=0] > .slick-cell.l4.r4').click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active.editable .editor-text').should('exist'); + cy.get('[data-row=0] > .slick-cell.l4.r4.active.editable .editor-text').type('Team Meeting.xyz{enter}'); + }); + + // going down + it('should have changed active cell to "Support" between 9:30-11:00am', () => { + cy.get('[data-row=1] > .slick-cell.l3.r5.active.editable .editor-text') + .invoke('val') + .then((text) => expect(text).to.eq('Support')); + cy.get('[data-row=1] > .slick-cell.l3.r5.active.editable .editor-text').type('Support.xyz{enter}'); + }); + + it('should have changed active cell to "Check Email" between 9:00-10:30am', () => { + cy.get('[data-row=2] > .slick-cell.l2.r4.active.editable .editor-text') + .invoke('val') + .then((text) => expect(text).to.eq('Check Mail')); + cy.get('[data-row=2] > .slick-cell.l2.r4.active.editable .editor-text').type('Check Mail.xyz{enter}'); + }); + + it('should have changed active cell to "Task Assign" between 9:00-11:00am', () => { + cy.get('[data-row=4] > .slick-cell.l2.r5.active.editable .editor-text') + .invoke('val') + .then((text) => expect(text).to.eq('Task Assign')); + cy.get('[data-row=4] > .slick-cell.l2.r5.active.editable .editor-text').type('Task Assign.xyz{enter}'); + }); + + it('should have changed active cell to "Support" between 10:00-11:30am', () => { + cy.get('[data-row=5] > .slick-cell.l4.r6.active.editable .editor-text') + .invoke('val') + .then((text) => expect(text).to.eq('Support')); + cy.get('[data-row=5] > .slick-cell.l4.r6.active.editable .editor-text').type('Support.xyz{enter}'); + }); + + it('should have changed active cell to "Testing" and cancel editing when typing "Escape" key', () => { + cy.get('[data-row=6] > .slick-cell.l4.r4.active.editable .editor-text') + .invoke('val') + .then((text) => expect(text).to.eq('Testing')); + cy.get('[data-row=6] > .slick-cell.l4.r4.active.editable .editor-text').type('{esc}'); + cy.get('[data-row=6] > .slick-cell.l4.r4.active.editable .editor-text').should('not.exist'); + }); + }); +}); diff --git a/test/cypress/e2e/example44.cy.ts b/test/cypress/e2e/example44.cy.ts new file mode 100644 index 000000000..60ea88d42 --- /dev/null +++ b/test/cypress/e2e/example44.cy.ts @@ -0,0 +1,463 @@ +describe('Example 44 - Column & Row Span', { retries: 0 }, () => { + const GRID_ROW_HEIGHT = 30; + const fullTitles = [ + 'Title', + 'Revenue Growth', + 'Pricing Policy', + 'Policy Index', + 'Expense Control', + 'Excess Cash', + 'Net Trade Cycle', + 'Cost of Capital', + 'Revenue Growth', + 'Pricing Policy', + 'Policy Index', + 'Expense Control', + 'Excess Cash', + 'Net Trade Cycle', + 'Cost of Capital', + 'Revenue Growth', + 'Pricing Policy', + 'Policy Index', + 'Expense Control', + 'Excess Cash', + 'Net Trade Cycle', + 'Cost of Capital', + ]; + + it('should display Example title', () => { + cy.visit(`${Cypress.config('baseUrl')}/rowspan-large`); + cy.get('h2').should('contain', 'Example 44: colspan/rowspan with large dataset'); + }); + + it('should have exact column titles', () => { + cy.get('.slick-header-columns') + .children() + .each(($child, index) => expect($child.text()).to.eq(fullTitles[index])); + }); + + it('should drag Title column to swap with 2nd column "Revenue Growth" in the grid and expect rowspan to stay at same position with Task 0 to spread instead', () => { + const expectedTitles = ['Revenue Growth', 'Title', 'Pricing Policy']; + + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 2}px;"] > .slick-cell.l0.r0.rowspan`).should(($el) => + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 3) + ); + + cy.get('.slick-header-columns').children('.slick-header-column:nth(0)').contains('Title').drag('.slick-header-column:nth(1)'); + cy.get('.slick-header-column:nth(0)').contains('Revenue Growth'); + cy.get('.slick-header-column:nth(1)').contains('Title'); + + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 0}px;"] > .slick-cell.l1.r1`).should('contain', 'Task 0'); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 2}px;"] > .slick-cell.l1.r1`).should('not.exist'); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l1.r1`).should('contain', 'Task 3'); + + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 0}px;"] > .slick-cell.l1.r1.rowspan`).should(($el) => + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 3) + ); + + cy.get('.slick-header-columns') + .children() + .each(($child, index) => { + if (index < expectedTitles.length) { + expect($child.text()).to.eq(expectedTitles[index]); + } + }); + }); + + it('should drag back Title column to reswap with 2nd column "Revenue Growth" in the grid and expect rowspan to stay at same position with Revenue Growth to now spread', () => { + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 0}px;"] > .slick-cell.l1.r1.rowspan`).should(($el) => + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 3) + ); + cy.get('.slick-header-columns') + .children('.slick-header-column:nth(0)') + .contains('Revenue Growth') + .drag('.slick-header-column:nth(1)'); + cy.get('.slick-header-column:nth(0)').contains('Title'); + cy.get('.slick-header-column:nth(1)').contains('Revenue Growth'); + + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 0}px;"] > .slick-cell.l0.r0`).should('contain', 'Task 0'); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 1}px;"] > .slick-cell.l0.r0`).should('contain', 'Task 1'); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 2}px;"] > .slick-cell.l0.r0`).should('contain', 'Task 2'); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l0.r0`).should('not.exist'); + + const expectedTitles = ['Title', 'Revenue Growth', 'Pricing Policy']; + cy.get('.slick-header-columns') + .children() + .each(($child, index) => { + if (index < expectedTitles.length) { + expect($child.text()).to.eq(expectedTitles[index]); + } + }); + }); + + describe('spanning', () => { + it('should expect first row to be regular rows without any spanning', () => { + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 0}px;"] > .slick-cell.l0.r0`).should('contain', 'Task 0'); + + for (let i = 2; i <= 6; i++) { + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 0}px;"] > .slick-cell.l${i}.r${i}`).should('exist'); + } + }); + + it('should expect 1st row, second cell to span (rowspan) across 3 rows', () => { + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 0}px;"] > .slick-cell.l0.r0`).should('contain', 'Task 0'); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 0}px;"] > .slick-cell:nth(1).rowspan`).should(($el) => { + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 3); + }); + + for (let i = 2; i <= 14; i++) { + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 1}px;"] > .slick-cell:nth(${i})`).contains(/\d+$/); // use regexp to make sure it's a number + } + }); + + it('should expect 3rd row first cell to span (rowspan) across 3 rows', () => { + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 2}px;"] > .slick-cell.l0.r0.rowspan`).should('contain', 'Task 2'); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 2}px;"] > .slick-cell.l0.r0.rowspan`).should(($el) => + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 3) + ); + + for (let i = 2; i <= 5; i++) { + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 2}px;"] > .slick-cell:nth(${i})`).contains(/\d+$/); + } + }); + + it('should expect 4th row to have 2 sections (blue, green) spanning across 3 rows (rowspan) and 2 columns (colspan)', () => { + // blue rowspan section + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l1.r1.rowspan`).should(($el) => + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 5) + ); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l2.r2`) + .should('exist') + .contains(/\d+$/); + + // green colspan/rowspan section + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l3.r7`) + .should('exist') + .contains(/\d+$/); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l8.r8`) + .should('exist') + .contains(/\d+$/); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l9.r9`) + .should('exist') + .contains(/\d+$/); + }); + + it('should click on "Toggle blue cell colspan..." and expect colspan to widen from 1 column to 2 columns and from 5 rows to 3 rowspan', () => { + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l1.r1.rowspan`).should('exist'); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l1.r1.rowspan`).should(($el) => + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 5) + ); + + cy.get('[data-test="toggleSpans"]').click(); + cy.get('.slick-cell.l1.r1.rowspan').should('exist'); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l1.r2.rowspan`).should(($el) => + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 3) + ); + }); + + it('should expect Task 8 on 2nd column to have rowspan spanning 80 cells', () => { + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 8}px;"] > .slick-cell.l0.r0`).should('contain', 'Task 8'); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 8}px;"] > .slick-cell:nth(1).rowspan`).contains(/\d+$/); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 8}px;"] > .slick-cell:nth(1).rowspan`).should(($el) => { + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 80); + }); + }); + + it('should scroll to the right and still expect spans without any extra texts', () => { + cy.get('.slick-viewport-top.slick-viewport-left').scrollTo(400, 0).wait(10); + + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell:nth(1)`).contains(/\d+$/); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell:nth(0).rowspan`).should('exist'); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell:nth(1).rowspan`).should('exist'); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell:nth(1).rowspan`).should(($el) => + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 3) + ); + + // next rows are regular cells + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 4}px;"] > .slick-cell.l3.r3`).should('not.exist'); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 4}px;"] > .slick-cell.l4.r4`).should('not.exist'); + + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 5}px;"] > .slick-cell.l3.r3`).should('not.exist'); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 5}px;"] > .slick-cell.l3.r3`).should('not.exist'); + + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 6}px;"] > .slick-cell.l4.r4`).should('exist'); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 6}px;"] > .slick-cell.l4.r4`).should('exist'); + }); + + it('should scroll back to left and expect Task 8 to have 2 different spans (Revenue Grow: rowspan=80, Policy Index: rowspan=2000,colspan=2)', () => { + cy.get('.slick-viewport-top.slick-viewport-left').scrollTo(0, 0).wait(10); + + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 8}px;"] > .slick-cell.l0.r0`).should('contain', 'Task 8'); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 8}px;"] > .slick-cell:nth(1).rowspan`).should(($el) => { + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 80); + }); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 8}px;"] > .slick-cell:nth(1)`).contains(/\d+$/); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 8}px;"] > .slick-cell:nth(2)`).contains(/\d+$/); + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 8}px;"] > .slick-cell.l3.r4`).should('exist'); + + cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 9}px;"] > .slick-cell.l0.r0`).should('contain', 'Task 9'); + }); + + it('should scroll to row 85 and still expect 3 spans in the screen, "Revenue Growth" and "Policy Index" spans', () => { + cy.get('[data-test="clearScrollTo"]').click(); + cy.get('[data-test="nbrows"]').type('{backspace}85'); + cy.get('[data-test="scrollToBtn"]').click(); + + // left dashed rowspan "Revenue Growth" + cy.get(`[data-row=85] > .slick-cell.l0.r0`).should('contain', 'Task 85'); + cy.get(`[data-row=85] > .slick-cell.l2.r2`).contains(/\d+$/); + + // rowspan middle (yellowish) "Policy Index" + cy.get(`[data-row=88] > .slick-cell.l0.r0`).should('contain', 'Task 88'); + cy.get(`[data-row=88] > .slick-cell.l1.r1`).should('exist'); + }); + + it('should scroll to the end of the grid and still expect "PolicyIndex" column to span across 2 columns and rows until the end of the grid', () => { + cy.get('[data-test="clearScrollTo"]').click(); + cy.get('[data-test="nbrows"]').type('{backspace}490'); + cy.get('[data-test="scrollToBtn"]').click(); + + cy.get(`[data-row=485] > .slick-cell.l0.r0`).should('contain', 'Task 485'); + + cy.get(`[data-row=499] > .slick-cell.l0.r0`).should('contain', 'Task 499'); + cy.get(`[data-row=499] > .slick-cell.l1.r1`).should('exist'); + cy.get(`[data-row=499] > .slick-cell.l2.r2`).should('exist'); + cy.get(`[data-row=499] > .slick-cell.l5.r5`).should('exist'); + }); + + it('should load 5K data and expect 8.3 rowspan row height to increase/decrease when data changes from 500 to 5K back to 500', () => { + cy.get('[data-row=8] .slick-cell.l3.r4').should(($el) => + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * (500 - 8)) + ); + + cy.get('[data-test="add-5k-rows-btn"]').click(); + cy.get('[data-row=8] .slick-cell.l3.r4').should(($el) => + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * (5000 - 8)) + ); + + cy.get('[data-test="add-500-rows-btn"]').click(); + cy.get('[data-row=8] .slick-cell.l3.r4').should(($el) => + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * (500 - 8)) + ); + }); + }); + + describe('Basic Key Navigations', () => { + it('should scroll back to top', () => { + cy.get('[data-test="clearScrollTo"]').click(); + cy.get('[data-test="nbrows"]').type('0'); + cy.get('[data-test="scrollToBtn"]').click(); + }); + + it('should start at Task 6 on PolicyIndex column, then type "Arrow Up" key and expect active cell to become the green section in the middle', () => { + cy.get('[data-row=6] > .slick-cell.l2.r2').as('active_cell').click(); + cy.get('[data-row=6] > .slick-cell.l2.r2.active').should('have.length', 1); + cy.get('@active_cell').type('{uparrow}'); + cy.get('[data-row=3] > .slick-cell.l1.r2.active').should('have.length', 1); + }); + + it('should start at Task 6 on PricingPolicy column, then type "Arrow Left" key and expect active cell to become the green section in the middle', () => { + cy.get('[data-row=6] > .slick-cell.l2.r2').as('active_cell').click(); + cy.get('[data-row=6] > .slick-cell.l2.r2.active').should('have.length', 1); + cy.get('[data-test="toggleSpans"]').click(); + cy.get('@active_cell').type('{leftarrow}'); + cy.get('[data-row=3] .slick-cell.l1.r1.active').should('have.length', 1); + }); + + it('should start at Task 5 on Task 5 column, then type "Arrow Right" key 3x times and expect active cell to become the wide green section in the middle', () => { + cy.get('[data-row=5] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=5] > .slick-cell.l0.r0.active').should('have.length', 1); + cy.get('@active_cell').type('{rightarrow}{rightarrow}'); + cy.get('[data-row=5] .slick-cell.l2.r2.active').should('have.length', 1); + cy.get('[data-row=5] .slick-cell.l2.r2.active').type('{rightarrow}'); + cy.get('[data-row=3] .slick-cell.l3.r7.active').should(($el) => + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 3) + ); + }); + + it('should start at Task 2 on PricingPolicy column, then type "Arrow Left" key and expect active cell to become the dashed section beside Task 0-3 on RevenueGrowth column', () => { + cy.get('[data-row=2] > .slick-cell.l2.r2').as('active_cell').click(); + cy.get('[data-row=2] > .slick-cell.l2.r2.active').should('have.length', 1); + cy.get('@active_cell').type('{leftarrow}'); + cy.get('[data-row=0] > .slick-cell.l1.r1.active').should('have.length', 1); + }); + + it('should start at Task 2 on PricingPolicy column, then type "Arrow Left" key twice and expect active cell to become Task 2 cell', () => { + cy.get('[data-row=2] > .slick-cell.l2.r2').as('active_cell').click(); + cy.get('[data-row=2] > .slick-cell.l2.r2.active').should('have.length', 1); + cy.get('@active_cell').type('{leftarrow}{leftarrow}'); + cy.get('[data-row=2] > .slick-cell.l0.r0.active').contains('Task 2'); + cy.get('[data-row=2] > .slick-cell.l0.r0.active').should('have.length', 1); + }); + + it('should start at Task 2 on PricingPolicy column, then type "Home" key and expect active cell to become Task 2 cell', () => { + cy.get('[data-row=2] > .slick-cell.l2.r2').as('active_cell').click(); + cy.get('[data-row=2] .slick-cell.l2.r2.active').should('have.length', 1); + cy.get('@active_cell').type('{home}'); + cy.get('[data-row=2] .slick-cell.l0.r0.active').contains('Task 2'); + cy.get('[data-row=2] .slick-cell.l0.r0.active').should('have.length', 1); + }); + + it('should start at Task 2 on PricingPolicy column, then type "End" key and expect active cell to become Task 2 cell', () => { + cy.get('[data-row=2] > .slick-cell.l2.r2').as('active_cell').click(); + cy.get('[data-row=2] .slick-cell.l2.r2.active').should('have.length', 1); + cy.get('@active_cell').type('{end}'); + cy.get('[data-row=2] .slick-cell.l21.r21.active').should('have.length', 1); + }); + + it('should start at RevenueGrowth column on first dashed cell, then type "Ctrl+End" then "Ctrl+Home" keys and expect active cell to go to bottom/top of grid on same column', () => { + cy.get('[data-row=0] > .slick-cell.l2.r2').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l2.r2.active').should('have.length', 1); + cy.get('@active_cell').type('{ctrl}{end}', { release: false }); + cy.get('[data-row=499] > .slick-cell.l21.r21.active').should('have.length', 1); + cy.get('[data-row=499] > .slick-cell.l21.r21.active').type('{ctrl}{home}', { release: false }); + cy.get('[data-row=0] .slick-cell.l0.r0.active').should('have.length', 1); + cy.get('[data-row=0] .slick-cell.l1.r1').should(($el) => + expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 3) + ); + }); + + it('should start at first row on PolicyIndex column, then type "Ctrl+DownArrow" keys and expect active cell to become yellowish section', () => { + cy.get('[data-row=0] > .slick-cell.l3.r3').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l3.r3.active').should('have.length', 1); + cy.get('@active_cell').type('{ctrl}{downarrow}', { release: false }); + cy.get('[data-row=8] > .slick-cell.l3.r4.active').should('have.length', 1); + }); + + it('should start at first row on ExpenseControl column, then type "Ctrl+DownArrow" keys and expect active cell to become the cell just above the yellowish section', () => { + cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click(); + cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('have.length', 1); + cy.get('@active_cell').type('{ctrl}{downarrow}', { release: false }); + cy.get('[data-row=7] .slick-cell.l4.r4.active').should('have.length', 1); + }); + + it('should start at Task 13, type "End" key and expect active cell to be the last span cell', () => { + cy.get('[data-row=13] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=13] > .slick-cell.l0.r0.active').should('have.length', 1); + cy.get('@active_cell').type('{end}'); + cy.get('[data-row=13] > .slick-cell.l21.r21.active').should('have.length', 1); + }); + + it('should go to Task 13 last cell, type "Home" key and expect active cell to become Task 13', () => { + cy.get('[data-row=13] > .slick-cell.l21.r21').as('active_cell').click(); + cy.get('[data-row=13] > .slick-cell.l21.r21.active').should('have.length', 1); + cy.get('@active_cell').type('{home}'); + cy.get('[data-row=13] > .slick-cell.l0.r0.active').should('have.length', 1); + }); + + it('should start at Task 15, type "End" key and expect active cell to be on the last orange span cell', () => { + cy.get('[data-row=15] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=15] > .slick-cell.l0.r0.active').should('have.length', 1); + cy.get('@active_cell').type('{end}'); + cy.get('[data-row=15] > .slick-cell.l18.r21.active').should('have.length', 1); + cy.get('[data-row=15] > .slick-cell.l18.r21.active').type('{home}'); + }); + + it('should start at Task 17, type "End" key and expect active cell to be on the last orange span cell', () => { + cy.get('[data-row=17] > .slick-cell.l0.r0').as('active_cell').click(); + cy.get('[data-row=17] > .slick-cell.l0.r0.active').should('have.length', 1); + cy.get('@active_cell').type('{end}'); + cy.get('[data-row=15] > .slick-cell.l18.r21.active').should('have.length', 1); + cy.get('[data-row=15] > .slick-cell.l18.r21.active').type('{home}'); + }); + + it('should start at Task 5, type "ArrowRight" key 3x times and expect active cell to be at cell 3.3', () => { + cy.get('[data-row=15] > .slick-cell.l0.r0').type('{ctrl}{uparrow}'); + cy.get('[data-row=5] > .slick-cell.l0.r0').contains('Task 5').as('active_cell').click(); + cy.get('@active_cell').type('{rightarrow}{rightarrow}{rightarrow}'); + cy.get('[data-row=3] > .slick-cell.l3.r7.active').should('have.length', 1); + }); + + it('should start at Task 5, type "ArrowRight" key 4x times and expect active cell to be at cell 5.8', () => { + cy.get('[data-row=5] > .slick-cell.l0.r0').contains('Task 5').as('active_cell').click(); + cy.get('[data-row=5] > .slick-cell.l0.r0.active').should('have.length', 1); + cy.get('@active_cell').type('{rightarrow}{rightarrow}{rightarrow}{rightarrow}'); + cy.get('[data-row=5] > .slick-cell.l8.r8.active').should('have.length', 1); + }); + + it('should start at Task 5, type "ArrowRight" key 4x times, then "ArrowLeft" 4x times and be back at Task 5', () => { + cy.get('[data-row=5] > .slick-cell.l0.r0').contains('Task 5').as('active_cell').click(); + cy.get('[data-row=5] > .slick-cell.l0.r0.active').should('have.length', 1); + cy.get('@active_cell').type('{rightarrow}{rightarrow}{rightarrow}{rightarrow}{leftarrow}{leftarrow}{leftarrow}{leftarrow}'); + cy.get('[data-row=5] > .slick-cell.l0.r0.active').should('have.length', 1); + }); + + it('should start at Task 2 on Pricing Policy column and type "PageDown" key 3x times and be on Task 59 on same column', () => { + cy.get('[data-row=2] > .slick-cell.l2.r2').as('active_cell').click(); + cy.get('@active_cell').type('{pagedown}{pagedown}{pagedown}'); + cy.get('[data-row=59] > .slick-cell.l2.r2.active').should('have.length', 1); + }); + + it('should start at Task 59 on Pricing Policy column and type "PageUp" key 3x times and be back to Task 2 on same column', () => { + cy.get('[data-row=59] > .slick-cell.l2.r2').as('active_cell').click(); + cy.get('@active_cell').type('{pageup}{pageup}{pageup}'); + cy.get('[data-row=2] > .slick-cell.l2.r2.active').should('have.length', 1); + }); + + it('should start at Task 0 on Policy Index column and type "PageDown" key 2x times but expect active cell to stay on initial cell but still scroll down around Task 40', () => { + cy.get('[data-row=0] > .slick-cell.l3.r3').as('active_cell').click(); + cy.get('@active_cell').type('{pagedown}{pagedown}'); + cy.get('[data-row=0] > .slick-cell.l3.r3.active').should('have.length', 1); + cy.get('[data-row=40]').should('be.visible'); + }); + + it('should start at Task 1 on Excess Cash column and type "PageDown" key 4x times and be on Task 77 on same column', () => { + cy.get('[data-row=0] > .slick-cell.l3.r3.active').type('{ctrl}{uparrow}'); + cy.get('[data-row=1] > .slick-cell.l5.r5').as('active_cell').click(); + cy.get('@active_cell').type('{pagedown}{pagedown}{pagedown}{pagedown}'); + cy.get('[data-row=77] > .slick-cell.l5.r5.active').should('have.length', 1); + }); + + it('should start at Task 77 on Excess Cash column and type "PageDown" key 4x times and be on Task 105 on same column', () => { + cy.get('[data-row=77] > .slick-cell.l5.r5').as('active_cell').click(); + cy.get('@active_cell').type('{pagedown}'); + cy.get('[data-row=105] > .slick-cell.l5.r5.active').should('have.length', 1); + }); + + it('should start at Task 105 on Excess Cash column and type "PageUp" key once and be on Task 85 on same column', () => { + cy.get('[data-row=105] > .slick-cell.l5.r5').as('active_cell').click(); + cy.get('@active_cell').type('{pageup}'); + cy.get('[data-row=85] > .slick-cell.l5.r5.active').should('have.length', 1); + }); + + it('should start at Task 85 on Excess Cash column and type "PageUp" key once and be on Task 66 on same column', () => { + cy.get('[data-row=85] > .slick-cell.l5.r5').as('active_cell').click(); + cy.get('@active_cell').type('{pageup}'); + cy.get('[data-row=66] > .slick-cell.l5.r5.active').should('have.length', 1); + }); + + it('should start at Task 66 on Excess Cash column and type "PageUp" key 3x times and be on Task 9 on same column', () => { + cy.get('[data-row=66] > .slick-cell.l5.r5').as('active_cell').click(); + cy.get('@active_cell').type('{pageup}{pageup}{pageup}'); + cy.get('[data-row=9] > .slick-cell.l5.r5.active').should('have.length', 1).type('{pageup}'); + }); + + it('should start at Task 0 on Revenue Growth column and type "PageDown" key once and be on Task 88 on same column', () => { + cy.get('[data-row=0] > .slick-cell.l1.r1').as('active_cell').click(); + cy.get('@active_cell').type('{pagedown}'); + cy.get('[data-row=88] > .slick-cell.l1.r1.active').should('have.length', 1); + }); + + it('should start at Task 88 on Revenue Growth column and type "PageUp" key once and be on Task 8 on same column', () => { + cy.get('[data-row=88] > .slick-cell.l1.r1').as('active_cell').click(); + cy.get('@active_cell').type('{pageup}'); + cy.get('[data-row=8] > .slick-cell.l1.r1.active').should('have.length', 1); + }); + + it('should start at Task 9 on Excess Cash column and type "PageUp" key once and be on Task 0 on same column', () => { + cy.get('[data-row=9] > .slick-cell.l5.r5').as('active_cell').click(); + cy.get('@active_cell').type('{pageup}'); + cy.get('[data-row=0] > .slick-cell.l5.r5.active').should('have.length', 1); + }); + + it('should start at Task 9 on Excess Cash column and type "PageDown" key 26x times and be on last Task 499 on same column', () => { + cy.get('[data-row=9] > .slick-cell.l5.r5').as('active_cell').click(); + let command = ''; + for (let i = 1; i <= 26; i++) { + command += '{pagedown}'; + } + cy.get('@active_cell').type(command); + cy.get('[data-row=499] > .slick-cell.l5.r5.active').should('have.length', 1); + }); + }); +}); diff --git a/yarn.lock b/yarn.lock index c43b49154..8c971299a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1883,6 +1883,17 @@ ansi-escapes "^4.3.2" yoctocolors-cjs "^2.1.2" +"@inquirer/checkbox@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-4.0.6.tgz#e71401a7e1900332f17ed68c172a89fe20225f49" + integrity sha512-PgP35JfmGjHU0LSXOyRew0zHuA9N6OJwOlos1fZ20b7j8ISeAdib3L+n0jIxBtX958UeEpte6xhG/gxJ5iUqMw== + dependencies: + "@inquirer/core" "^10.1.4" + "@inquirer/figures" "^1.0.9" + "@inquirer/type" "^3.0.2" + ansi-escapes "^4.3.2" + yoctocolors-cjs "^2.1.2" + "@inquirer/confirm@3.1.22", "@inquirer/confirm@^3.1.22": version "3.1.22" resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.1.22.tgz#23990624c11f60c6f7a5b0558c7505c35076a037" @@ -1891,6 +1902,29 @@ "@inquirer/core" "^9.0.10" "@inquirer/type" "^1.5.2" +"@inquirer/confirm@^5.1.3": + version "5.1.3" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.3.tgz#c1ad57663f54758981811ccb86f823072ddf5c1a" + integrity sha512-fuF9laMmHoOgWapF9h9hv6opA5WvmGFHsTYGCmuFxcghIhEhb3dN0CdQR4BUMqa2H506NCj8cGX4jwMsE4t6dA== + dependencies: + "@inquirer/core" "^10.1.4" + "@inquirer/type" "^3.0.2" + +"@inquirer/core@^10.1.2", "@inquirer/core@^10.1.4": + version "10.1.4" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.1.4.tgz#02394e68d894021935caca0d10fc68fd4f3a3ead" + integrity sha512-5y4/PUJVnRb4bwWY67KLdebWOhOc7xj5IP2J80oWXa64mVag24rwQ1VAdnj7/eDY/odhguW0zQ1Mp1pj6fO/2w== + dependencies: + "@inquirer/figures" "^1.0.9" + "@inquirer/type" "^3.0.2" + ansi-escapes "^4.3.2" + cli-width "^4.1.0" + mute-stream "^2.0.0" + signal-exit "^4.1.0" + strip-ansi "^6.0.1" + wrap-ansi "^6.2.0" + yoctocolors-cjs "^2.1.2" + "@inquirer/core@^9.0.10": version "9.0.10" resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-9.0.10.tgz#4270191e2ad3bea6223530a093dd9479bcbc7dd0" @@ -1919,6 +1953,15 @@ "@inquirer/type" "^1.5.2" external-editor "^3.1.0" +"@inquirer/editor@^4.2.3": + version "4.2.3" + resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-4.2.3.tgz#0858adcd07d9607b0614778eaa5ce8a83871c367" + integrity sha512-S9KnIOJuTZpb9upeRSBBhoDZv7aSV3pG9TECrBj0f+ZsFwccz886hzKBrChGrXMJwd4NKY+pOA9Vy72uqnd6Eg== + dependencies: + "@inquirer/core" "^10.1.4" + "@inquirer/type" "^3.0.2" + external-editor "^3.1.0" + "@inquirer/expand@^2.1.22": version "2.1.22" resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-2.1.22.tgz#7593e93a516a49434629c41f3738479c8234d2df" @@ -1928,11 +1971,25 @@ "@inquirer/type" "^1.5.2" yoctocolors-cjs "^2.1.2" -"@inquirer/figures@^1.0.3", "@inquirer/figures@^1.0.5": +"@inquirer/expand@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.6.tgz#8676e6049c6114fb306df23358375bd84fa1c92c" + integrity sha512-TRTfi1mv1GeIZGyi9PQmvAaH65ZlG4/FACq6wSzs7Vvf1z5dnNWsAAXBjWMHt76l+1hUY8teIqJFrWBk5N6gsg== + dependencies: + "@inquirer/core" "^10.1.4" + "@inquirer/type" "^3.0.2" + yoctocolors-cjs "^2.1.2" + +"@inquirer/figures@^1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.5.tgz#57f9a996d64d3e3345d2a3ca04d36912e94f8790" integrity sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA== +"@inquirer/figures@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.9.tgz#9d8128f8274cde4ca009ca8547337cab3f37a4a3" + integrity sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ== + "@inquirer/input@^2.2.9": version "2.2.9" resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-2.2.9.tgz#08fdf9a48e4f6fc64c2d508b9d10afac843f9bd8" @@ -1941,6 +1998,14 @@ "@inquirer/core" "^9.0.10" "@inquirer/type" "^1.5.2" +"@inquirer/input@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-4.1.3.tgz#fa0ea9a392b2ec4ddd763c504d0b0c8839a48fe2" + integrity sha512-zeo++6f7hxaEe7OjtMzdGZPHiawsfmCZxWB9X1NpmYgbeoyerIbWemvlBxxl+sQIlHC0WuSAG19ibMq3gbhaqQ== + dependencies: + "@inquirer/core" "^10.1.4" + "@inquirer/type" "^3.0.2" + "@inquirer/number@^1.0.10": version "1.0.10" resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-1.0.10.tgz#ac2b440ca57b5de5a231e4898c12d4453683c055" @@ -1949,6 +2014,14 @@ "@inquirer/core" "^9.0.10" "@inquirer/type" "^1.5.2" +"@inquirer/number@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.6.tgz#19bba46725df194bdd907762cf432a37e053b300" + integrity sha512-xO07lftUHk1rs1gR0KbqB+LJPhkUNkyzV/KhH+937hdkMazmAYHLm1OIrNKpPelppeV1FgWrgFDjdUD8mM+XUg== + dependencies: + "@inquirer/core" "^10.1.4" + "@inquirer/type" "^3.0.2" + "@inquirer/password@^2.1.22": version "2.1.22" resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-2.1.22.tgz#ec7ee5709923cf285b3e0ae53eed4fdc3c05b422" @@ -1958,6 +2031,15 @@ "@inquirer/type" "^1.5.2" ansi-escapes "^4.3.2" +"@inquirer/password@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.6.tgz#4bbee12fe7cd1d37435401098c296ddc4586861b" + integrity sha512-QLF0HmMpHZPPMp10WGXh6F+ZPvzWE7LX6rNoccdktv/Rov0B+0f+eyXkAcgqy5cH9V+WSpbLxu2lo3ysEVK91w== + dependencies: + "@inquirer/core" "^10.1.4" + "@inquirer/type" "^3.0.2" + ansi-escapes "^4.3.2" + "@inquirer/prompts@5.3.8": version "5.3.8" resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-5.3.8.tgz#f394050d95076c2f1b046be324f06f619b257c3e" @@ -1974,6 +2056,22 @@ "@inquirer/search" "^1.0.7" "@inquirer/select" "^2.4.7" +"@inquirer/prompts@^7.2.1": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.2.3.tgz#8a0d7cb5310d429bf815d25bbff108375fc6315b" + integrity sha512-hzfnm3uOoDySDXfDNOm9usOuYIaQvTgKp/13l1uJoe6UNY+Zpcn2RYt0jXz3yA+yemGHvDOxVzqWl3S5sQq53Q== + dependencies: + "@inquirer/checkbox" "^4.0.6" + "@inquirer/confirm" "^5.1.3" + "@inquirer/editor" "^4.2.3" + "@inquirer/expand" "^4.0.6" + "@inquirer/input" "^4.1.3" + "@inquirer/number" "^3.0.6" + "@inquirer/password" "^4.0.6" + "@inquirer/rawlist" "^4.0.6" + "@inquirer/search" "^3.0.6" + "@inquirer/select" "^4.0.6" + "@inquirer/rawlist@^2.2.4": version "2.2.4" resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-2.2.4.tgz#73d5d4fafa2ca012e6cfb9eb1d8ddf33bab2dde0" @@ -1983,6 +2081,15 @@ "@inquirer/type" "^1.5.2" yoctocolors-cjs "^2.1.2" +"@inquirer/rawlist@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-4.0.6.tgz#b55d5828d850f07bc6792bbce3b2a963e33b3ef5" + integrity sha512-QoE4s1SsIPx27FO4L1b1mUjVcoHm1pWE/oCmm4z/Hl+V1Aw5IXl8FYYzGmfXaBT0l/sWr49XmNSiq7kg3Kd/Lg== + dependencies: + "@inquirer/core" "^10.1.4" + "@inquirer/type" "^3.0.2" + yoctocolors-cjs "^2.1.2" + "@inquirer/search@^1.0.7": version "1.0.7" resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-1.0.7.tgz#72ab9ccfb57f05dd81a8b2df26214588e048be18" @@ -1993,6 +2100,16 @@ "@inquirer/type" "^1.5.2" yoctocolors-cjs "^2.1.2" +"@inquirer/search@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.0.6.tgz#5537e3f46b7d31ab65ca22b831cf546f88db1d5b" + integrity sha512-eFZ2hiAq0bZcFPuFFBmZEtXU1EarHLigE+ENCtpO+37NHCl4+Yokq1P/d09kUblObaikwfo97w+0FtG/EXl5Ng== + dependencies: + "@inquirer/core" "^10.1.4" + "@inquirer/figures" "^1.0.9" + "@inquirer/type" "^3.0.2" + yoctocolors-cjs "^2.1.2" + "@inquirer/select@^2.4.7": version "2.4.7" resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-2.4.7.tgz#6a23742b4f76d228186dfd42571d973def378ffa" @@ -2004,6 +2121,17 @@ ansi-escapes "^4.3.2" yoctocolors-cjs "^2.1.2" +"@inquirer/select@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.0.6.tgz#3062c02c82f7bbe238972672def6d8394732bb2b" + integrity sha512-yANzIiNZ8fhMm4NORm+a74+KFYHmf7BZphSOBovIzYPVLquseTGEkU5l2UTnBOf5k0VLmTgPighNDLE9QtbViQ== + dependencies: + "@inquirer/core" "^10.1.4" + "@inquirer/figures" "^1.0.9" + "@inquirer/type" "^3.0.2" + ansi-escapes "^4.3.2" + yoctocolors-cjs "^2.1.2" + "@inquirer/type@^1.5.1", "@inquirer/type@^1.5.2": version "1.5.2" resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.5.2.tgz#15f5e4a4dae02c4203650cb07c8a000cdd423939" @@ -2011,6 +2139,11 @@ dependencies: mute-stream "^1.0.0" +"@inquirer/type@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.2.tgz#baff9f8d70947181deb36772cd9a5b6876d3e60c" + integrity sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -2497,100 +2630,99 @@ proc-log "^4.0.0" which "^4.0.0" -"@octokit/auth-token@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7" - integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== - -"@octokit/core@^5.0.2": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.2.0.tgz#ddbeaefc6b44a39834e1bb2e58a49a117672a7ea" - integrity sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg== - dependencies: - "@octokit/auth-token" "^4.0.0" - "@octokit/graphql" "^7.1.0" - "@octokit/request" "^8.3.1" - "@octokit/request-error" "^5.1.0" - "@octokit/types" "^13.0.0" - before-after-hook "^2.2.0" - universal-user-agent "^6.0.0" - -"@octokit/endpoint@^9.0.1": - version "9.0.5" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.5.tgz#e6c0ee684e307614c02fc6ac12274c50da465c44" - integrity sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw== - dependencies: - "@octokit/types" "^13.1.0" - universal-user-agent "^6.0.0" - -"@octokit/graphql@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-7.1.0.tgz#9bc1c5de92f026648131f04101cab949eeffe4e0" - integrity sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ== - dependencies: - "@octokit/request" "^8.3.0" - "@octokit/types" "^13.0.0" - universal-user-agent "^6.0.0" - -"@octokit/openapi-types@^22.2.0": - version "22.2.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-22.2.0.tgz#75aa7dcd440821d99def6a60b5f014207ae4968e" - integrity sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg== - -"@octokit/plugin-paginate-rest@11.3.1": - version "11.3.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.1.tgz#fe92d04b49f134165d6fbb716e765c2f313ad364" - integrity sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g== - dependencies: - "@octokit/types" "^13.5.0" - -"@octokit/plugin-request-log@^4.0.0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz#98a3ca96e0b107380664708111864cb96551f958" - integrity sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA== +"@octokit/auth-token@^5.0.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-5.1.1.tgz#3bbfe905111332a17f72d80bd0b51a3e2fa2cf07" + integrity sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA== + +"@octokit/core@^6.1.2": + version "6.1.3" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-6.1.3.tgz#280d3bb66c702297baac0a202219dd66611286e4" + integrity sha512-z+j7DixNnfpdToYsOutStDgeRzJSMnbj8T1C/oQjB6Aa+kRfNjs/Fn7W6c8bmlt6mfy3FkgeKBRnDjxQow5dow== + dependencies: + "@octokit/auth-token" "^5.0.0" + "@octokit/graphql" "^8.1.2" + "@octokit/request" "^9.1.4" + "@octokit/request-error" "^6.1.6" + "@octokit/types" "^13.6.2" + before-after-hook "^3.0.2" + universal-user-agent "^7.0.0" + +"@octokit/endpoint@^10.0.0": + version "10.1.2" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-10.1.2.tgz#d38e727e2a64287114fdaa1eb9cd7c81c09460df" + integrity sha512-XybpFv9Ms4hX5OCHMZqyODYqGTZ3H6K6Vva+M9LR7ib/xr1y1ZnlChYv9H680y77Vd/i/k+thXApeRASBQkzhA== + dependencies: + "@octokit/types" "^13.6.2" + universal-user-agent "^7.0.2" + +"@octokit/graphql@^8.1.2": + version "8.1.2" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-8.1.2.tgz#98b9072b22e0471b782d52ed0da08e2b2de52b17" + integrity sha512-bdlj/CJVjpaz06NBpfHhp4kGJaRZfz7AzC+6EwUImRtrwIw8dIgJ63Xg0OzV9pRn3rIzrt5c2sa++BL0JJ8GLw== + dependencies: + "@octokit/request" "^9.1.4" + "@octokit/types" "^13.6.2" + universal-user-agent "^7.0.0" + +"@octokit/openapi-types@^23.0.1": + version "23.0.1" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-23.0.1.tgz#3721646ecd36b596ddb12650e0e89d3ebb2dd50e" + integrity sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g== + +"@octokit/plugin-paginate-rest@^11.0.0": + version "11.4.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.0.tgz#a9c3347113d793e48a014f0aa549eada00de7c9a" + integrity sha512-ttpGck5AYWkwMkMazNCZMqxKqIq1fJBNxBfsFwwfyYKTf914jKkLF0POMS3YkPBwp5g1c2Y4L79gDz01GhSr1g== + dependencies: + "@octokit/types" "^13.7.0" + +"@octokit/plugin-request-log@^5.3.1": + version "5.3.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz#ccb75d9705de769b2aa82bcd105cc96eb0c00f69" + integrity sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw== -"@octokit/plugin-rest-endpoint-methods@13.2.2": - version "13.2.2" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz#af8e5dd2cddfea576f92ffaf9cb84659f302a638" - integrity sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA== +"@octokit/plugin-rest-endpoint-methods@^13.0.0": + version "13.3.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.0.tgz#ee18b9d6364bbae1d86e960d5576b555b41d2079" + integrity sha512-LUm44shlmkp/6VC+qQgHl3W5vzUP99ZM54zH6BuqkJK4DqfFLhegANd+fM4YRLapTvPm4049iG7F3haANKMYvQ== dependencies: - "@octokit/types" "^13.5.0" + "@octokit/types" "^13.7.0" -"@octokit/request-error@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.1.0.tgz#ee4138538d08c81a60be3f320cd71063064a3b30" - integrity sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q== +"@octokit/request-error@^6.0.1", "@octokit/request-error@^6.1.6": + version "6.1.6" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-6.1.6.tgz#5f42c7894e7c3ab47c63aa3241f78cee8a826644" + integrity sha512-pqnVKYo/at0NuOjinrgcQYpEbv4snvP3bKMRqHaD9kIsk9u1LCpb2smHZi8/qJfgeNqLo5hNW4Z7FezNdEo0xg== dependencies: - "@octokit/types" "^13.1.0" - deprecation "^2.0.0" - once "^1.4.0" + "@octokit/types" "^13.6.2" -"@octokit/request@^8.3.0", "@octokit/request@^8.3.1": - version "8.4.0" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.4.0.tgz#7f4b7b1daa3d1f48c0977ad8fffa2c18adef8974" - integrity sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw== +"@octokit/request@^9.1.4": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-9.2.0.tgz#21aa1e72ff645f5b99ccf4a590cc33c4578bb356" + integrity sha512-kXLfcxhC4ozCnAXy2ff+cSxpcF0A1UqxjvYMqNuPIeOAzJbVWQ+dy5G2fTylofB/gTbObT8O6JORab+5XtA1Kw== dependencies: - "@octokit/endpoint" "^9.0.1" - "@octokit/request-error" "^5.1.0" - "@octokit/types" "^13.1.0" - universal-user-agent "^6.0.0" + "@octokit/endpoint" "^10.0.0" + "@octokit/request-error" "^6.0.1" + "@octokit/types" "^13.6.2" + fast-content-type-parse "^2.0.0" + universal-user-agent "^7.0.2" -"@octokit/rest@20.1.1": - version "20.1.1" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-20.1.1.tgz#ec775864f53fb42037a954b9a40d4f5275b3dc95" - integrity sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw== +"@octokit/rest@21.0.2": + version "21.0.2" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-21.0.2.tgz#9b767dbc1098daea8310fd8b76bf7a97215d5972" + integrity sha512-+CiLisCoyWmYicH25y1cDfCrv41kRSvTq6pPWtRroRJzhsCZWZyCqGyI8foJT5LmScADSwRAnr/xo+eewL04wQ== dependencies: - "@octokit/core" "^5.0.2" - "@octokit/plugin-paginate-rest" "11.3.1" - "@octokit/plugin-request-log" "^4.0.0" - "@octokit/plugin-rest-endpoint-methods" "13.2.2" + "@octokit/core" "^6.1.2" + "@octokit/plugin-paginate-rest" "^11.0.0" + "@octokit/plugin-request-log" "^5.3.1" + "@octokit/plugin-rest-endpoint-methods" "^13.0.0" -"@octokit/types@^13.0.0", "@octokit/types@^13.1.0", "@octokit/types@^13.5.0": - version "13.5.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.5.0.tgz#4796e56b7b267ebc7c921dcec262b3d5bfb18883" - integrity sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ== +"@octokit/types@^13.6.2", "@octokit/types@^13.7.0": + version "13.7.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.7.0.tgz#22d0e26a8c9f53599bfb907213d8ccde547f36aa" + integrity sha512-BXfRP+3P3IN6fd4uF3SniaHKOO4UXWBfkdR3vA8mIvaoO/wLjGN5qivUtW0QRitBHHMcfC41SLhNVYIZZE+wkA== dependencies: - "@octokit/openapi-types" "^22.2.0" + "@octokit/openapi-types" "^23.0.1" "@parcel/watcher-android-arm64@2.4.1": version "2.4.1" @@ -2706,10 +2838,10 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== -"@release-it/conventional-changelog@^9.0.4": - version "9.0.4" - resolved "https://registry.yarnpkg.com/@release-it/conventional-changelog/-/conventional-changelog-9.0.4.tgz#d9b19b77f3ce1cd4872938cbc4ca32013b7ac87f" - integrity sha512-eSZVATX2qiyxzpXdIVNczxTGR+uD4lG/ZEfDDYBJ8vKIj6fKp+eYicIS8Ff/eL3bA9XiQTmllKqxPRzmz9d45w== +"@release-it/conventional-changelog@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@release-it/conventional-changelog/-/conventional-changelog-10.0.0.tgz#25a9b4785d59ea1c2dce9acafc3c0cc86552826f" + integrity sha512-49qf9phGmPUIGpY2kwfgehs9en1znbPv2zdNn1WMLAH9DtHUh4m6KNSB+mLFGAMUhv24JhsA8ruYRYgluc2UJw== dependencies: concat-stream "^2.0.0" conventional-changelog "^6.0.0" @@ -2923,6 +3055,11 @@ "@angular-devkit/schematics" "18.2.12" jsonc-parser "3.3.1" +"@sec-ant/readable-stream@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz#60de891bb126abfdc5410fdc6166aca065f10a0c" + integrity sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg== + "@sigstore/bundle@^2.3.2": version "2.3.2" resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-2.3.2.tgz#ad4dbb95d665405fd4a7a02c8a073dbd01e4e95e" @@ -2979,6 +3116,11 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz#719df7fb41766bc143369eaa0dd56d8dc87c9958" integrity sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg== +"@sindresorhus/merge-streams@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz#abb11d99aeb6d27f1b563c38147a72d50058e339" + integrity sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ== + "@sinonjs/commons@^3.0.0": version "3.0.1" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" @@ -2993,21 +3135,21 @@ dependencies: "@sinonjs/commons" "^3.0.0" -"@slickgrid-universal/binding@~5.10.2": - version "5.10.2" - resolved "https://registry.yarnpkg.com/@slickgrid-universal/binding/-/binding-5.10.2.tgz#3f5515c2445bbc891fa5bde61b08ce62591d48a4" - integrity sha512-Hfn6ooFE28W9JOCLAOPDqlnrBJ1bfIkkXmV04bToCZk3SyKhUr6uYkmJMaMzs3S4U3a2aEe7srILPpLjfOmfmw== +"@slickgrid-universal/binding@~5.12.0": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@slickgrid-universal/binding/-/binding-5.12.0.tgz#57e0157e1e8debf85a53f660c82411752d055a6f" + integrity sha512-A4RNtlSkpAg7+lmtrUF0TVYM+Li/p9WxX7IHC8McqCA/4T412Twit+/cNeohTuje8P/zo5cpHpQlbciuh9HsbA== -"@slickgrid-universal/common@~5.11.0": - version "5.11.0" - resolved "https://registry.yarnpkg.com/@slickgrid-universal/common/-/common-5.11.0.tgz#9708e732b1b8080ac7feb49f6eaacd28dcd0b77b" - integrity sha512-+lNvysOFL/CD++m47KcixYlkRG4ywgwwAqIW7mFWHk4m5ZikQst3i8PPPK2GZo+U4r370Jb/F768dtvr9nALHQ== +"@slickgrid-universal/common@~5.12.0": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@slickgrid-universal/common/-/common-5.12.0.tgz#77fe6864168c1f7022af0f84404134379e430f7b" + integrity sha512-u3DX6sIkLeqaKotyaRM9gVGqKEP2uum0vjvblOH78vy8wqyST4DK3a4m5p9CgHypuRBnMnNsd6NdmjuKjsj74A== dependencies: "@excel-builder-vanilla/types" "^3.0.14" "@formkit/tempo" "^0.1.2" - "@slickgrid-universal/binding" "~5.10.2" - "@slickgrid-universal/event-pub-sub" "~5.10.2" - "@slickgrid-universal/utils" "~5.10.2" + "@slickgrid-universal/binding" "~5.12.0" + "@slickgrid-universal/event-pub-sub" "~5.12.0" + "@slickgrid-universal/utils" "~5.12.0" "@types/sortablejs" "^1.15.8" "@types/trusted-types" "^2.0.7" autocompleter "^9.3.2" @@ -3017,108 +3159,108 @@ un-flatten-tree "^2.0.12" vanilla-calendar-pro "^2.9.10" -"@slickgrid-universal/composite-editor-component@~5.11.0": - version "5.11.0" - resolved "https://registry.yarnpkg.com/@slickgrid-universal/composite-editor-component/-/composite-editor-component-5.11.0.tgz#0eedc2216bc3b7e26284fa759f41107512fd5a6e" - integrity sha512-zI5cXIqnXupAxzfh7ZQJjXmJVUwYLk21lNrskau/HN7XSYKvnvLPyGYMWH1CGWmwMCKyGZ+yrhBzaqhzmXa2ew== +"@slickgrid-universal/composite-editor-component@~5.12.0": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@slickgrid-universal/composite-editor-component/-/composite-editor-component-5.12.0.tgz#0380287a15f316068446c350cb29a8db682036bf" + integrity sha512-IocfF5j2YrOm5bA4y3/XC0ZFXNL/zU94zvJihaFg/p84/7nnA0X5I/V+TKY4Ff8OaArkJUtkwVbfhbr8hBZ+Dg== dependencies: - "@slickgrid-universal/binding" "~5.10.2" - "@slickgrid-universal/common" "~5.11.0" - "@slickgrid-universal/utils" "~5.10.2" + "@slickgrid-universal/binding" "~5.12.0" + "@slickgrid-universal/common" "~5.12.0" + "@slickgrid-universal/utils" "~5.12.0" -"@slickgrid-universal/custom-footer-component@~5.11.0": - version "5.11.0" - resolved "https://registry.yarnpkg.com/@slickgrid-universal/custom-footer-component/-/custom-footer-component-5.11.0.tgz#3bb36816e040532ef2e53bb97bc13b41eaf889cf" - integrity sha512-mV5SQWklV2rTJi5RonGe8cGjtVAyP/YulxFO1TJe71DTDh8lR1Z+3QM7/5UKuamPxse+a0wntizErVxCwZdPBw== +"@slickgrid-universal/custom-footer-component@~5.12.0": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@slickgrid-universal/custom-footer-component/-/custom-footer-component-5.12.0.tgz#63be5edd19df522988edc9c8ae828746aeb247ae" + integrity sha512-V1yzQnaezqtHivuGd7UlLcyY7lhZ3oS3ArAZAWABJosh+HfhG3ttzn6qAJUrDg5oHzGuLq/WwCNRyfxy4yg0uQ== dependencies: "@formkit/tempo" "^0.1.2" - "@slickgrid-universal/binding" "~5.10.2" - "@slickgrid-universal/common" "~5.11.0" + "@slickgrid-universal/binding" "~5.12.0" + "@slickgrid-universal/common" "~5.12.0" -"@slickgrid-universal/custom-tooltip-plugin@~5.11.0": - version "5.11.0" - resolved "https://registry.yarnpkg.com/@slickgrid-universal/custom-tooltip-plugin/-/custom-tooltip-plugin-5.11.0.tgz#7f96237ca627ac051c5504e0194481f65c41eeda" - integrity sha512-GG1t96BILm/0bh70xWn/ocZ+EmnqVIY1Kf8ZmA9YVLfGBw5mleYDxe4CE/L5WvyguFIAhffI4q2rcRBE16/pRA== +"@slickgrid-universal/custom-tooltip-plugin@~5.12.0": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@slickgrid-universal/custom-tooltip-plugin/-/custom-tooltip-plugin-5.12.0.tgz#5e0c8d8b4d3a9d676a01a745d56a597bc88b37cd" + integrity sha512-p8CONc2NwCpuPJj4EPkT1hIu0aU0fdyj1qvTQSXH658r1IOBQ2cjUlHQ3S4ymFPYF5RymNlYoaHsgHWwDSzmuA== dependencies: - "@slickgrid-universal/common" "~5.11.0" - "@slickgrid-universal/utils" "~5.10.2" + "@slickgrid-universal/common" "~5.12.0" + "@slickgrid-universal/utils" "~5.12.0" -"@slickgrid-universal/empty-warning-component@~5.11.0": - version "5.11.0" - resolved "https://registry.yarnpkg.com/@slickgrid-universal/empty-warning-component/-/empty-warning-component-5.11.0.tgz#18a8649d3c7e9b06897291304ec9876114b12dc9" - integrity sha512-3SU8zk8sC9Oim2RlLwYCyK1QpVkAV7MjPtOXTn8lFvFJCRclJE9zgmQ70/Ptb7myMbg3CZSJCWX6YU2QnG7yYA== +"@slickgrid-universal/empty-warning-component@~5.12.0": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@slickgrid-universal/empty-warning-component/-/empty-warning-component-5.12.0.tgz#4e4c700e8b5dfd1192b9e9f1d3b5d4863359a0dc" + integrity sha512-n7fUCeb4IEaSInphvrhf028DcdRdMdPDxEjDvr+CyQMZp1xQAePvAkt7I/dqVtstJtHToavk1ZFwrDc/pnpXVA== dependencies: - "@slickgrid-universal/common" "~5.11.0" + "@slickgrid-universal/common" "~5.12.0" -"@slickgrid-universal/event-pub-sub@~5.10.2": - version "5.10.2" - resolved "https://registry.yarnpkg.com/@slickgrid-universal/event-pub-sub/-/event-pub-sub-5.10.2.tgz#d5a773d719ce64473ce3811e43833878d38a0ffe" - integrity sha512-3l0rAZEf2CX2ApaXv4VCFVlExJSTu6VjDiWsNuZ9dh7+auWtiihsX4QZS8zskQIqEVrHtuJAlV8fq/l/XcwS+g== +"@slickgrid-universal/event-pub-sub@~5.12.0": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@slickgrid-universal/event-pub-sub/-/event-pub-sub-5.12.0.tgz#ec206ec19b5a73a6a9549fd432c23651c03281bc" + integrity sha512-7EuBvsYykHRP12wiquzqW0LMv5ZyuVkQEzhMVE1pu0gp4K6Eh+Hdl7Kw5hLEr29ERfvUCN/zBlpDVIx6OlZ9PQ== dependencies: - "@slickgrid-universal/utils" "~5.10.2" + "@slickgrid-universal/utils" "~5.12.0" -"@slickgrid-universal/excel-export@~5.11.0": - version "5.11.0" - resolved "https://registry.yarnpkg.com/@slickgrid-universal/excel-export/-/excel-export-5.11.0.tgz#7ba36943a9c5b9d51d4aad74a89880f23813c768" - integrity sha512-iIGepwYYrnZ0mu1ZAZugnUUNByicdlQ4ojdd9ddvbuAjYG4p2JdjqqIxL4eQq3Dd0SJbKzEVaiXKpb/rXOXqZw== +"@slickgrid-universal/excel-export@~5.12.0": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@slickgrid-universal/excel-export/-/excel-export-5.12.0.tgz#c6c16dbdc75d999df23e3a6e0243a233e591dfe4" + integrity sha512-yBxXr1QRqA6OGCVQ62/R8lXpgXQibcDh41jFlnV96k/dCinR5B/R1l4fX11Y+MhNn379tmBrfXFzMYCt4bPEHA== dependencies: - "@slickgrid-universal/common" "~5.11.0" - "@slickgrid-universal/utils" "~5.10.2" + "@slickgrid-universal/common" "~5.12.0" + "@slickgrid-universal/utils" "~5.12.0" excel-builder-vanilla "^3.0.14" -"@slickgrid-universal/graphql@~5.11.0": - version "5.11.0" - resolved "https://registry.yarnpkg.com/@slickgrid-universal/graphql/-/graphql-5.11.0.tgz#543cf5c26eb5b86ef9dcc85c8433b64fa8260a1c" - integrity sha512-Fd8Xy5WMlFvwVHUXlbLrtUTd4ZOOlw+bCBZ3x+pi39ZMVxztGowBn1ayi7iUfaFMYEiCNlsXIaoYx+LqfTDAjw== +"@slickgrid-universal/graphql@~5.12.0": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@slickgrid-universal/graphql/-/graphql-5.12.0.tgz#e47472b9d4bc4ee75fc055b93a901a12471fddb4" + integrity sha512-S2JzVBjluAJJQIt0+ZneaMBDFgS3TtTkiclVfxGH7DKrFm5OHaNxbN1o6UIxJS1ksdTh1xRMsRuaZZS9aHi7dQ== dependencies: - "@slickgrid-universal/common" "~5.11.0" - "@slickgrid-universal/utils" "~5.10.2" + "@slickgrid-universal/common" "~5.12.0" + "@slickgrid-universal/utils" "~5.12.0" -"@slickgrid-universal/odata@~5.11.0": - version "5.11.0" - resolved "https://registry.yarnpkg.com/@slickgrid-universal/odata/-/odata-5.11.0.tgz#d385627679596a8adff071269d3942d5a2f1cf84" - integrity sha512-P3abiZfIP6aNTRKDgnSEqwa167YpBKSZSEgMct+oU4haP+Xc9bX9mJxZlP0sog/ClOCwVXdHQHzGvRlQhZPyug== +"@slickgrid-universal/odata@~5.12.0": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@slickgrid-universal/odata/-/odata-5.12.0.tgz#0630d0699f4900464dfb6ecc94ad18ffa6af0373" + integrity sha512-wI3AW4N/yRRPQEmpay5qiOL9nFH7eY9wHGriCHz8UHnTHR4xz+EGxZvjWqGLW2osvSMOvPkoeW/k/uEcgEuD6A== dependencies: - "@slickgrid-universal/common" "~5.11.0" - "@slickgrid-universal/utils" "~5.10.2" + "@slickgrid-universal/common" "~5.12.0" + "@slickgrid-universal/utils" "~5.12.0" -"@slickgrid-universal/pagination-component@~5.11.0": - version "5.11.0" - resolved "https://registry.yarnpkg.com/@slickgrid-universal/pagination-component/-/pagination-component-5.11.0.tgz#93cd547dd0ba81ffdcc5b33d2c868a3738f1ff53" - integrity sha512-3Eq6aMcezmCVshveMW00wjDmLcK2hxEcG7qEjz2swFUyk8dy/RQM6bkScUl3670xfqwMcfTVKXjOydKC/OvdeA== +"@slickgrid-universal/pagination-component@~5.12.0": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@slickgrid-universal/pagination-component/-/pagination-component-5.12.0.tgz#37332a8c076f814c7d88789a9c3a35c062d3466e" + integrity sha512-B2walKcTMsdtxcjctazkpuUUmKBXnwlJ2azsoJzKRREK02NVdktqK2051/0ZDebD6CCABoaC6U6fMmoa4lDk2A== dependencies: - "@slickgrid-universal/binding" "~5.10.2" - "@slickgrid-universal/common" "~5.11.0" + "@slickgrid-universal/binding" "~5.12.0" + "@slickgrid-universal/common" "~5.12.0" -"@slickgrid-universal/row-detail-view-plugin@~5.11.0": - version "5.11.0" - resolved "https://registry.yarnpkg.com/@slickgrid-universal/row-detail-view-plugin/-/row-detail-view-plugin-5.11.0.tgz#2df353d011cca71a39a6436d62db055b5f5323ab" - integrity sha512-v58lW77QphQiTTKAyZDecCMIILO8vqgTh6rwAfN2u7+jcSitUUbi7c/vr9c9Yboa2FLkudgYcEbWBmuhyAeNpw== +"@slickgrid-universal/row-detail-view-plugin@~5.12.0": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@slickgrid-universal/row-detail-view-plugin/-/row-detail-view-plugin-5.12.0.tgz#48554a82b197f2e003f8ef43abb184015fbc85d4" + integrity sha512-wkkBcXxO6wv39fBTzg2q6oXaxNRinS1AAI0gM76ijsWQT8IDD1FuqmF1m8P7UQiraCU7A9C2rG6blDif6zF7gg== dependencies: - "@slickgrid-universal/common" "~5.11.0" - "@slickgrid-universal/utils" "~5.10.2" + "@slickgrid-universal/common" "~5.12.0" + "@slickgrid-universal/utils" "~5.12.0" -"@slickgrid-universal/rxjs-observable@~5.11.0": - version "5.11.0" - resolved "https://registry.yarnpkg.com/@slickgrid-universal/rxjs-observable/-/rxjs-observable-5.11.0.tgz#7ae4166c7f840e5da24e3c5e1d02d198ae5ea508" - integrity sha512-HhuVrVcaH5abpYNmmBa3h8Z3RqyhhKzP/cUDzZAy3AoRB14bnC3KODr07VOJIg/LCajLZCx1e4t/GcGW1fS1Kg== +"@slickgrid-universal/rxjs-observable@~5.12.0": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@slickgrid-universal/rxjs-observable/-/rxjs-observable-5.12.0.tgz#11bde3f6c7a1f067ac5aea5417b925f65efd0e4c" + integrity sha512-bulgCBGtxcF1cYSYI9qqMQAsMU/1YWeiltxi+a7jMTYSzZAb7NA39poLDs1PVVncvFuVvidoaGEu8s2mRn1izQ== dependencies: - "@slickgrid-universal/common" "~5.11.0" + "@slickgrid-universal/common" "~5.12.0" rxjs "^7.8.1" -"@slickgrid-universal/text-export@~5.11.0": - version "5.11.0" - resolved "https://registry.yarnpkg.com/@slickgrid-universal/text-export/-/text-export-5.11.0.tgz#185fabb6c96ee3ecdbee55b6b051772818cc3aa6" - integrity sha512-KprafJz0+adqYpy3Wz0QyDJQXkKcjulfHMZsEMy/VVr8jauLsZzzXeDzUSQNos78SZby/XuC7GREzhk6GRf1IQ== +"@slickgrid-universal/text-export@~5.12.0": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@slickgrid-universal/text-export/-/text-export-5.12.0.tgz#14f8b0370b12f729f749510d2c4f26e540e1ee8c" + integrity sha512-z4hoNPYsDvW6hjsF73FRgXdnDP2e1PxLwa41SfJrYhdOkz+25wH4q6qWjtoMDqOwfqwGEUOKK/QREYecCVZHEg== dependencies: - "@slickgrid-universal/common" "~5.11.0" - "@slickgrid-universal/utils" "~5.10.2" + "@slickgrid-universal/common" "~5.12.0" + "@slickgrid-universal/utils" "~5.12.0" text-encoding-utf-8 "^1.0.2" -"@slickgrid-universal/utils@~5.10.2": - version "5.10.2" - resolved "https://registry.yarnpkg.com/@slickgrid-universal/utils/-/utils-5.10.2.tgz#2a2a30bc94d306bb47af82a310900ed74f98ff88" - integrity sha512-cijV2/u3xKnfdUinaJeQNcoZuLy+9J4EgYSfUpNX22kanp948uKOICQxVrlb7Lj82Ki0U+vtuQ+fS59KQD3YOQ== +"@slickgrid-universal/utils@~5.12.0": + version "5.12.0" + resolved "https://registry.yarnpkg.com/@slickgrid-universal/utils/-/utils-5.12.0.tgz#8661af1e8fadb1d35b8b108ecf24fc502a1ff29b" + integrity sha512-vw5Is2bdY+EjYw8dAJaAW6f+Iir0trwcz43cVI+Cpic9sTC6c7+UP89cvyW1sISN7YsWYRdtJjDT+BW9i6sSwg== "@tootallnate/once@2": version "2.0.0" @@ -3359,6 +3501,11 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== +"@types/parse-path@^7.0.0": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/parse-path/-/parse-path-7.0.3.tgz#cec2da2834ab58eb2eb579122d9a1fc13bd7ef36" + integrity sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg== + "@types/qs@*": version "6.9.15" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" @@ -4215,10 +4362,10 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -before-after-hook@^2.2.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" - integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== +before-after-hook@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-3.0.2.tgz#d5665a5fa8b62294a5aa0a499f933f4a1016195d" + integrity sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A== big.js@^5.2.2: version "5.2.2" @@ -5092,10 +5239,10 @@ cypress-real-events@^1.13.0: resolved "https://registry.yarnpkg.com/cypress-real-events/-/cypress-real-events-1.13.0.tgz#6b7cd32dcac172db1493608f97a2576c7d0bd5af" integrity sha512-LoejtK+dyZ1jaT8wGT5oASTPfsNV8/ClRp99ruN60oPj8cBJYod80iJDyNwfPAu4GCxTXOhhAv9FO65Hpwt6Hg== -cypress@^13.17.0: - version "13.17.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.17.0.tgz#34c3d68080c4497eace0f353bd1629587a5f600d" - integrity sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA== +cypress@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-14.0.0.tgz#a71cb0a243a0bfeb97b6973ab9c5291ca5288e93" + integrity sha512-kEGqQr23so5IpKeg/dp6GVi7RlHx1NmW66o2a2Q4wk9gRaAblLZQSiZJuDI8UMC4LlG5OJ7Q6joAiqTrfRNbTw== dependencies: "@cypress/request" "^3.0.6" "@cypress/xvfb" "^1.2.4" @@ -5290,11 +5437,6 @@ dependency-graph@^1.0.0: resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-1.0.0.tgz#bb5e85aec1310bc13b22dbd76e3196c4ee4c10d2" integrity sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg== -deprecation@^2.0.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" - integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== - dequal@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" @@ -5891,22 +6033,25 @@ execa@4.1.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -execa@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.0.tgz#bed67705f9966469cd93e521617868c52a4df6e8" - integrity sha512-CTNS0BcKBcoOsawKBlpcKNmK4Kjuyz5jVLhf+PUsHGMqiKMVTa4cN3U7r7bRY8KTpfOGpXMo27fdy0dYVg2pqA== +execa@9.5.2: + version "9.5.2" + resolved "https://registry.yarnpkg.com/execa/-/execa-9.5.2.tgz#a4551034ee0795e241025d2f987dab3f4242dff2" + integrity sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q== dependencies: + "@sindresorhus/merge-streams" "^4.0.0" cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" + figures "^6.1.0" + get-stream "^9.0.0" + human-signals "^8.0.0" + is-plain-obj "^4.1.0" + is-stream "^4.0.1" + npm-run-path "^6.0.0" + pretty-ms "^9.0.0" signal-exit "^4.1.0" - strip-final-newline "^3.0.0" + strip-final-newline "^4.0.0" + yoctocolors "^2.0.0" -execa@^5.0.0, execa@^5.1.1: +execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -5921,6 +6066,21 @@ execa@^5.0.0, execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + executable@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" @@ -6021,6 +6181,11 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== +fast-content-type-parse@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz#c236124534ee2cb427c8d8e5ba35a4856947847b" + integrity sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -6092,6 +6257,13 @@ figures@^3.2.0: dependencies: escape-string-regexp "^1.0.5" +figures@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-6.1.0.tgz#935479f51865fa7479f6fa94fc6fc7ac14e62c4a" + integrity sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg== + dependencies: + is-unicode-supported "^2.0.0" + file-entry-cache@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" @@ -6328,6 +6500,14 @@ get-stream@^8.0.1: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== +get-stream@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-9.0.1.tgz#95157d21df8eb90d1647102b63039b1df60ebd27" + integrity sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA== + dependencies: + "@sec-ant/readable-stream" "^0.4.1" + is-stream "^4.0.1" + get-tsconfig@^4.8.1: version "4.8.1" resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471" @@ -6375,20 +6555,20 @@ git-semver-tags@^8.0.0: "@conventional-changelog/git-client" "^1.0.0" meow "^13.0.0" -git-up@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/git-up/-/git-up-7.0.0.tgz#bace30786e36f56ea341b6f69adfd83286337467" - integrity sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ== +git-up@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/git-up/-/git-up-8.0.0.tgz#674d398f95c4f70b4193f3f3d87c73cf28c2bee1" + integrity sha512-uBI8Zdt1OZlrYfGcSVroLJKgyNNXlgusYFzHk614lTasz35yg2PVpL1RMy0LOO2dcvF9msYW3pRfUSmafZNrjg== dependencies: is-ssh "^1.4.0" - parse-url "^8.1.0" + parse-url "^9.2.0" -git-url-parse@14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-14.0.0.tgz#18ce834726d5fbca0c25a4555101aa277017418f" - integrity sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ== +git-url-parse@16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-16.0.0.tgz#04dcc54197ad9aa2c92795b32be541d217c11f70" + integrity sha512-Y8iAF0AmCaqXc6a5GYgPQW9ESbncNLOL+CeQAJRhmWUOmnPkKpBYeWYp4mFd3LA5j53CdGDdslzX12yEBVHQQg== dependencies: - git-up "^7.0.0" + git-up "^8.0.0" glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" @@ -6724,6 +6904,11 @@ human-signals@^5.0.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== +human-signals@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-8.0.0.tgz#2d3d63481c7c2319f0373428b01ffe30da6df852" + integrity sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA== + hyperdyperid@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b" @@ -6861,23 +7046,18 @@ injection-js@^2.4.0: dependencies: tslib "^2.0.0" -inquirer@9.3.2: - version "9.3.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.3.2.tgz#9bc5ced19f572e848044baa05094a498f1e448c6" - integrity sha512-+ynEbhWKhyomnaX0n2aLIMSkgSlGB5RrWbNXnEqj6mdaIydu6y40MdBjL38SAB0JcdmOaIaMua1azdjLEr3sdw== +inquirer@12.3.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-12.3.0.tgz#c5142f49362f1347aa49a18e652db460f14092e6" + integrity sha512-3NixUXq+hM8ezj2wc7wC37b32/rHq1MwNZDYdvx+d6jokOD+r+i8Q4Pkylh9tISYP114A128LCX8RKhopC5RfQ== dependencies: - "@inquirer/figures" "^1.0.3" + "@inquirer/core" "^10.1.2" + "@inquirer/prompts" "^7.2.1" + "@inquirer/type" "^3.0.2" ansi-escapes "^4.3.2" - cli-width "^4.1.0" - external-editor "^3.1.0" - mute-stream "1.0.0" - ora "^5.4.1" + mute-stream "^2.0.0" run-async "^3.0.0" rxjs "^7.8.1" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wrap-ansi "^6.2.0" - yoctocolors-cjs "^2.1.1" interpret@^1.0.0: version "1.4.0" @@ -7050,6 +7230,11 @@ is-plain-obj@^3.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== +is-plain-obj@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -7084,6 +7269,11 @@ is-stream@^3.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== +is-stream@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-4.0.1.tgz#375cf891e16d2e4baec250b85926cffc14720d9b" + integrity sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A== + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -8072,7 +8262,7 @@ lru-cache@^7.14.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== -macos-release@^3.1.0: +macos-release@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-3.3.0.tgz#92cb67bc66d67c3fde4a9e14f5f909afa418b072" integrity sha512-tPJQ1HeyiU2vRruNGhZ+VleWuMQRro8iFtJxYgnS4NQe+EukKF6aGiIT+7flZhISAt2iaXBCfFGvAyif7/f8nQ== @@ -8390,11 +8580,16 @@ multiple-select-vanilla@^3.4.4: dependencies: "@types/trusted-types" "^2.0.7" -mute-stream@1.0.0, mute-stream@^1.0.0: +mute-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== +mute-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-2.0.0.tgz#a5446fc0c512b71c83c44d908d5c7b7b4c493b2b" + integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== + nanoid@^3.3.7: version "3.3.8" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" @@ -8665,6 +8860,14 @@ npm-run-path@^5.1.0: dependencies: path-key "^4.0.0" +npm-run-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-6.0.0.tgz#25cfdc4eae04976f3349c0b1afc089052c362537" + integrity sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA== + dependencies: + path-key "^4.0.0" + unicorn-magic "^0.3.0" + nth-check@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" @@ -8749,7 +8952,7 @@ optionator@^0.9.3: type-check "^0.4.0" word-wrap "^1.2.5" -ora@5.4.1, ora@^5.1.0, ora@^5.4.1: +ora@5.4.1, ora@^5.1.0: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== @@ -8784,13 +8987,13 @@ ordered-binary@^1.4.1: resolved "https://registry.yarnpkg.com/ordered-binary/-/ordered-binary-1.5.1.tgz#94ccbf14181711081ee23931db0dc3f58aaa0df6" integrity sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A== -os-name@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/os-name/-/os-name-5.1.0.tgz#4f5ab5edfa6938b590112714f1570fe79f1d957a" - integrity sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ== +os-name@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/os-name/-/os-name-6.0.0.tgz#9b891a5339d516420683aabdc31f4cc1a9c6aa31" + integrity sha512-bv608E0UX86atYi2GMGjDe0vF/X1TJjemNS8oEW6z22YW1Rc3QykSYoGfkQbX0zZX9H0ZB6CQP/3GTf1I5hURg== dependencies: - macos-release "^3.1.0" - windows-release "^5.0.1" + macos-release "^3.2.0" + windows-release "^6.0.0" os-tmpdir@~1.0.2: version "1.0.2" @@ -8951,6 +9154,11 @@ parse-json@^8.0.0: index-to-position "^0.1.2" type-fest "^4.7.1" +parse-ms@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-4.0.0.tgz#c0c058edd47c2a590151a718990533fd62803df4" + integrity sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw== + parse-node-version@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" @@ -8963,11 +9171,12 @@ parse-path@^7.0.0: dependencies: protocols "^2.0.0" -parse-url@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-8.1.0.tgz#972e0827ed4b57fc85f0ea6b0d839f0d8a57a57d" - integrity sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w== +parse-url@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-9.2.0.tgz#d75da32b3bbade66e4eb0763fb4851d27526b97b" + integrity sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ== dependencies: + "@types/parse-path" "^7.0.0" parse-path "^7.0.0" parse5-html-rewriting-stream@7.0.0: @@ -9214,6 +9423,13 @@ pretty-format@^29.0.0, pretty-format@^29.7.0: ansi-styles "^5.0.0" react-is "^18.0.0" +pretty-ms@^9.0.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-9.2.0.tgz#e14c0aad6493b69ed63114442a84133d7e560ef0" + integrity sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg== + dependencies: + parse-ms "^4.0.0" + proc-log@^4.0.0, proc-log@^4.1.0, proc-log@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-4.2.0.tgz#b6f461e4026e75fdfe228b265e9f7a00779d7034" @@ -9527,31 +9743,32 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" -release-it@^17.11.0: - version "17.11.0" - resolved "https://registry.yarnpkg.com/release-it/-/release-it-17.11.0.tgz#4cb858194f45fdc1966b8a53209efff887d1994e" - integrity sha512-qQGgfMbUZ3/vpXUPmngsgjFObOLjlkwtiozHUYen9fo9AEGciXjG1ZpGr+FNmuBT8R7TOSY+x/s84wOCRKJjbA== +release-it@^18.1.1: + version "18.1.1" + resolved "https://registry.yarnpkg.com/release-it/-/release-it-18.1.1.tgz#263f0dc67a6b2209b072528444a49cb0fa7ae015" + integrity sha512-rC/iVKri7U/Kp/Myujmsf7HG2gPq8My/LBVB72TbZZYKD14fmgDZC4Eyn8DD7Yh2h/G/YCCsRe1QQPrjXj9Mzg== dependencies: "@iarna/toml" "2.2.5" - "@octokit/rest" "20.1.1" + "@octokit/rest" "21.0.2" async-retry "1.3.3" chalk "5.4.1" ci-info "^4.1.0" cosmiconfig "9.0.0" - execa "8.0.0" - git-url-parse "14.0.0" + execa "9.5.2" + git-url-parse "16.0.0" globby "14.0.2" - inquirer "9.3.2" + inquirer "12.3.0" issue-parser "7.0.1" lodash "4.17.21" mime-types "2.1.35" new-github-release-url "2.0.0" open "10.1.0" ora "8.1.1" - os-name "5.1.0" + os-name "6.0.0" proxy-agent "6.5.0" semver "7.6.3" shelljs "0.8.5" + undici "6.21.0" update-notifier "7.3.1" url-join "5.0.0" wildcard-match "5.1.4" @@ -10314,6 +10531,11 @@ strip-final-newline@^3.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== +strip-final-newline@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-4.0.0.tgz#35a369ec2ac43df356e3edd5dcebb6429aa1fa5c" + integrity sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw== + strip-json-comments@3.1.1, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -10684,6 +10906,11 @@ undici-types@~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@6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.0.tgz#4b3d3afaef984e07b48e7620c34ed8a285ed4cd4" + integrity sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -10712,6 +10939,11 @@ unicorn-magic@^0.1.0: resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== +unicorn-magic@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz#4efd45c85a69e0dd576d25532fbfa22aa5c8a104" + integrity sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA== + unique-filename@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" @@ -10726,10 +10958,10 @@ unique-slug@^4.0.0: dependencies: imurmurhash "^0.1.4" -universal-user-agent@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" - integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== +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== universalify@^0.2.0: version "0.2.0" @@ -11096,12 +11328,12 @@ wildcard@^2.0.1: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== -windows-release@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-5.1.1.tgz#7ac7019f9baeaea6c00ec889b11824f46c12ee8d" - integrity sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw== +windows-release@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-6.0.1.tgz#9111c21fc5c3043fdb47b548df15ac14b94683b2" + integrity sha512-MS3BzG8QK33dAyqwxfYJCJ03arkwKaddUOvvnnlFdXLudflsQF6I8yAxrLBeQk4yO8wjdH/+ax0YzxJEDrOftg== dependencies: - execa "^5.1.1" + execa "^8.0.1" word-wrap@^1.2.5: version "1.2.5" @@ -11243,11 +11475,16 @@ yocto-queue@^1.0.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.1.1.tgz#fef65ce3ac9f8a32ceac5a634f74e17e5b232110" integrity sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g== -yoctocolors-cjs@^2.1.1, yoctocolors-cjs@^2.1.2: +yoctocolors-cjs@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz#f4b905a840a37506813a7acaa28febe97767a242" integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA== +yoctocolors@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/yoctocolors/-/yoctocolors-2.1.1.tgz#e0167474e9fbb9e8b3ecca738deaa61dd12e56fc" + integrity sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ== + zone.js@~0.15.0: version "0.15.0" resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.15.0.tgz#4810624e58d6dcf7b8379c1631765589917a0d8f"