From 4754d64fec9e6030c91e15e5822cdd190d543ba5 Mon Sep 17 00:00:00 2001 From: ThHarbig Date: Tue, 25 Jun 2024 09:54:11 +0200 Subject: [PATCH] feat: Jump linking table, virtualized tanstack table (#4) * feat: add parent component for examples * feat: add PhyloTree * feat: write a wrapper for gosling component to avoid passing down the gosling ref * fix: jsdocs * feat: set states for track height and gosling height * feat: create meta component wrapper * feat: adapt table to new API * feat: add very simple example to demonstrate track issue * feat: adapt metatable to new events and fixed track ids * feat: adapt code to new API * feat: Add sortable table * feat: fix import * chore: add TanStack Table Props interface and increase gosling.js version * feat: add jump button to table * feat: add linkageType for table (scroll, window, jump) * feat: implement jump linkage * fix: adapt to new gosling version * feat: virtualize metadata table * fix: Typescript issues * chore: add default parameter for linkageType * chore: add eslint rules --- .eslintrc.js | 89 ++++-- demo/App.jsx | 50 ++-- demo/GeneSpy.jsx | 40 ++- demo/IslandViewer.jsx | 148 ++++++---- demo/index.jsx | 10 +- package.json | 9 +- src/GoslingComponentWrapper.tsx | 59 ++-- src/GoslingMetaComponent.tsx | 85 ++++-- src/MetaComponentWrapper.tsx | 72 +++-- src/MetaTable.tsx | 200 +++++++------ src/PhyloTree.tsx | 159 +++++----- src/TanStackTable.tsx | 159 ++++++++++ src/table-data-transform.test.ts | 27 +- src/table-data-transform.ts | 46 ++- tsconfig.json | 2 +- yarn.lock | 480 ++++++++++++++++++++++++++----- 16 files changed, 1145 insertions(+), 490 deletions(-) create mode 100644 src/TanStackTable.tsx diff --git a/.eslintrc.js b/.eslintrc.js index e947968..dfb73f6 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,31 +1,64 @@ module.exports = { - settings: { - react: { - version: "detect", + settings: { + react: { + version: "detect", + }, }, - }, - env: { - browser: true, - es2021: true - }, - extends: [ - 'plugin:react/recommended', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', - "prettier", - ], - overrides: [ - ], - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - project: './tsconfig.json' - }, - plugins: [ - 'react', - "prettier" - ], - rules: { - '@typescript-eslint/no-unused-vars': "off", - } + env: { + browser: true, + es2021: true + }, + extends: [ + 'plugin:react/recommended', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + "prettier", + ], + overrides: [], + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: './tsconfig.json' + }, + plugins: [ + 'react', + "prettier" + ], + rules: { + 'prettier/prettier': 'warn', + // https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin#supported-rules + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-empty-interface': 'off', + '@typescript-eslint/prefer-for-of': 'error', + '@typescript-eslint/no-for-in-array': 'error', + '@typescript-eslint/no-require-imports': 'error', + '@typescript-eslint/no-empty-function': 'off', // we need this in HiGlass plugin track + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-namespace': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + 'no-unused-vars': 'off', // must disable the base rule as it can report incorrect errors + // https://www.executeprogram.com/blog/the-code-is-the-to-do-list + "no-warning-comments": ["error", {terms: ["xxx"], location: "anywhere"}], + '@typescript-eslint/no-unused-vars': [ + 'error', + { + vars: 'all', + args: 'after-used', + ignoreRestSiblings: true + } + ], + // https://eslint.org/docs/rules/ + 'linebreak-style': ['error', 'unix'], + 'no-console': ['error', {allow: ['warn', 'error']}], + 'no-trailing-spaces': 'error', + 'no-irregular-whitespace': ['error', {skipComments: true}], + 'no-alert': 'error', + 'prefer-const': 'error', + 'no-case-declarations': 'warn', + 'no-return-assign': 'error', + 'no-useless-call': 'error', + 'no-shadow': 'off', // 'error', // we could enable this later + 'no-useless-concat': 'error', + "prefer-template": 'error' + } } diff --git a/demo/App.jsx b/demo/App.jsx index 4d0483f..61c661f 100644 --- a/demo/App.jsx +++ b/demo/App.jsx @@ -2,31 +2,39 @@ import * as React from 'react'; import { Routes, Route, Link } from 'react-router-dom'; import IslandViewer from './IslandViewer'; import 'higlass/dist/hglib.css'; -import GeneSpy from "./GeneSpy"; +import GeneSpy from './GeneSpy'; // The full list of examples const examples = { - IslandViewer: , - GeneSpy: , -} + IslandViewer: , + GeneSpy: +}; function App() { - return ( -
-
-
Examples
-
    - {Object.entries(examples).map(entry =>
  1. {entry[0]}
  2. )} -
-
-
- - - {Object.entries(examples).map(entry => )} - -
-
- ); + return ( +
+
+
Examples
+
    + {Object.entries(examples).map(entry => ( +
  1. + + {entry[0]} + +
  2. + ))} +
+
+
+ + + {Object.entries(examples).map(entry => ( + + ))} + +
+
+ ); } -export default App; \ No newline at end of file +export default App; diff --git a/demo/GeneSpy.jsx b/demo/GeneSpy.jsx index a6c97c5..0770472 100644 --- a/demo/GeneSpy.jsx +++ b/demo/GeneSpy.jsx @@ -1,5 +1,5 @@ import React from 'react'; -import {GoslingMetaComponent} from '../src/index.ts'; +import { GoslingMetaComponent } from '../src/index.ts'; const gosId = 'gosID'; const goslingSpec = { @@ -8,14 +8,14 @@ const goslingSpec = { description: 'Idea: https://doi.org/10.1093/bioinformatics/bty459', assembly: [['', 11000]], arrangement: 'horizontal', - spacing:0, + spacing: 0, static: true, views: [ { tracks: [ { - type: "dummy-track", - id: "tree", + type: 'dummy-track', + id: 'tree' } ], width: 350, @@ -38,26 +38,22 @@ const goslingSpec = { id: gosId, row: { field: 'Accession', - type: 'nominal', + type: 'nominal' }, tracks: [ { - dataTransform: [ - {type: 'filter', field: 'Strand', oneOf: ['+']} - ], + dataTransform: [{ type: 'filter', field: 'Strand', oneOf: ['+'] }], mark: 'triangleRight', - style: {align: 'right'}, - x: {field: 'Gene start', type: 'genomic', axis: 'none'}, - xe: {field: 'Gene end', type: 'genomic'} + style: { align: 'right' }, + x: { field: 'Gene start', type: 'genomic', axis: 'none' }, + xe: { field: 'Gene end', type: 'genomic' } }, { - dataTransform: [ - {type: 'filter', field: 'Strand', oneOf: ['-']} - ], + dataTransform: [{ type: 'filter', field: 'Strand', oneOf: ['-'] }], mark: 'triangleLeft', - style: {align: 'left'}, - x: {field: 'Gene start', type: 'genomic'}, - xe: {field: 'Gene end', type: 'genomic'} + style: { align: 'left' }, + x: { field: 'Gene start', type: 'genomic' }, + xe: { field: 'Gene end', type: 'genomic' } } ], height: 300 @@ -67,18 +63,18 @@ const goslingSpec = { const metaSpec = { type: 'tree', data: { - url: 'https://s3.amazonaws.com/gosling-lang.org/data/GeneSpy/gene_spy_example.nwk', - type: 'nwk', + url: 'https://s3.amazonaws.com/gosling-lang.org/data/GeneSpy/gene_spy_tree.json', + type: 'json' }, - width: 400, -} + width: 400 +}; export default function GeneSpy() { return ( ); } diff --git a/demo/IslandViewer.jsx b/demo/IslandViewer.jsx index 02dff47..0fba1f8 100644 --- a/demo/IslandViewer.jsx +++ b/demo/IslandViewer.jsx @@ -1,5 +1,5 @@ import React from 'react'; -import {GoslingMetaComponent} from '../src/index.ts'; +import { GoslingMetaComponent } from '../src/index.ts'; const islandData = { data: { @@ -8,9 +8,10 @@ const islandData = { chromosomeField: 'Accession', genomicFields: ['Island start', 'Island end'] }, - x: {field: 'Island start', type: 'genomic'}, - xe: {field: 'Island end', type: 'genomic'} + x: { field: 'Island start', type: 'genomic' }, + xe: { field: 'Island end', type: 'genomic' } }; +const dataID = 'dataView'; const detailID = 'detailedView'; const circularRadius = 200; const centerRadius = 0.5; @@ -29,8 +30,8 @@ const goslingSpec = { { tracks: [ { - type: "dummy-track", - id: "table", + type: 'dummy-track', + id: 'table' } ], width: 600, @@ -46,6 +47,27 @@ const goslingSpec = { alignment: 'overlay', spacing: 0.1, tracks: [ + { + data: { + url: 'https://s3.amazonaws.com/gosling-lang.org/data/IslandViewer/NC_004631.1_genes.csv', + type: 'csv', + sampleLength: 1.7976931348623157e308, + chromosomeField: 'Accession', + genomicFields: ['Gene start', 'Gene end'] + }, + id: dataID, + x: { field: 'Gene start', type: 'genomic' }, + xe: { field: 'Gene end', type: 'genomic' }, + mark: 'rect', + visibility: [ + { + threshold: 1, + target: 'mark', + operation: 'lt', + measure: 'zoomLevel' + } + ] + }, { data: { url: 'https://s3.amazonaws.com/gosling-lang.org/data/IslandViewer/NC_004631.1_GCcontent.csv', @@ -53,16 +75,16 @@ const goslingSpec = { separator: '\t', genomicFields: ['Position'] }, - y: {field: 'GCcontent', type: 'quantitative', range: [-250, 0], axis: 'none'}, + y: { field: 'GCcontent', type: 'quantitative', range: [-250, 0], axis: 'none' }, mark: 'line', - size: {value: 0.5}, - x: {field: 'Position', type: 'genomic'}, + size: { value: 0.5 }, + x: { field: 'Position', type: 'genomic' }, color: { value: 'black' } }, { - style: {outlineWidth: 1, outline: 'black'}, + style: { outlineWidth: 1, outline: 'black' }, data: { url: 'https://s3.amazonaws.com/gosling-lang.org/data/IslandViewer/NC_004631.1_annotations.csv', type: 'csv', @@ -80,10 +102,10 @@ const goslingSpec = { newField: 'row' } ], - y: {field: 'row', type: 'nominal', flip: true}, + y: { field: 'row', type: 'nominal', flip: true }, mark: 'point', - x: {field: 'Gene start', type: 'genomic'}, - size: {value: 3}, + x: { field: 'Gene start', type: 'genomic' }, + size: { value: 3 }, color: { field: 'Type', type: 'nominal', @@ -120,7 +142,7 @@ const goslingSpec = { }, { mark: 'brush', - x: {linkingId: 'detail'} + x: { linkingId: 'detail' } } ], width: circularRadius * 2, @@ -128,7 +150,7 @@ const goslingSpec = { }, { layout: 'linear', - xDomain: {chromosome: 'NC_004631.1', interval: [1000000, 1500000]}, + xDomain: { chromosome: 'NC_004631.1', interval: [1000000, 1500000] }, linkingId: 'detail', alignment: 'overlay', tracks: [ @@ -140,14 +162,14 @@ const goslingSpec = { genomicFields: ['Gene start', 'Gene end'] }, id: detailID, - x: {field: 'Gene start', type: 'genomic'}, - xe: {field: 'Gene end', type: 'genomic'}, - y: {value: 5.5 * linearSize}, - size: {value: linearSize}, + x: { field: 'Gene start', type: 'genomic' }, + xe: { field: 'Gene end', type: 'genomic' }, + y: { value: 5.5 * linearSize }, + size: { value: linearSize }, mark: 'rect', - dataTransform: [{type: 'filter', field: 'Strand', oneOf: ['1']}], - color: {value: '#E9967A'}, - tooltip: [{field: 'Gene name', type: 'nominal', alt: 'Name'}] + dataTransform: [{ type: 'filter', field: 'Strand', oneOf: ['1'] }], + color: { value: '#E9967A' }, + tooltip: [{ field: 'Gene name', type: 'nominal', alt: 'Name' }] }, { data: { @@ -156,46 +178,46 @@ const goslingSpec = { chromosomeField: 'Accession', genomicFields: ['Gene start', 'Gene end'] }, - x: {field: 'Gene start', type: 'genomic'}, - xe: {field: 'Gene end', type: 'genomic'}, - y: {value: 4.5 * linearSize}, - size: {value: linearSize}, + x: { field: 'Gene start', type: 'genomic' }, + xe: { field: 'Gene end', type: 'genomic' }, + y: { value: 4.5 * linearSize }, + size: { value: linearSize }, mark: 'rect', - dataTransform: [{type: 'filter', field: 'Strand', oneOf: ['-1']}], - color: {value: '#87976E'}, - tooltip: [{field: 'Gene name', type: 'nominal', alt: 'Name'}] + dataTransform: [{ type: 'filter', field: 'Strand', oneOf: ['-1'] }], + color: { value: '#87976E' }, + tooltip: [{ field: 'Gene name', type: 'nominal', alt: 'Name' }] }, { ...islandData, mark: 'rect', - dataTransform: [{type: 'filter', field: 'Method', oneOf: ['IslandPath-DIMOB']}], - y: {value: 0.5 * linearSize}, - size: {value: linearSize}, - color: {value: '#4169E1'} + dataTransform: [{ type: 'filter', field: 'Method', oneOf: ['IslandPath-DIMOB'] }], + y: { value: 0.5 * linearSize }, + size: { value: linearSize }, + color: { value: '#4169E1' } }, { ...islandData, mark: 'rect', - dataTransform: [{type: 'filter', field: 'Method', oneOf: ['SIGI-HMM']}], - y: {value: 1.5 * linearSize}, - size: {value: linearSize}, - color: {value: '#FF8C00'} + dataTransform: [{ type: 'filter', field: 'Method', oneOf: ['SIGI-HMM'] }], + y: { value: 1.5 * linearSize }, + size: { value: linearSize }, + color: { value: '#FF8C00' } }, { ...islandData, mark: 'rect', - dataTransform: [{type: 'filter', field: 'Method', oneOf: ['IslandPick']}], - y: {value: 2.5 * linearSize}, - size: {value: linearSize}, - color: {value: '#008001'} + dataTransform: [{ type: 'filter', field: 'Method', oneOf: ['IslandPick'] }], + y: { value: 2.5 * linearSize }, + size: { value: linearSize }, + color: { value: '#008001' } }, { ...islandData, mark: 'rect', - dataTransform: [{type: 'filter', field: 'Method', oneOf: ['Islander']}], - y: {value: 3.5 * linearSize}, - size: {value: linearSize}, - color: {value: '#40E0D0'} + dataTransform: [{ type: 'filter', field: 'Method', oneOf: ['Islander'] }], + y: { value: 3.5 * linearSize }, + size: { value: linearSize }, + color: { value: '#40E0D0' } }, { data: { @@ -215,17 +237,17 @@ const goslingSpec = { newField: 'row' } ], - row: {field: 'row', type: 'nominal'}, + row: { field: 'row', type: 'nominal' }, mark: 'point', - x: {field: 'Gene start', type: 'genomic'}, - size: {value: 3}, + x: { field: 'Gene start', type: 'genomic' }, + size: { value: 3 }, color: { field: 'Type', type: 'nominal', domain: ['Victors', 'BLAST', 'RGI', 'PAG'], range: ['#460B80', '#A684EA', '#FF9CC1', '#FF9CC1'] }, - tooltip: [{field: 'Type', type: 'nominal', alt: 'Name'}] + tooltip: [{ field: 'Type', type: 'nominal', alt: 'Name' }] } ], width: circularRadius * 2, @@ -233,36 +255,38 @@ const goslingSpec = { } ] } - ] }; const metaSpec = { type: 'table', dataTransform: [ { - type: "merge", - fields: ["Islands", "Annotations"], - mergeChar: "/", - newField: "Prediction Method", + type: 'merge', + fields: ['Islands', 'Annotations'], + mergeChar: '/', + newField: 'Prediction Method' } ], genomicColumns: ['Gene start', 'Gene end'], + chromosomeField: 'Accession', metadataColumns: [ - {type: 'genomic', columnName: 'Gene start'}, - {type: 'genomic', columnName: 'Gene end'}, - {type: 'nominal', columnName: 'Prediction Method'}, - {type: 'nominal', columnName: 'Gene name'}, - {type: 'nominal', columnName: 'Accnum'}, - {type: 'nominal', columnName: 'Product'} - ] -} + { type: 'genomic', columnName: 'Gene start' }, + { type: 'genomic', columnName: 'Gene end' }, + { type: 'nominal', columnName: 'Prediction Method' }, + { type: 'nominal', columnName: 'Gene name' }, + { type: 'nominal', columnName: 'Accnum' }, + { type: 'nominal', columnName: 'Product' } + ], + linkageType: 'jump', + dataId: dataID +}; export default function IslandViewer() { return ( ); } diff --git a/demo/index.jsx b/demo/index.jsx index e1d00d7..233f85f 100644 --- a/demo/index.jsx +++ b/demo/index.jsx @@ -1,9 +1,11 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import App from './App'; -import {HashRouter} from "react-router-dom"; +import { HashRouter } from 'react-router-dom'; const root = ReactDOM.createRoot(document.getElementById('root')); -root.render( - -); \ No newline at end of file +root.render( + + + +); diff --git a/package.json b/package.json index b235d59..d606843 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,9 @@ "deploy": "touch dist/.nojekyll; gh-pages -d dist -t --git git" }, "dependencies": { - "gosling.js": "^0.10.3", + "@tanstack/react-table": "^8.10.7", + "@tanstack/react-virtual": "^3.1.3", + "gosling.js": "^0.16.0", "higlass": "^1.12.4", "pixi.js": "^6.3.0", "react": "^18.2.0", @@ -32,8 +34,9 @@ "@typescript-eslint/eslint-plugin": "^5.43.0", "@typescript-eslint/parser": "^5.59.6", "@vitejs/plugin-react": "^4.0.0", - "eslint": "^8.0.1", + "eslint": "^8.57.0", "eslint-config-prettier": "^8.8.0", + "eslint-plugin-jsx-a11y": "^2.2.3", "eslint-config-standard-with-typescript": "^34.0.1", "eslint-plugin-import": "^2.25.2", "eslint-plugin-n": "^15.0.0", @@ -43,7 +46,7 @@ "gh-pages": "^5.0.0", "prettier": "^2.8.8", "typescript": "*", - "vite": "^4.3.7", + "vite": "^5.2.0-beta.1", "vitest": "^0.31.2" } } diff --git a/src/GoslingComponentWrapper.tsx b/src/GoslingComponentWrapper.tsx index 3ed3b7a..d6c54df 100644 --- a/src/GoslingComponentWrapper.tsx +++ b/src/GoslingComponentWrapper.tsx @@ -1,38 +1,55 @@ -import React, {useEffect, useRef} from 'react'; -import {GoslingComponent, GoslingRef, GoslingSpec} from "gosling.js"; -import type {Datum} from 'gosling.js/dist/src/gosling-schema'; +import React, { useCallback, useEffect, useRef } from 'react'; +import { GoslingComponent, GoslingRef, GoslingSpec } from 'gosling.js'; +import type { Datum } from 'gosling.js/dist/src/gosling-schema'; interface GoslingComponentWrapperProps { - type: "table" | "tree"; + type: 'table' | 'tree'; spec: GoslingSpec; trackId: string; + dataId: string; placeholderId: string; + position: string; setData: (data: Datum[]) => void; - setRange: (range: [{ chromosome: string, position: number }, { - chromosome: string, - position: number - }]) => void; - setMetaDimensions: (shape: { x: number, y: number, width: number, height: number }) => void; + setRange: ( + range: [ + { chromosome: string; position: number }, + { + chromosome: string; + position: number; + } + ] + ) => void; + setMetaDimensions: (shape: { x: number; y: number; width: number; height: number }) => void; } - /** * Wrapper for gosling component * @param props * @returns */ export default function GoslingComponentWrapper(props: GoslingComponentWrapperProps) { - const {type, spec, trackId, placeholderId, setData, setRange, setMetaDimensions} = props; - const gosRef = useRef(null) + const { type, spec, trackId, dataId, placeholderId, position, setData, setRange, setMetaDimensions } = props; + const gosRef = useRef(null); + useEffect(() => { + if (gosRef.current == null) return; + if (type === 'table' && position !== ':0-0') { + gosRef.current.api.zoomTo(trackId, position, 5000); + } + }, [trackId, position]); useEffect(() => { if (gosRef.current == null) return; - setMetaDimensions(gosRef.current.api.getTrack(placeholderId).shape) - if (type === "table") { + gosRef.current.api.subscribe('onNewTrack', (type, eventData) => { + if (eventData.id === placeholderId) { + setMetaDimensions(gosRef.current?.api.getTrack(placeholderId).shape); + } + }); + if (type === 'table') { + // TODO: not desired to have an extra track for the data! Maybe event that always returns full data? gosRef.current.api.subscribe('rawData', (type, eventData) => { - if (trackId === eventData.id) { + if (dataId === eventData.id) { setData(eventData.data); } - }) + }); gosRef.current.api.subscribe('location', (type, eventData) => { if (eventData.id === trackId) { setRange(eventData.genomicRange); @@ -41,10 +58,12 @@ export default function GoslingComponentWrapper(props: GoslingComponentWrapperPr return () => { gosRef.current?.api.unsubscribe('location'); gosRef.current?.api.unsubscribe('rawData'); - }; } - }, []); - return (
); + }, [placeholderId, type, dataId, trackId]); + return ( +
+ +
+ ); } diff --git a/src/GoslingMetaComponent.tsx b/src/GoslingMetaComponent.tsx index c09d91d..75fc02c 100644 --- a/src/GoslingMetaComponent.tsx +++ b/src/GoslingMetaComponent.tsx @@ -1,14 +1,14 @@ -import React, {useState} from 'react'; -import {type GoslingSpec} from 'gosling.js'; -import {MetaTableSpec} from './MetaTable'; +import React, { useState } from 'react'; +import { type GoslingSpec } from 'gosling.js'; +import { MetaTableSpec } from './MetaTable'; import 'higlass/dist/hglib.css'; import './index.css'; -import {PhyloTreeSpec} from "./PhyloTree"; -import GoslingComponentWrapper from "./GoslingComponentWrapper"; -import type {Datum} from "gosling.js/dist/src/gosling-schema"; -import MetaComponentWrapper from "./MetaComponentWrapper"; +import { PhyloTreeSpec } from './PhyloTree'; +import GoslingComponentWrapper from './GoslingComponentWrapper'; +import type { Datum } from 'gosling.js/dist/src/gosling-schema'; +import MetaComponentWrapper from './MetaComponentWrapper'; -export type MetaSpec = (MetaTableSpec | PhyloTreeSpec) +export type MetaSpec = MetaTableSpec | PhyloTreeSpec; interface ConnectionType { type: 'weak' | 'strong'; @@ -16,7 +16,6 @@ interface ConnectionType { placeholderId: string; } - interface GoslingMetaComponentProps { goslingSpec: GoslingSpec; metaSpec: MetaSpec; @@ -29,33 +28,63 @@ interface GoslingMetaComponentProps { * @returns */ export default function GoslingMetaComponent(props: GoslingMetaComponentProps) { - const {goslingSpec, metaSpec, connectionType} = props; + const { goslingSpec, metaSpec, connectionType } = props; const [goslingSpecUpdateable, setGoslingSpec] = useState(structuredClone(goslingSpec)); - const [metaDimensions, setMetaDimensions] = useState({x: 0, y: 0, width: 100, height: 100}) + const [metaDimensions, setMetaDimensions] = useState({ x: 0, y: 0, width: 100, height: 100 }); // range of data relevant for the meta visualization - const [range, setRange] = useState<[{ chromosome: string, position: number }, { - chromosome: string, - position: number - }]>([{chromosome: "", position: 0}, {chromosome: "", position: 0}]) + const [range, setRange] = useState< + [ + { chromosome: string; position: number }, + { + chromosome: string; + position: number; + } + ] + >([ + { chromosome: '', position: 0 }, + { chromosome: '', position: 0 } + ]); + const [zoomTo, setZoomTo] = useState< + [ + { chromosome: string; position: number }, + { + chromosome: string; + position: number; + } + ] + >([ + { chromosome: '', position: 0 }, + { chromosome: '', position: 0 } + ]); // data relevant for the meta visualization - const [data, setData] = useState([]) + const [data, setData] = useState([]); return (
- +
- +
); diff --git a/src/MetaComponentWrapper.tsx b/src/MetaComponentWrapper.tsx index 5192c1a..c9c2846 100644 --- a/src/MetaComponentWrapper.tsx +++ b/src/MetaComponentWrapper.tsx @@ -1,9 +1,9 @@ import React from 'react'; -import {GoslingSpec} from "gosling.js"; -import type {Datum} from 'gosling.js/dist/src/gosling-schema'; -import MetaTable from "./MetaTable"; -import PhyloTree from "./PhyloTree"; -import {MetaSpec} from "./GoslingMetaComponent"; +import { GoslingSpec } from 'gosling.js'; +import type { Datum } from 'gosling.js/dist/src/gosling-schema'; +import MetaTable from './MetaTable'; +import PhyloTree from './PhyloTree'; +import { MetaSpec } from './GoslingMetaComponent'; interface MetaComponentWrapperProps { metaSpec: MetaSpec; @@ -11,12 +11,24 @@ interface MetaComponentWrapperProps { setGoslingSpec: (object) => void; linkedTrackId: string; data: Datum[]; - range: [{ chromosome: string, position: number }, { - chromosome: string, - position: number - }]; + range: [ + { chromosome: string; position: number }, + { + chromosome: string; + position: number; + } + ]; height: number; width: number; + setZoomTo: ( + range: [ + { chromosome: string; position: number }, + { + chromosome: string; + position: number; + } + ] + ) => void; } /** @@ -25,23 +37,37 @@ interface MetaComponentWrapperProps { * @returns */ export default function MetaComponentWrapper(props: MetaComponentWrapperProps) { - const {metaSpec, goslingSpec, setGoslingSpec, linkedTrackId, data, range, height, width} = props; + const { metaSpec, goslingSpec, setGoslingSpec, linkedTrackId, data, range, height, width, setZoomTo } = props; let metaView: React.ReactElement | null = null; switch (metaSpec.type) { - case "table": - metaView = + case 'table': + metaView = ( + + ); break; - case "tree": - metaView = + case 'tree': + metaView = ( + + ); break; } - return (
{metaView}
); + return
{metaView}
; } diff --git a/src/MetaTable.tsx b/src/MetaTable.tsx index 842b60e..f30cef7 100644 --- a/src/MetaTable.tsx +++ b/src/MetaTable.tsx @@ -1,29 +1,42 @@ -import React, {useCallback, useMemo} from 'react'; -import {mergeData, renameColumns} from "./table-data-transform"; -import type {Datum, DataDeep} from 'gosling.js/dist/src/gosling-schema'; +import React, { useCallback, useMemo } from 'react'; +import { mergeData, renameColumns } from './table-data-transform'; +import type { DataDeep, Datum } from 'gosling.js/dist/src/gosling-schema'; +import TanStackTable from './TanStackTable'; export type MetaTableSpec = { - type: "table", - // TODO: allow custom data specification for metatable - data?: DataDeep; + type: 'table'; + data: DataDeep; dataTransform: tableDataTransform[]; genomicColumns: [string] | [string, string]; - metadataColumns: { type: 'genomic' | 'nominal' | 'quantitative', columnName: string, columnFormat: string }[]; -} + chromosomeField: string; + metadataColumns: { type: 'genomic' | 'nominal' | 'quantitative'; columnName: string; columnFormat: string }[]; + linkageType: 'jump' | 'window'; // jump: Click button in the table to jump to a gene in the visualization, window: The table shows only the selected range in the visualization + dataId: 'string'; +}; -interface MetaTableProps extends Omit { +interface MetaTableProps extends Omit { data: Datum[]; - range: [{ chromosome: string, position: number }, { - chromosome: string, - position: number - }] + range: [ + { chromosome: string; position: number }, + { + chromosome: string; + position: number; + } + ]; width: number | string; height: number | string; + setZoomTo: ( + range: [ + { chromosome: string; position: number }, + { + chromosome: string; + position: number; + } + ] + ) => void; } -export type tableDataTransform = - | MergeColumnsTransform - | RenameColumnsTransform; +export type tableDataTransform = MergeColumnsTransform | RenameColumnsTransform; export interface MergeColumnsTransform { type: 'merge'; @@ -33,7 +46,7 @@ export interface MergeColumnsTransform { } export interface RenameColumnsTransform { - type: 'rename', + type: 'rename'; fields: string[]; newFields: string[]; } @@ -44,84 +57,103 @@ export interface RenameColumnsTransform { * @constructor */ export default function MetaTable(props: MetaTableProps) { - const {data, range, dataTransform, genomicColumns, metadataColumns, width, height} = props; - const transformData = useCallback((data) => { - let dataTransformed: Datum[] = Array.from(data); - dataTransform.forEach(transform => { - switch (transform.type) { - case("merge"): - dataTransformed = mergeData(transform, data); - break; - case("rename"): - dataTransformed = renameColumns(transform, data); - break; - } - }) - return (dataTransformed); - }, [dataTransform]); + const { + data, + range, + dataTransform, + genomicColumns, + chromosomeField, + metadataColumns, + linkageType = 'window', + width, + height, + setZoomTo + } = props; + const transformData = useCallback( + data => { + let dataTransformed: Datum[] = Array.from(data); + dataTransform.forEach(transform => { + switch (transform.type) { + case 'merge': + dataTransformed = mergeData(transform, data); + break; + case 'rename': + dataTransformed = renameColumns(transform, data); + break; + } + }); + return dataTransformed; + }, + [dataTransform] + ); const dataInRange = useMemo(() => { - let inRange: Datum[]; - // features have start and end - if (genomicColumns.length === 2) { - const start = genomicColumns[0]; - const end = genomicColumns[1]; - inRange = data.filter( - entry => - (Number(entry[start]) > range[0].position && Number(entry[start]) < range[1].position) || - (Number(entry[end]) > range[0].position && Number(entry[end]) < range[1].position) - ); - // features have only start (point features) - } else { - const position = genomicColumns[0]; - inRange = data.filter( - entry => Number(entry[position]) > range[0].position && Number(entry[position]) < range[1].position - ); + switch (linkageType) { + case 'window': { + let inRange: Datum[]; + // features have start and end + if (genomicColumns.length === 2) { + const start = genomicColumns[0]; + const end = genomicColumns[1]; + inRange = data.filter( + entry => + (Number(entry[start]) > range[0].position && Number(entry[start]) < range[1].position) || + (Number(entry[end]) > range[0].position && Number(entry[end]) < range[1].position) + ); + // features have only start (point features) + } else { + const position = genomicColumns[0]; + inRange = data.filter( + entry => + Number(entry[position]) > range[0].position && Number(entry[position]) < range[1].position + ); + } + const uniqueInRange = inRange.filter( + (v, i, a) => a.findIndex(v2 => JSON.stringify(v2) === JSON.stringify(v)) === i + ); + return transformData(uniqueInRange); + } + case 'jump': + return transformData(data); } - const uniqueInRange = inRange.filter( - (v, i, a) => a.findIndex(v2 => JSON.stringify(v2) === JSON.stringify(v)) === i - ); - return (transformData(uniqueInRange)); - }, [genomicColumns, data, range]) + }, [genomicColumns, data, range]); const columnNames = useMemo(() => { return metadataColumns.map(d => d.columnName) ?? (dataInRange.length > 0 ? Object.keys(dataInRange[0]) : []); - }, [metadataColumns, dataInRange]) + }, [metadataColumns, dataInRange]); + const jump = useCallback( + row => { + const pos1 = { + chromosome: String(row[chromosomeField]), + position: Number(row[genomicColumns[0]]) + }; + if (genomicColumns.length == 2) { + const pos2 = { + chromosome: String(row[chromosomeField]), + position: Number(row[genomicColumns[1]]) + }; + setZoomTo([pos1, pos2]); + } else { + setZoomTo([pos1, pos1]); + } + }, + [chromosomeField, genomicColumns] + ); return ( <> - {dataInRange.length === 0 ? null : + {dataInRange.length === 0 ? null : (
- - - - {columnNames.map(d => ( - - ))} - - - - {dataInRange.map(d => ( - - {columnNames.map(key => { - return ( - - ); - })} - - ))} - -
- {d} -
- {d[key]} -
+
- } + )} ); } diff --git a/src/PhyloTree.tsx b/src/PhyloTree.tsx index 7a45294..61d786f 100644 --- a/src/PhyloTree.tsx +++ b/src/PhyloTree.tsx @@ -1,22 +1,17 @@ -import React, {useCallback, useState, useMemo, useEffect} from 'react'; -import type { - DataDeep, - Datum, - PartialTrack, - Track, - View -} from 'gosling.js/dist/src/gosling-schema'; -import {GoslingSpec} from "gosling.js"; -import {Vega} from "react-vega"; - +import React, { useCallback, useState, useMemo, useEffect } from 'react'; +import type { DataDeep, PartialTrack, Track, View } from 'gosling.js/dist/src/gosling-schema'; +import { GoslingSpec } from 'gosling.js'; +import { Vega } from 'react-vega'; +import { Spec } from 'vega'; export type PhyloTreeSpec = { - type: "tree", + type: 'tree'; data: DataDeep; -} + width: number; +}; interface PhyloTreeProps { - data?: Datum[]; + dataUrl: string; gosSpec: GoslingSpec; setGoslingSpec: (object) => void; linkedTrackId: string; @@ -24,11 +19,10 @@ interface PhyloTreeProps { height: number; } - export default function PhyloTree(props: PhyloTreeProps) { - const {gosSpec, setGoslingSpec, linkedTrackId, width, height} = props; + const { dataUrl, gosSpec, setGoslingSpec, linkedTrackId, width, height } = props; const [maxDist, setMaxDist] = useState(1); - const [trackOrder, setTrackOrder] = useState([]) + const [trackOrder, setTrackOrder] = useState([]); const [containerWidth, setContainerWidth] = useState(width); // the width of the tree needs to be recalculated since the width of the tree leaves can vary const localWidth = useMemo(() => { @@ -37,36 +31,42 @@ export default function PhyloTree(props: PhyloTreeProps) { } else { return width; } - }, [width, containerWidth]) - const traverseTracks = useCallback(( - spec: GoslingSpec | View | PartialTrack, - callback: (t: Partial, i: number, ts: Partial[]) => void) => { - if ('tracks' in spec) { - spec.tracks.forEach((t, i, ts) => { - traverseTracks(t, callback); - }); - } else if ('views' in spec) { - spec.views.forEach((t, i, ts) => { - callback(t, i, ts); - traverseTracks(t, callback); - }); - } - }, []) + }, [width, containerWidth]); + const traverseTracks = useCallback( + ( + spec: GoslingSpec | View | PartialTrack, + callback: (t: Partial, i: number, ts: Partial[]) => void + ) => { + if ('tracks' in spec) { + spec.tracks.forEach(t => { + traverseTracks(t, callback); + }); + } else if ('views' in spec) { + spec.views.forEach((t, i, ts) => { + callback(t, i, ts); + traverseTracks(t, callback); + }); + } + }, + [] + ); useEffect(() => { if (trackOrder.length > 0) { const spec = structuredClone(gosSpec); - traverseTracks(spec, (viewSpec: GoslingSpec | View | PartialTrack, i: number, parentTracks: Partial[]) => { - if (viewSpec.id === linkedTrackId) { - parentTracks[i] = {...viewSpec, row: {...viewSpec.row, domain: trackOrder}}; - setGoslingSpec(spec) + traverseTracks( + spec, + (viewSpec: GoslingSpec | View | PartialTrack, i: number, parentTracks: Partial[]) => { + if (viewSpec.id === linkedTrackId) { + parentTracks[i] = { ...viewSpec, row: { ...viewSpec.row, domain: trackOrder } }; + setGoslingSpec(spec); + } } - }); + ); } - }, [trackOrder]) - - const vegaSpec = useMemo(() => { - return ({ + }, [trackOrder, gosSpec, linkedTrackId]); + const vegaSpec: Spec = useMemo(() => { + return { $schema: 'https://vega.github.io/schema/vega/v5.json', description: 'An example of Cartesian layouts for a node-link diagram of hierarchical data.', width: localWidth, @@ -75,7 +75,7 @@ export default function PhyloTree(props: PhyloTreeProps) { data: [ { name: 'tree', - url: 'https://s3.amazonaws.com/gosling-lang.org/data/GeneSpy/gene_spy_tree.json', + url: dataUrl, transform: [ { type: 'stratify', @@ -85,15 +85,15 @@ export default function PhyloTree(props: PhyloTreeProps) { { type: 'tree', method: 'cluster', - field: {field: 'distance'}, - sort: {field: 'value', order: 'ascending'}, - size: [{signal: 'height'}, {signal: 'width'}], + field: { field: 'distance' }, + sort: { field: 'value', order: 'ascending' }, + size: [{ signal: 'height' }, { signal: 'width' }], separation: false, as: ['y', 'x', 'depth', 'children'] }, { type: 'formula', - expr: 'width * (datum.distance/' + maxDist + ')', + expr: `width * (datum.distance/${maxDist})`, as: 'x' } ] @@ -112,7 +112,7 @@ export default function PhyloTree(props: PhyloTreeProps) { name: 'links', source: 'tree', transform: [ - {type: 'treelinks'}, + { type: 'treelinks' }, { type: 'linkpath', orient: 'horizontal', @@ -124,60 +124,59 @@ export default function PhyloTree(props: PhyloTreeProps) { marks: [ { type: 'path', - from: {data: 'links'}, + from: { data: 'links' }, encode: { update: { - path: {field: 'path'}, - stroke: {value: '#000'} + path: { field: 'path' }, + stroke: { value: '#000' } } } }, { type: 'rule', - from: {data: 'leaves'}, + from: { data: 'leaves' }, encode: { update: { - x: {field: 'x'}, - y: {field: 'y'}, - x2: {value: localWidth}, - y2: {field: 'y'}, - stroke: {value: '#eee'}, + x: { field: 'x' }, + y: { field: 'y' }, + x2: { value: localWidth }, + y2: { field: 'y' }, + stroke: { value: '#eee' } } } }, { type: 'text', - from: {data: 'leaves'}, + from: { data: 'leaves' }, encode: { enter: { - text: {field: 'name'}, - fontSize: {value: 9}, - baseline: {value: 'middle'} + text: { field: 'name' }, + fontSize: { value: 9 }, + baseline: { value: 'middle' } }, update: { - x: {value: localWidth}, - y: {field: 'y'}, - dx: {signal: 'datum.children ? -7 : 7'}, - align: 'right' + x: { value: localWidth }, + y: { field: 'y' }, + dx: { signal: 'datum.children ? -7 : 7' } } } } ] - }) - }, [maxDist, height, width, localWidth]) - const onNewView = useCallback(view => { - const leaves = view.data('leaves').slice(); - const renderedWidth = view.container().getBoundingClientRect().width; - if (width < renderedWidth) { - setContainerWidth(renderedWidth); - } - leaves.sort((a, b) => a.x - b.x); - setTrackOrder(leaves.map(leaf => leaf.id)) - setMaxDist(Math.max(...leaves.map(d => d.distance))) - }, [width]) - - - return ( - + }; + }, [maxDist, height, width, localWidth, dataUrl]); + const onNewView = useCallback( + view => { + const leaves = view.data('leaves').slice(); + const renderedWidth = view.container().getBoundingClientRect().width; + if (width < renderedWidth) { + setContainerWidth(renderedWidth); + } + leaves.sort((a, b) => a.x - b.x); + setTrackOrder(leaves.map(leaf => leaf.id)); + setMaxDist(Math.max(...leaves.map(d => d.distance))); + }, + [width] ); + + return ; } diff --git a/src/TanStackTable.tsx b/src/TanStackTable.tsx new file mode 100644 index 0000000..8911cae --- /dev/null +++ b/src/TanStackTable.tsx @@ -0,0 +1,159 @@ +import React from 'react'; + +import { ColumnDef, flexRender, getCoreRowModel, getSortedRowModel, Row, useReactTable } from '@tanstack/react-table'; +import { Datum } from 'gosling.js/dist/src/gosling-schema'; +import { useVirtualizer } from '@tanstack/react-virtual'; + +interface TanStackTableProps { + data: Datum[]; + columnNames: string[]; + isJumpable: boolean; + jump: (Datum) => void; + height: string | number; +} + +export default function TanStackTable(props: TanStackTableProps) { + const { data, columnNames, isJumpable, jump, height } = props; + const columns = React.useMemo[]>(() => { + const dataColumns = columnNames.map(col => { + return { + accessorKey: col + }; + }); + if (isJumpable) { + return [ + ...dataColumns, + { + id: 'jump', + header: () => null, + size: 50, + cell: context => { + return ( + + ); + } + } + ]; + } else return dataColumns; + }, [columnNames, isJumpable]); + const table = useReactTable({ + data, + columns, + getCoreRowModel: getCoreRowModel(), + getSortedRowModel: getSortedRowModel() + }); + + const { rows } = table.getRowModel(); + + //The virtualizer needs to know the scrollable container element + const tableContainerRef = React.useRef(null); + + const rowVirtualizer = useVirtualizer({ + count: rows.length, + estimateSize: () => 38, //estimate row height for accurate scrollbar dragging + getScrollElement: () => tableContainerRef.current, + //measure dynamic row height, except in firefox because it measures table border height incorrectly + measureElement: + typeof window !== 'undefined' && navigator.userAgent.indexOf('Firefox') === -1 + ? element => element?.getBoundingClientRect().height + : undefined, + overscan: 5 + }); + + return ( +
+
+ {/* Even though we're still using sematic table tags, we must use CSS grid and flexbox for dynamic row heights */} + + + {table.getHeaderGroups().map(headerGroup => ( + + {headerGroup.headers.map(header => { + return ( + + ); + })} + + ))} + + + {rowVirtualizer.getVirtualItems().map(virtualRow => { + const row = rows[virtualRow.index] as Row; + return ( + rowVirtualizer.measureElement(node)} //measure dynamic row height + key={row.id} + style={{ + display: 'flex', + position: 'absolute', + transform: `translateY(${virtualRow.start}px)`, //this should always be a `style` as it changes on scroll + width: '100%' + }} + > + {row.getVisibleCells().map(cell => { + return ( + + ); + })} + + ); + })} + +
+
+ {flexRender(header.column.columnDef.header, header.getContext())} + {{ + asc: ' 🔼', + desc: ' 🔽' + }[header.column.getIsSorted() as string] ?? null} +
+
+ {flexRender(cell.column.columnDef.cell, cell.getContext())} +
+
+
+ ); +} diff --git a/src/table-data-transform.test.ts b/src/table-data-transform.test.ts index e08740b..327dce6 100644 --- a/src/table-data-transform.test.ts +++ b/src/table-data-transform.test.ts @@ -1,14 +1,13 @@ -import {mergeData, renameColumns} from "./table-data-transform"; - +import { mergeData, renameColumns } from './table-data-transform'; describe('Table Data Transformation', () => { it('Merge', () => { - const merged = mergeData({type: 'merge', fields: ['a', 'b'], mergeChar: '/', newField: 'd'}, [ - {a: 'a', b: 1, c: 'c'}, - {a: 'b', b: '1', c: 'd'}, - {a: 'a', b: 3, c: 'c'}, - {a: 'b', b: 4, c: 'a'}, - {a: 'b', b: '4', c: 'c'} + const merged = mergeData({ type: 'merge', fields: ['a', 'b'], mergeChar: '/', newField: 'd' }, [ + { a: 'a', b: 1, c: 'c' }, + { a: 'b', b: '1', c: 'd' }, + { a: 'a', b: 3, c: 'c' }, + { a: 'b', b: 4, c: 'a' }, + { a: 'b', b: '4', c: 'c' } ]); expect(merged).toMatchInlineSnapshot(` [ @@ -36,12 +35,12 @@ describe('Table Data Transformation', () => { `); }); it('Rename', () => { - const renamed = renameColumns({type: 'rename', fields: ['a', 'b'], newFields: ['d', 'e']}, [ - {a: 'a', b: 1, c: 'c'}, - {a: 'b', b: '1', c: 'd'}, - {a: 'a', b: 3, c: 'c'}, - {a: 'b', b: 4, c: 'a'}, - {a: 'b', b: '4', c: 'c'} + const renamed = renameColumns({ type: 'rename', fields: ['a', 'b'], newFields: ['d', 'e'] }, [ + { a: 'a', b: 1, c: 'c' }, + { a: 'b', b: '1', c: 'd' }, + { a: 'a', b: 3, c: 'c' }, + { a: 'b', b: 4, c: 'a' }, + { a: 'b', b: '4', c: 'c' } ]); expect(renamed).toMatchInlineSnapshot(` [ diff --git a/src/table-data-transform.ts b/src/table-data-transform.ts index 57a5e39..682f112 100644 --- a/src/table-data-transform.ts +++ b/src/table-data-transform.ts @@ -1,43 +1,37 @@ -import type { - MergeColumnsTransform, RenameColumnsTransform -} from './MetaTable'; -import type {Datum} from 'gosling.js/dist/src/gosling-schema'; - +import type { MergeColumnsTransform, RenameColumnsTransform } from './MetaTable'; +import type { Datum } from 'gosling.js/dist/src/gosling-schema'; /** * Apply filter */ export function mergeData(transform: MergeColumnsTransform, data: Datum[]) { - const {fields, mergeChar, newField} = transform; + const { fields, mergeChar, newField } = transform; const output = data.map(d => { const returnObj: Datum = {}; - const values = fields.map(f => d[f]).filter(v => v !== "" && v !== undefined && v !== null); - returnObj[newField] = values.length>0?values.reduce((a, v) => a + mergeChar + v):""; - Object.keys(d).forEach(key=>{ - if(!transform.fields.includes(key)){ - returnObj[key]=d[key] + const values = fields.map(f => d[f]).filter(v => v !== '' && v !== undefined && v !== null); + returnObj[newField] = values.length > 0 ? values.reduce((a, v) => a + mergeChar + v) : ''; + Object.keys(d).forEach(key => { + if (!transform.fields.includes(key)) { + returnObj[key] = d[key]; } - }) - return(returnObj); - }) - return (output); + }); + return returnObj; + }); + return output; } - export function renameColumns(transform: RenameColumnsTransform, data: Datum[]) { - const {fields, newFields} = transform; - const output: Datum[] = data.map(d => { - const returnObj:Datum = {}; + const { fields, newFields } = transform; + return data.map(d => { + const returnObj: Datum = {}; Object.keys(d).forEach(key => { const fieldIndex = fields.indexOf(key); if (fieldIndex === -1) { - returnObj[key] = d[key] + returnObj[key] = d[key]; } else { - returnObj[newFields[fieldIndex]] = d[key] + returnObj[newFields[fieldIndex]] = d[key]; } - }) - return (returnObj) - }) - return (output); + }); + return returnObj; + }); } - diff --git a/tsconfig.json b/tsconfig.json index 5f76b80..76bdb8b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,6 +17,6 @@ "jsx": "react", "types": ["vitest/globals"] }, - "include": ["./src", "./demo"], + "include": ["./src", "./demo", ".eslintrc.js"], "exclude": ["node_modules"] } diff --git a/yarn.lock b/yarn.lock index f012b2b..a51e712 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + "@ampproject/remapping@^2.2.0": version "2.2.1" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" @@ -217,116 +222,231 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@esbuild/aix-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" + integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== + "@esbuild/android-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== +"@esbuild/android-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" + integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== + "@esbuild/android-arm@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== +"@esbuild/android-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" + integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== + "@esbuild/android-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== +"@esbuild/android-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" + integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== + "@esbuild/darwin-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276" integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== +"@esbuild/darwin-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" + integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== + "@esbuild/darwin-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== +"@esbuild/darwin-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" + integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== + "@esbuild/freebsd-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== +"@esbuild/freebsd-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" + integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== + "@esbuild/freebsd-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== +"@esbuild/freebsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" + integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== + "@esbuild/linux-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== +"@esbuild/linux-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" + integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== + "@esbuild/linux-arm@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== +"@esbuild/linux-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" + integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== + "@esbuild/linux-ia32@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== +"@esbuild/linux-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" + integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== + "@esbuild/linux-loong64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== +"@esbuild/linux-loong64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" + integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== + "@esbuild/linux-mips64el@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== +"@esbuild/linux-mips64el@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" + integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== + "@esbuild/linux-ppc64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== +"@esbuild/linux-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" + integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== + "@esbuild/linux-riscv64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== +"@esbuild/linux-riscv64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" + integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== + "@esbuild/linux-s390x@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== +"@esbuild/linux-s390x@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" + integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== + "@esbuild/linux-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== +"@esbuild/linux-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" + integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== + "@esbuild/netbsd-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== +"@esbuild/netbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" + integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== + "@esbuild/openbsd-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== +"@esbuild/openbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" + integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== + "@esbuild/sunos-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== +"@esbuild/sunos-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" + integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== + "@esbuild/win32-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== +"@esbuild/win32-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" + integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== + "@esbuild/win32-ia32@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== +"@esbuild/win32-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" + integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== + "@esbuild/win32-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== +"@esbuild/win32-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" + integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== + "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -339,14 +459,19 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== -"@eslint/eslintrc@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" - integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== +"@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.5.2" + espree "^9.6.0" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -354,10 +479,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.40.0.tgz#3ba73359e11f5a7bd3e407f70b3528abfae69cec" - integrity sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA== +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== "@gmod/bam@^1.1.18": version "1.1.18" @@ -423,13 +548,13 @@ resolved "https://registry.yarnpkg.com/@gmod/vcf/-/vcf-5.0.10.tgz#6c2d7952b15f61642454be90119ea89fd3c227de" integrity sha512-o7QuPcOeXlJpzwQaFmgojhNvJE4yB9fhrfVEDKpkDjV27pAqwMy89367vtXu4JfBFE9t4zZ6sQRkqYaJ+cIheg== -"@humanwhocodes/config-array@^0.11.8": - version "0.11.8" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" - integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -437,10 +562,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== "@icons/material@^0.2.4": version "0.2.4" @@ -705,6 +830,95 @@ resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.6.3.tgz#8205baf6e17ef93be35bf62c37d2d594e9be0dad" integrity sha512-EXJysQ7J3veRECd0kZFQwYYd5sJMcq2O/m60zu1W2l3oVQ9xtub8jTOtYRE0+M2iomyG/W3Ps7+vp2kna0C27Q== +"@rollup/rollup-android-arm-eabi@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz#b98786c1304b4ff8db3a873180b778649b5dff2b" + integrity sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg== + +"@rollup/rollup-android-arm64@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz#8833679af11172b1bf1ab7cb3bad84df4caf0c9e" + integrity sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q== + +"@rollup/rollup-darwin-arm64@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz#ef02d73e0a95d406e0eb4fd61a53d5d17775659b" + integrity sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g== + +"@rollup/rollup-darwin-x64@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz#3ce5b9bcf92b3341a5c1c58a3e6bcce0ea9e7455" + integrity sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg== + +"@rollup/rollup-linux-arm-gnueabihf@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz#3d3d2c018bdd8e037c6bfedd52acfff1c97e4be4" + integrity sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ== + +"@rollup/rollup-linux-arm64-gnu@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz#5fc8cc978ff396eaa136d7bfe05b5b9138064143" + integrity sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w== + +"@rollup/rollup-linux-arm64-musl@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz#f2ae7d7bed416ffa26d6b948ac5772b520700eef" + integrity sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw== + +"@rollup/rollup-linux-riscv64-gnu@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz#303d57a328ee9a50c85385936f31cf62306d30b6" + integrity sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA== + +"@rollup/rollup-linux-x64-gnu@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz#f672f6508f090fc73f08ba40ff76c20b57424778" + integrity sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA== + +"@rollup/rollup-linux-x64-musl@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz#d2f34b1b157f3e7f13925bca3288192a66755a89" + integrity sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw== + +"@rollup/rollup-win32-arm64-msvc@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz#8ffecc980ae4d9899eb2f9c4ae471a8d58d2da6b" + integrity sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA== + +"@rollup/rollup-win32-ia32-msvc@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz#a7505884f415662e088365b9218b2b03a88fc6f2" + integrity sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw== + +"@rollup/rollup-win32-x64-msvc@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz#6abd79db7ff8d01a58865ba20a63cfd23d9e2a10" + integrity sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw== + +"@tanstack/react-table@^8.10.7": + version "8.10.7" + resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.10.7.tgz#733f4bee8cf5aa19582f944dd0fd3224b21e8c94" + integrity sha512-bXhjA7xsTcsW8JPTTYlUg/FuBpn8MNjiEPhkNhIGCUR6iRQM2+WEco4OBpvDeVcR9SE+bmWLzdfiY7bCbCSVuA== + dependencies: + "@tanstack/table-core" "8.10.7" + +"@tanstack/react-virtual@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.1.3.tgz#4ef2a7dd819a7dd2b634d50cbd6ba498f06529ec" + integrity sha512-YCzcbF/Ws/uZ0q3Z6fagH+JVhx4JLvbSflgldMgLsuvB8aXjZLLb3HvrEVxY480F9wFlBiXlvQxOyXb5ENPrNA== + dependencies: + "@tanstack/virtual-core" "3.1.3" + +"@tanstack/table-core@8.10.7": + version "8.10.7" + resolved "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.10.7.tgz#577e8a635048875de4c9d6d6a3c21d26ff9f9d08" + integrity sha512-KQk5OMg5OH6rmbHZxuNROvdI+hKDIUxANaHlV+dPlNN7ED3qYQ/WkpY2qlXww1SIdeMlkIhpN/2L00rof0fXFw== + +"@tanstack/virtual-core@3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.1.3.tgz#77ced625f19ec9350f6e460f142b3be9bff03866" + integrity sha512-Y5B4EYyv1j9V8LzeAoOVeTg0LI7Fo5InYKgAjkY1Pu9GjtUwX/EKxNcU7ng3sKr99WEf+bPTcktAeybyMOYo+g== + "@types/chai-subset@^1.3.3": version "1.3.3" resolved "https://registry.yarnpkg.com/@types/chai-subset/-/chai-subset-1.3.3.tgz#97893814e92abd2c534de422cb377e0e0bdaac94" @@ -727,6 +941,11 @@ resolved "https://registry.yarnpkg.com/@types/earcut/-/earcut-2.1.1.tgz#573a0af609f17005c751f6f4ffec49cfe358ea51" integrity sha512-w8oigUCDjElRHRRrMvn/spybSMyX8MTkKA5Dv+tS1IE/TgmNZPqUYtvYBXGY8cieSE66gm+szeK+bnbxC2xHTQ== +"@types/estree@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + "@types/estree@^1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" @@ -877,6 +1096,11 @@ "@typescript-eslint/types" "5.59.6" eslint-visitor-keys "^3.3.0" +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + "@vitejs/plugin-react@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.0.0.tgz#46d1c37c507447d10467be1c111595174555ef28" @@ -953,11 +1177,16 @@ acorn-walk@^8.2.0: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.8.0, acorn@^8.8.2: +acorn@^8.8.2: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -1736,6 +1965,11 @@ d3-zoom@^3.0.0: d3-selection "2 - 3" d3-transition "2 - 3" +damerau-levenshtein@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + date-time@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/date-time/-/date-time-3.1.0.tgz#0d1e934d170579f481ed8df1e2b8ff70ee845e1e" @@ -1750,7 +1984,7 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.2, debug@^4.3.4: +debug@^4.1.0, debug@^4.2.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -1948,6 +2182,35 @@ esbuild@^0.17.5: "@esbuild/win32-ia32" "0.17.19" "@esbuild/win32-x64" "0.17.19" +esbuild@^0.20.1: + version "0.20.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" + integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== + optionalDependencies: + "@esbuild/aix-ppc64" "0.20.2" + "@esbuild/android-arm" "0.20.2" + "@esbuild/android-arm64" "0.20.2" + "@esbuild/android-x64" "0.20.2" + "@esbuild/darwin-arm64" "0.20.2" + "@esbuild/darwin-x64" "0.20.2" + "@esbuild/freebsd-arm64" "0.20.2" + "@esbuild/freebsd-x64" "0.20.2" + "@esbuild/linux-arm" "0.20.2" + "@esbuild/linux-arm64" "0.20.2" + "@esbuild/linux-ia32" "0.20.2" + "@esbuild/linux-loong64" "0.20.2" + "@esbuild/linux-mips64el" "0.20.2" + "@esbuild/linux-ppc64" "0.20.2" + "@esbuild/linux-riscv64" "0.20.2" + "@esbuild/linux-s390x" "0.20.2" + "@esbuild/linux-x64" "0.20.2" + "@esbuild/netbsd-x64" "0.20.2" + "@esbuild/openbsd-x64" "0.20.2" + "@esbuild/sunos-x64" "0.20.2" + "@esbuild/win32-arm64" "0.20.2" + "@esbuild/win32-ia32" "0.20.2" + "@esbuild/win32-x64" "0.20.2" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -2026,6 +2289,15 @@ eslint-plugin-import@^2.25.2: semver "^6.3.0" tsconfig-paths "^3.14.1" +eslint-plugin-jsx-a11y@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-2.2.3.tgz#4e35cb71b8a7db702ac415c806eb8e8d9ea6c65d" + integrity sha512-OS+axp7UzxE7fmiTHiv9GEavlCfYFIXLQvyEZLMOAJB1/wALDVfWi2KPlj9TKbP97cof/7ZSVwaG6lpUKq8Tog== + dependencies: + damerau-levenshtein "^1.0.0" + jsx-ast-utils "^1.0.0" + object-assign "^4.0.1" + eslint-plugin-n@^15.0.0: version "15.7.0" resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz#e29221d8f5174f84d18f2eb94765f2eeea033b90" @@ -2081,10 +2353,10 @@ eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" - integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -2118,27 +2390,33 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== -eslint@^8.0.1: - version "8.40.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.40.0.tgz#a564cd0099f38542c4e9a2f630fa45bf33bc42a4" - integrity sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ== +eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.57.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.0.3" - "@eslint/js" "8.40.0" - "@humanwhocodes/config-array" "^0.11.8" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.2.0" - eslint-visitor-keys "^3.4.1" - espree "^9.5.2" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -2146,22 +2424,19 @@ eslint@^8.0.1: find-up "^5.0.0" glob-parent "^6.0.2" globals "^13.19.0" - grapheme-splitter "^1.0.4" + graphemer "^1.4.0" ignore "^5.2.0" - import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" - js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" + optionator "^0.9.3" strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" text-table "^0.2.0" esm@^3.2.25: @@ -2169,12 +2444,12 @@ esm@^3.2.25: resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== -espree@^9.5.2: - version "9.5.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" - integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - acorn "^8.8.0" + acorn "^8.9.0" acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" @@ -2367,6 +2642,11 @@ fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -2520,10 +2800,10 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -gosling.js@^0.13.2: - version "0.13.2" - resolved "https://registry.yarnpkg.com/gosling.js/-/gosling.js-0.13.2.tgz#4146580280839a716e898a6701a5854eb022c54f" - integrity sha512-ObLH+Fe26JRQjgyDXfENg4/9U/+uoj86h7CkNFfntBJpKakpnVMgmxc0318cSVndh//24iC3q0gEdRvdJhjCYg== +gosling.js@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/gosling.js/-/gosling.js-0.16.0.tgz#28db73c09d11dedce5e7c4a8229018473d000cab" + integrity sha512-muVxMUqdTaYbRtr7br6i8NGH4boVwljYbbQQc/39ERJdkJIVBDRxB/d30KfL6rxxVU+RXJCauoiMwmkD4EBrcQ== dependencies: "@gmod/bam" "^1.1.18" "@gmod/bbi" "^3.0.1" @@ -2545,7 +2825,7 @@ gosling.js@^0.13.2: events "^3.3.0" fflate "^0.7.1" generic-filehandle "^3.0.1" - higlass "^1.13.3" + higlass "^1.13.4" higlass-register "^0.3.0" higlass-text "^0.1.1" json-stringify-pretty-compact "^2.0.0" @@ -2569,6 +2849,11 @@ grapheme-splitter@^1.0.4: resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" @@ -2675,10 +2960,10 @@ higlass@^1.12.4: url-parse "^1.4.3" vkbeautify "^0.99.3" -higlass@^1.13.3: - version "1.13.3" - resolved "https://registry.yarnpkg.com/higlass/-/higlass-1.13.3.tgz#8bf01bce70f64fa333cb589433c2bca808542334" - integrity sha512-aZ+Q+ClF1TTeV81ChuGSd5CHiVJf8+1c6w6/sXGAOonkGVQ54yuZpSYafMatKAjytM6/fwSaHs3uQT2xUEE2MA== +higlass@^1.13.4: + version "1.13.4" + resolved "https://registry.yarnpkg.com/higlass/-/higlass-1.13.4.tgz#3bc837713bce99cc8e8e05fea8a60555e18cec56" + integrity sha512-mIr+Yi5aR0zBAB9iqlqTz/K3ZusrGz8f20g5DHaaRZ/FzMOcFsdL+9ESIPndPZrN2Y/GQ4CHilNjPTTSncIOTg== dependencies: ajv "^6.10.0" box-intersect "^1.0.1" @@ -2749,7 +3034,7 @@ ignore@^5.1.1, ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== -import-fresh@^3.0.0, import-fresh@^3.2.1: +import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -2950,11 +3235,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -js-sdsl@^4.1.4: - version "4.4.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" - integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== - js-string-escape@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" @@ -3036,6 +3316,11 @@ jspdf@^2.3.1: dompurify "^2.2.0" html2canvas "^1.0.0-rc.5" +jsx-ast-utils@^1.0.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" + integrity sha512-0LwSmMlQjjUdXsdlyYhEfBJCn2Chm0zgUBmfmf1++KUULh+JOdlzrZfiwe2zmlVJx44UF+KX/B/odBoeK9hxmw== + "jsx-ast-utils@^2.4.1 || ^3.0.0": version "3.3.3" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" @@ -3225,6 +3510,11 @@ nanoid@^3.0.0, nanoid@^3.3.6: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + natural-compare-lite@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" @@ -3332,17 +3622,17 @@ once@^1.3.0: dependencies: wrappy "1" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" p-limit@^2.2.0: version "2.3.0" @@ -3535,6 +3825,15 @@ postcss@^8.4.23: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.35: + version "8.4.36" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.36.tgz#dba513c3c3733c44e0288a712894f8910bbaabc6" + integrity sha512-/n7eumA6ZjFHAsbX30yhHup/IMkOmlmvtEi7P+6RMYf+bGJSUHc3geH4a0NSZxAz/RJfiS9tooCTs9LAVYUZKw== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.1.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -3916,6 +4215,28 @@ rollup@^3.21.0: optionalDependencies: fsevents "~2.3.2" +rollup@^4.13.0: + version "4.13.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.13.0.tgz#dd2ae144b4cdc2ea25420477f68d4937a721237a" + integrity sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.13.0" + "@rollup/rollup-android-arm64" "4.13.0" + "@rollup/rollup-darwin-arm64" "4.13.0" + "@rollup/rollup-darwin-x64" "4.13.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.13.0" + "@rollup/rollup-linux-arm64-gnu" "4.13.0" + "@rollup/rollup-linux-arm64-musl" "4.13.0" + "@rollup/rollup-linux-riscv64-gnu" "4.13.0" + "@rollup/rollup-linux-x64-gnu" "4.13.0" + "@rollup/rollup-linux-x64-musl" "4.13.0" + "@rollup/rollup-win32-arm64-msvc" "4.13.0" + "@rollup/rollup-win32-ia32-msvc" "4.13.0" + "@rollup/rollup-win32-x64-msvc" "4.13.0" + fsevents "~2.3.2" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -4031,6 +4352,11 @@ source-map-js@^1.0.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-js@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.1.0.tgz#9e7d5cb46f0689fb6691b30f226937558d0fa94b" + integrity sha512-9vC2SfsJzlej6MAaMPLu8HiBSHGdRAJ9hVFYN1ibZoNkeanmDmLUcIrj6G9DGL7XMJ54AKg/G75akXl1/izTOw== + stackback@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" @@ -4130,7 +4456,7 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -4806,7 +5132,7 @@ vite-node@0.31.4: picocolors "^1.0.0" vite "^3.0.0 || ^4.0.0" -"vite@^3.0.0 || ^4.0.0", vite@^4.3.7: +"vite@^3.0.0 || ^4.0.0": version "4.3.7" resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.7.tgz#04f98ab0f4689490545b2f6fa0515e95072bb298" integrity sha512-MTIFpbIm9v7Hh5b0wSBgkcWzSBz7SAa6K/cBTwS4kUiQJfQLFlZZRJRQgqunCVzhTPCk674tW+0Qaqh3Q00dBg== @@ -4817,6 +5143,17 @@ vite-node@0.31.4: optionalDependencies: fsevents "~2.3.2" +vite@^5.2.0-beta.1: + version "5.2.0-beta.1" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.0-beta.1.tgz#b671fb248b2affe71447691d3411ec32a2d3b107" + integrity sha512-WafakNAXnM8M65JMiNITL4w7HcvC9jotSo6PjjQ7OdiPxl38NSvQWf3GMIAbnUi5A8zY3TKEcMlNA5p4jjMndw== + dependencies: + esbuild "^0.20.1" + postcss "^8.4.35" + rollup "^4.13.0" + optionalDependencies: + fsevents "~2.3.3" + vitest@^0.31.2: version "0.31.4" resolved "https://registry.yarnpkg.com/vitest/-/vitest-0.31.4.tgz#5abe02562675262949c10e40811f348a80f6b2a6" @@ -4909,11 +5246,6 @@ why-is-node-running@^2.2.2: siginfo "^2.0.0" stackback "0.0.2" -word-wrap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"