diff --git a/CHANGELOG.md b/CHANGELOG.md index 86a2844d..3c05dd16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). #### 0.2.0 +- fix: removeClipboardPackage [`#118`](https://github.com/TeselaGen/tg-oss/pull/118) +- refactor: AlignmentDemo [`#116`](https://github.com/TeselaGen/tg-oss/pull/116) +- fix open dialog issue for multiple Editor [`#110`](https://github.com/TeselaGen/tg-oss/pull/110) +- fix: ove test [`#114`](https://github.com/TeselaGen/tg-oss/pull/114) - Additional fillter remove props [`#115`](https://github.com/TeselaGen/tg-oss/pull/115) - chore: bump ui version [`#112`](https://github.com/TeselaGen/tg-oss/pull/112) - feat: Add form separator component [`#111`](https://github.com/TeselaGen/tg-oss/pull/111) diff --git a/package.json b/package.json index 8e71a9ea..9af58821 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,8 @@ "type": "module", "private": true, "dependencies": { - "@blueprintjs/core": "3.52.0", - "@blueprintjs/datetime": "3.23.19", + "@blueprintjs/core": "3.54.0", + "@blueprintjs/datetime": "^3.24.1", "@blueprintjs/select": "3.18.11", "@dnd-kit/core": "^6.1.0", "@dnd-kit/modifiers": "^7.0.0", @@ -25,7 +25,6 @@ "axios": "^0.21.1", "browser-or-node": "^2.0.0", "classnames": "^2.3.2", - "clipboard": "2.0.8", "color": "^3.2.1", "combokeys": "^3.0.1", "copy-to-clipboard": "^3.3.1", @@ -58,7 +57,7 @@ "react-dom": "^18.3.1", "react-draggable": "4.4.5", "react-dropzone": "^11.4.2", - "react-markdown": "8.0.7", + "react-markdown": "9.0.1", "react-measure": "^2.5.2", "react-redux": "^8.0.5", "react-rnd": "^10.2.4", @@ -71,7 +70,7 @@ "redux-form": "^8.3.10", "redux-ignore": "^1.2.5", "redux-thunk": "2.4.1", - "remark-gfm": "^3.0.1", + "remark-gfm": "^4.0.0", "reselect": "^4.1.7", "shortid": "^2.2.16", "tg-use-local-storage-state": "^16.0.3", diff --git a/packages/ove/cypress/e2e/cutsiteInfoView.spec.js b/packages/ove/cypress/e2e/cutsiteInfoView.spec.js index c0064f92..0bed5503 100644 --- a/packages/ove/cypress/e2e/cutsiteInfoView.spec.js +++ b/packages/ove/cypress/e2e/cutsiteInfoView.spec.js @@ -17,7 +17,7 @@ describe("cutsiteInfoView", function () { cy.get(`[data-test="cutsiteToolDropdown"]`).click(); cy.get(`.veToolbarCutsiteFilterHolder input`).type("{selectAll}esp3i"); cy.contains(`These Hidden enzymes match`); - cy.contains("Esp3I (2 cuts)").click(); + cy.contains("Esp3I (2 cuts)").click({ force: true }); cy.get(`.veToolbarCutsiteFilterHolder input`).should("not.exist"); //clicking the hidden enzyme should close the filter cy.contains("Esp3I (2 cuts) hidden"); cy.get( diff --git a/packages/ove/cypress/e2e/editing.spec.js b/packages/ove/cypress/e2e/editing.spec.js index a5e8a9c0..007d270d 100644 --- a/packages/ove/cypress/e2e/editing.spec.js +++ b/packages/ove/cypress/e2e/editing.spec.js @@ -58,7 +58,7 @@ describe("editing", function () { cy.contains("Caret Between Bases 5293 and 1"); cy.contains(".ve-row-item-sequence", "5'gtcttatga"); }); - it(`should be able to insert data around the origin correctly + it(`should be able to insert data around the origin correctly - new sequence should be inserted after the origin`, () => { cy.selectRange(5297, 3); cy.replaceSelection("aaaaaa"); @@ -68,7 +68,7 @@ describe("editing", function () { cy.replaceSelection("tt"); cy.contains("Selecting 2 bps from 3 to 4"); }); - it(`should be able to revComp, comp selections that wrap the origin correctly + it(`should be able to revComp, comp selections that wrap the origin correctly - new sequence should be inserted after the origin`, () => { cy.selectRange(5297, 3); cy.contains("Jump to start").click(); diff --git a/packages/ove/cypress/e2e/editor.spec.js b/packages/ove/cypress/e2e/editor.spec.js index 2de4bd4a..55f35ee0 100644 --- a/packages/ove/cypress/e2e/editor.spec.js +++ b/packages/ove/cypress/e2e/editor.spec.js @@ -154,7 +154,7 @@ describe("editor", function () { cy.tgToggle("shouldAutosave"); cy.contains(".veRowViewPart", "Part 0").first().click(); cy.get(".veRowViewSelectionLayer").first().trigger("contextmenu"); - cy.get(".bp3-menu-item").contains("Cut").click(); + cy.get(".bp3-menu-item").contains("Cut").realClick(); cy.contains("onCopy callback triggered"); cy.contains("onSave callback triggered"); cy.contains("Selection Cut"); @@ -167,7 +167,7 @@ describe("editor", function () { cy.get(".veRowViewSelectionLayer").first().trigger("contextmenu"); //tnrnote: cut in cypress only works on electron, not firefox or chrome - cy.get(".bp3-menu-item").contains("Cut").click(); + cy.get(".bp3-menu-item").contains("Cut").realClick(); cy.contains("Selection Cut"); cy.get(".tg-menu-bar").contains("File").click(); cy.get(".bp3-menu-item").contains("Save As").click(); diff --git a/packages/ove/cypress/e2e/globalDialog.spec.js b/packages/ove/cypress/e2e/globalDialog.spec.js new file mode 100644 index 00000000..3e6073a8 --- /dev/null +++ b/packages/ove/cypress/e2e/globalDialog.spec.js @@ -0,0 +1,68 @@ +describe("Global Dialogs", () => { + it(`feature/primer dialog should be able to open/close for multiple Editor`, () => { + cy.visit(""); + + const fistNodeSelector = ".standaloneDemoNode .veEditor.StandaloneEditor"; + const secondNodeSelector = ".standaloneDemoNode2 .veEditor.vector-editor2"; + + cy.contains(".bp3-button-text", "Show Sidebar").click(); + cy.contains(".demo-nav-link", "Standalone").should("exist"); + cy.contains(".demo-nav-link", "Standalone").click(); + + cy.contains(".bp3-button-text", "Open a second editor").click(); + cy.get(fistNodeSelector).should("exist"); + cy.get(secondNodeSelector).should("exist"); + + cy.contains( + `${fistNodeSelector} .ve-draggable-tabs .veTabProperties`, + "Properties" + ).click(); + cy.get( + `${fistNodeSelector} .ve-propertiesPanel .bp3-tabs .bp3-tab#bp3-tab-title_undefined_features` + ).click(); + cy.contains( + `${fistNodeSelector} .bp3-tab-panel .tg-cell-wrapper`, + "araC" + ).should("exist"); + + cy.contains( + `${secondNodeSelector} .ve-draggable-tabs .veTabProperties`, + "Properties" + ).click(); + cy.get( + `${secondNodeSelector} .ve-propertiesPanel .bp3-tabs .bp3-tab#bp3-tab-title_undefined_features` + ).click(); + cy.contains( + `${secondNodeSelector} .bp3-tab-panel .tg-cell-wrapper`, + "Untitled annotation" + ).should("exist"); + + cy.get( + `${fistNodeSelector} .veCircularView .circularViewSvg .veCircularViewTextWrapper` + ).click(); + cy.contains( + `${fistNodeSelector} .bp3-tab-panel .tg-cell-wrapper`, + "araC" + ).dblclick(); + cy.contains( + ".bp3-dialog .bp3-dialog-header .bp3-heading", + "Edit Feature" + ).should("exist"); + cy.get('.bp3-dialog input[value="araC"]').should("exist"); + cy.get(".bp3-dialog .bp3-dialog-close-button").click(); + + cy.get( + `${secondNodeSelector} .veCircularView .circularViewSvg .veCircularViewTextWrapper` + ).click(); + cy.contains( + `${secondNodeSelector} .bp3-tab-panel .tg-cell-wrapper`, + "Untitled annotation" + ).dblclick(); + cy.contains( + ".bp3-dialog .bp3-dialog-header .bp3-heading", + "Edit Feature" + ).should("exist"); + cy.get('.bp3-dialog input[value="Untitled annotation"]').should("exist"); + cy.get(".bp3-dialog .bp3-dialog-close-button").click(); + }); +}); diff --git a/packages/ove/cypress/e2e/menuBar.spec.js b/packages/ove/cypress/e2e/menuBar.spec.js index 932fe613..000c6590 100644 --- a/packages/ove/cypress/e2e/menuBar.spec.js +++ b/packages/ove/cypress/e2e/menuBar.spec.js @@ -186,7 +186,6 @@ describe("menuBar", function () { // eslint-disable-next-line cypress/no-unnecessary-waiting cy.wait(0); cy.focused().type("remove duplicate feature{enter}", { delay: 1 }); - cy.contains(".rt-td", "dbl term").should("exist"); cy.contains(".bp3-dialog button", "Remove 2 Duplicates"); cy.get(".bp3-dialog .bp3-icon-settings").click(); cy.get(".tg-test-ignore-name .tg-no-fill-field").click(); @@ -204,7 +203,7 @@ describe("menuBar", function () { cy.get(".tg-menu-bar-popover").contains("Select All").click(); cy.get(".tg-menu-bar").contains("Edit").click(); - cy.get(".tg-menu-bar-popover").contains("Cut").click(); + cy.get(".tg-menu-bar-popover").contains("Cut").realClick(); cy.get(".tg-menu-bar").contains("Edit").click({ force: true }); [ @@ -273,7 +272,7 @@ describe("menuBar", function () { cy.selectRange(2, 5); cy.get(".tg-menu-bar").contains("Edit").trigger("mouseover"); - cy.get(".tg-menu-bar-popover").contains("Cut").click(); + cy.get(".tg-menu-bar-popover").contains("Cut").realClick(); cy.get(".tg-menu-bar").contains("File").click(); cy.get(`[cmd="saveSequence"]`).should("not.have.class", "bp3-disabled"); @@ -290,7 +289,7 @@ describe("menuBar", function () { }); it(` goTo, rotateTo work -can't go to a position outside of the sequence - -can go to a position inside the sequence + -can go to a position inside the sequence -can rotate the sequence to that position `, () => { cy.get(".tg-menu-bar").contains("Edit").click(); @@ -329,7 +328,7 @@ describe("menuBar", function () { it(` select range, copy, cut works -cannot select range outside of sequence //TODO - -can select a valid range + -can select a valid range -can copy the select bps -can cut the selected bps `, function () { @@ -348,10 +347,10 @@ describe("menuBar", function () { cy.get(".veStatusBar").contains(`5299`); cy.get(".tg-menu-bar").contains("Edit").click(); - cy.get(".tg-menu-bar-popover").contains("Copy").click(); + cy.get(".tg-menu-bar-popover").contains("Copy").realClick(); cy.contains("Selection Copied"); cy.get(".tg-menu-bar").contains("Edit").click(); - cy.get(".tg-menu-bar-popover").contains("Cut").click(); + cy.get(".tg-menu-bar-popover").contains("Cut").realClick(); cy.contains("Selection Cut"); cy.get(".veStatusBar").contains(`5288`); }); diff --git a/packages/ove/cypress/e2e/oligoMode.spec.js b/packages/ove/cypress/e2e/oligoMode.spec.js index a8429f4d..09098b05 100644 --- a/packages/ove/cypress/e2e/oligoMode.spec.js +++ b/packages/ove/cypress/e2e/oligoMode.spec.js @@ -15,7 +15,7 @@ describe("oligo mode editing in OVE", function () { // eslint-disable-next-line cypress/no-unnecessary-waiting cy.wait(0); cy.focused().type("gatccaauu{enter}"); - cy.contains("Selecting 9 bps from 10 to 18"); //the t's should be filtered out + cy.contains("Selecting 9 bps from 10 to 18"); cy.contains("gatccaauu"); cy.get(".veTabProperties").click(); cy.contains("Circular/Linear:").should("not.exist"); diff --git a/packages/ove/cypress/e2e/properties.spec.js b/packages/ove/cypress/e2e/properties.spec.js index 7bb4db53..a034ff18 100644 --- a/packages/ove/cypress/e2e/properties.spec.js +++ b/packages/ove/cypress/e2e/properties.spec.js @@ -21,7 +21,7 @@ describe("properties", function () { cy.contains("textarea", `primer_bind complement(10..20)`); cy.contains("textarea", `/label="fakeprimer"`); }); - it(`should be able to delete a feature from the properties tab and not have the delete button still enabled; + it(`should be able to delete a feature from the properties tab and not have the delete button still enabled; - have the number of features correctly displayed -not be able to create a new feature if sequenceLength === 0`, () => { cy.get(".veTabProperties").click(); @@ -33,12 +33,13 @@ describe("properties", function () { cy.get(`.tgDeleteAnnsBtn`).should("not.have.class", "bp3-disabled").click(); cy.get(`.tgDeleteAnnsBtn`).should("have.class", "bp3-disabled"); - cy.get(".tgNewAnnBtn").should("not.have.class", "bp3-disabled"); cy.get(".tg-menu-bar").contains("Edit").click(); cy.get(".tg-menu-bar-popover").contains("Select All").click(); - cy.get(".veSelectionLayer").first().trigger("contextmenu", { force: true }); - cy.get(".bp3-menu-item").contains("Cut").click(); + cy.get( + ".veSelectionLayer:contains(Selecting 5299 bps from 1 to 5299)" + ).trigger("contextmenu", { force: true }); + cy.get(".bp3-menu-item").contains("Cut").realClick(); cy.get(".tgNewAnnBtn").should("have.class", "bp3-disabled"); }); it(`a custom properties tab should be able to be added`, () => { @@ -53,7 +54,7 @@ describe("properties", function () { cy.get(".circularLinearSelect select").select("Linear"); cy.contains(".bp3-dialog", "Truncate Annotations").should("be.visible"); }); - it(`we should be able to view and edit a description in general properties + it(`we should be able to view and edit a description in general properties and have that visible within the genbank view as well we should be able to edit a description in general properties, not make any changes, hit ok, and have the description not clear (bug! https://github.com/TeselaGen/lims/issues/5492) // and have that visible within the genbank view as well`, () => { cy.get(".veTabProperties").click(); diff --git a/packages/ove/demo/src/AlignmentDemo.js b/packages/ove/demo/src/AlignmentDemo.js index 8fbdd7c1..1d690f6f 100644 --- a/packages/ove/demo/src/AlignmentDemo.js +++ b/packages/ove/demo/src/AlignmentDemo.js @@ -1,15 +1,19 @@ -import { setupOptions, setParamsIfNecessary } from "./utils/setupOptions"; -import React from "react"; +import React, { useEffect, useMemo, useState } from "react"; import store from "./store"; import msaAlignment from "./exampleData/msaAlignment.json"; import pairwiseAlignment from "./exampleData/pairwiseAlignment.json"; import sangerAlignment from "./exampleData/sangerAlignment.json"; import msaAlignmentWithGaps from "./exampleData/msaAlignment_withGaps.json"; import { addAlignment, AlignmentView /* updateEditor */ } from "../../src/"; -import renderToggle from "./utils/renderToggle"; -import { BPSelect } from "@teselagen/ui"; +import { useToggle } from "./utils/useToggle"; +import { + BPSelect, + getCurrentParamsFromUrl, + setCurrentParamsOnUrl +} from "@teselagen/ui"; import pairwiseAlignment2 from "./exampleData/pairwiseAlignment2.json"; import { Button } from "@blueprintjs/core"; +import { difference } from "lodash-es"; // Use the line below because using the full 30 sequences murders Redux dev tools. msaAlignment.alignmentTracks = msaAlignment.alignmentTracks.slice(0, 20); @@ -26,253 +30,323 @@ const defaultState = { noVisibilityOptions: false, setTickSpacing: false }; +const bpSelectOptions = [ + { + label: "Multiple Sequence Alignment", + value: msaAlignment.id + }, + { label: "Pairwise Alignment", value: pairwiseAlignment.id }, + { + label: "Pairwise Alignment 2", + value: pairwiseAlignment2.id + }, + { label: "Sanger Alignment", value: sangerAlignment.id }, + { label: "MSA with gaps", value: msaAlignmentWithGaps.id } +]; -// const basicActions = { selectionLayerUpdate, caretPositionUpdate }; - -export default class AlignmentDemo extends React.Component { - constructor(props) { - super(props); - setupOptions({ that: this, defaultState, props }); - } - - componentDidUpdate() { - setParamsIfNecessary({ that: this, defaultState }); - } +const alignmentViewStyle = { + marginRight: 10 +}; - componentDidMount() { +export default props => { + useEffect(() => { addAlignment(store, msaAlignment); addAlignment(store, pairwiseAlignment); addAlignment(store, pairwiseAlignment2); addAlignment(store, sangerAlignment); addAlignment(store, msaAlignmentWithGaps); - } - render() { - return ( -
- {this.state.showDemoOptions && ( -
-
- {renderToggle({ - that: this, - alwaysShow: true, - type: "showDemoOptions", - label: "Show Demo Options", - hotkey: `cmd+'` - })} -
- { - this.setState({ alignmentDataId: val }); - }} - options={[ - { - label: "Multiple Sequence Alignment", - value: msaAlignment.id - }, - { label: "Pairwise Alignment", value: pairwiseAlignment.id }, - { - label: "Pairwise Alignment 2", - value: pairwiseAlignment2.id - }, - { label: "Sanger Alignment", value: sangerAlignment.id }, - { label: "MSA with gaps", value: msaAlignmentWithGaps.id } - ]} - /> -
- {renderToggle({ - that: this, - type: "forceHeightMode", - label: "Force Height 500px", - description: - "You can force a height for the editor by passing height:500 (same for width)" - })} - {renderToggle({ - that: this, - type: "setAlignmentName", - label: "Set Alignment Name", - description: - "You can give the alignment a name by setting alignmentName:'Ref Seq Name'" - })} - {renderToggle({ - that: this, - type: "isFullyZoomedOut", - label: "View Zoomed-Out Alignment", - description: - "You can view the alignment zoomed-out by setting isFullyZoomedOut:true" - })} - {renderToggle({ - that: this, - type: "setMinimapLaneHeight", - label: "Set Minimap Lane Height 13px", - description: - "You can set a height for the minimap lanes by passing minimapLaneHeight:13" - })} - {renderToggle({ - that: this, - type: "setMinimapLaneSpacing", - label: "Set Minimap Lane Spacing 3px", - description: - "You can set a height for the space between minimap lanes by passing minimapLaneSpacing:3" - })} - {renderToggle({ - that: this, - type: "noClickDragHandlers", - label: "Disable Clicks, Dragging and Highlighting", - description: - "You can disable click-drag highlighting by setting noClickDragHandlers:true" - })} - {renderToggle({ - that: this, - type: "allowTrackNameEdit" - })} - {renderToggle({ - that: this, - type: "handleAlignmentRename" - })} - {renderToggle({ - that: this, - type: "shouldAutosave" - })} - {renderToggle({ - that: this, - type: "allowTrimming" - })} - {renderToggle({ - that: this, - type: "allowTrackRearrange" - })} - {renderToggle({ - that: this, - type: "hasTemplate", - label: "Specify Alignment with Template", - description: - "You can specify that the first sequence in an alignment is a template sequence by setting hasTemplate:true" - })} - {renderToggle({ - that: this, - type: "setTickSpacing", - label: "Force Tick Spacing 5 bps", - description: - "You can set force the spacing of tick marks on the axis by setting linearViewOptions:{tickSpacing:5}" - })} - {renderToggle({ - that: this, - type: "noVisibilityOptions", - label: "Disable Visibility Options", - description: - "You can disable the visibility options menu by setting noVisibilityOptions:true" - })} - {renderToggle({ - that: this, - type: "overrideSelectionRightClick", - label: "Override Selection Right Click", - description: - "You can override the selection right click by passing a selectionLayerRightClicked={(event)={}} prop" - })} - {renderToggle({ - that: this, - type: "addSelectionRightClickOptions", - label: "Add Selection Right Click Options", - description: `You can add options to the selection right click by passing additionalSelectionLayerRightClickedOptions={(event)=>({ - text: "I'm an additional option", - className: "createDiversityRegion", - onClick: () => this.addDiversityRegionIfPossible() - })} prop` - })} -

-

-

-

-

-
- )} - [ - { - text: "I'm an additional option", - className: "createDiversityRegion", - onClick: () => window.toastr.success("You did it!") - } - ] - }), - ...(this.state.overrideSelectionRightClick && { - selectionLayerRightClicked: () => { - window.toastr.success("lezzz goooo!"); - } - }), - additionalTopLeftEl: ( - - ), - additionalTopEl: , - id: this.state.alignmentDataId, - height: this.state.forceHeightMode ? 500 : undefined, - isFullyZoomedOut: this.state.isFullyZoomedOut, - minimapLaneHeight: this.state.setMinimapLaneHeight ? 13 : undefined, - minimapLaneSpacing: this.state.setMinimapLaneSpacing - ? 3 - : undefined, - handleAlignmentRename: this.state.handleAlignmentRename - ? newName => { - window.toastr.success( - `handleAlignmentRename triggered with ${newName}` - ); - this.setState({ alignmentName: newName }); - } - : undefined, - alignmentName: this.state.alignmentName - ? this.state.alignmentName - : this.state.alignmentName - ? "Ref Seq Name" - : "Alignment Name Placeholder", - noClickDragHandlers: this.state.noClickDragHandlers, - allowTrackNameEdit: this.state.allowTrackNameEdit, - allowTrimming: this.state.allowTrimming, - shouldAutosave: this.state.shouldAutosave, - handleAlignmentSave: this.state.shouldAutosave - ? () => { - window.toastr.success("Autosave Triggered"); - } - : undefined, - allowTrackRearrange: this.state.allowTrackRearrange, - hasTemplate: this.state.hasTemplate, - noVisibilityOptions: this.state.noVisibilityOptions, - linearViewOptions: { - ...(this.state.setTickSpacing && { tickSpacing: 10 }) - } - }} - /> -
+ }, []); + + const defaultValues = useMemo(() => { + const editorDemoState = getCurrentParamsFromUrl(props.history.location); + // localStorage.editorDemoState = props.history.location.search; + const massagedEditorDemoState = Object.keys(editorDemoState).reduce( + (acc, key) => { + if (editorDemoState[key] === "false") { + acc[key] = false; + } else if (editorDemoState[key] === "true") { + acc[key] = true; + } else { + acc[key] = editorDemoState[key]; + } + return acc; + }, + {} ); - } -} + return { + ...defaultState, + ...massagedEditorDemoState + }; + }, [props.history.location]); + const [forceHeightMode, forceHeightModeSwitch] = useToggle({ + type: "forceHeightMode", + label: "Force Height 500px", + description: + "You can force a height for the editor by passing height:500 (same for width)", + defaultValue: defaultValues.forceHeightMode + }); + + const [showDemoOptions, setShowDemoOptions] = useState( + defaultValues.showDemoOptions + ); + const [, showDemoOptionsSwitch] = useToggle({ + alwaysShow: true, + type: "showDemoOptions", + label: "Show Demo Options", + hotkey: `cmd+'`, + controlledValue: showDemoOptions, + setControlledValue: setShowDemoOptions, + defaultValue: defaultValues.showDemoOptions + }); + + const [alignmentDataId, setAlignmentDataId] = useState( + defaultValues.alignmentDataId + ); + const [setAlignmentName, setAlignmentNameSwitch] = useToggle({ + type: "setAlignmentName", + label: "Set Alignment Name", + description: + "You can give the alignment a name by setting alignmentName:'Ref Seq Name'", + defaultValue: defaultValues.setAlignmentName + }); + const [alignmentName, setAlignmentNameValue] = useState(); + const [isFullyZoomedOut, isFullyZoomedOutSwitch] = useToggle({ + type: "isFullyZoomedOut", + label: "View Zoomed-Out Alignment", + description: + "You can view the alignment zoomed-out by setting isFullyZoomedOut:true", + defaultValue: defaultValues.isFullyZoomedOut + }); + const [setMinimapLaneHeight, setMinimapLaneHeightSwitch] = useToggle({ + type: "setMinimapLaneHeight", + label: "Set Minimap Lane Height 13px", + description: + "You can set a height for the minimap lanes by passing minimapLaneHeight:13", + defaultValue: defaultValues.setMinimapLaneHeight + }); + const [setMinimapLaneSpacing, setMinimapLaneSpacingSwitch] = useToggle({ + type: "setMinimapLaneSpacing", + label: "Set Minimap Lane Spacing 3px", + description: + "You can set a height for the space between minimap lanes by passing minimapLaneSpacing:3", + defaultValue: defaultValues.setMinimapLaneSpacing + }); + const [noClickDragHandlers, noClickDragHandlersSwitch] = useToggle({ + type: "noClickDragHandlers", + label: "Disable Clicks, Dragging and Highlighting", + description: + "You can disable click-drag highlighting by setting noClickDragHandlers:true", + defaultValue: defaultValues.noClickDragHandlers + }); + const [allowTrackNameEdit, allowTrackNameEditSwitch] = useToggle({ + type: "allowTrackNameEdit" + }); + const [handleAlignmentRename, handleAlignmentRenameSwitch] = useToggle({ + type: "handleAlignmentRename" + }); + const [shouldAutosave, shouldAutosaveSwitch] = useToggle({ + type: "shouldAutosave" + }); + const [allowTrimming, allowTrimmingSwitch] = useToggle({ + type: "allowTrimming" + }); + const [allowTrackRearrange, allowTrackRearrangeSwitch] = useToggle({ + type: "allowTrackRearrange" + }); + const [hasTemplate, hasTemplateSwitch] = useToggle({ + type: "hasTemplate", + label: "Specify Alignment with Template", + description: + "You can specify that the first sequence in an alignment is a template sequence by setting hasTemplate:true", + defaultValue: defaultValues.hasTemplate + }); + const [setTickSpacing, setTickSpacingSwitch] = useToggle({ + type: "setTickSpacing", + label: "Force Tick Spacing 5 bps", + description: + "You can set force the spacing of tick marks on the axis by setting linearViewOptions:{tickSpacing:5}", + defaultValue: defaultValues.setTickSpacing + }); + const [noVisibilityOptions, noVisibilityOptionsSwitch] = useToggle({ + type: "noVisibilityOptions", + label: "Disable Visibility Options", + description: + "You can disable the visibility options menu by setting noVisibilityOptions:true", + defaultValue: defaultValues.noVisibilityOptions + }); + const [overrideSelectionRightClick, overrideSelectionRightClickSwitch] = + useToggle({ + type: "overrideSelectionRightClick", + label: "Override Selection Right Click", + description: + "You can override the selection right click by passing a selectionLayerRightClicked={(event)={}} prop" + }); + const [addSelectionRightClickOptions, addSelectionRightClickOptionsSwitch] = + useToggle({ + type: "addSelectionRightClickOptions", + label: "Add Selection Right Click Options", + description: `You can add options to the selection right click by passing additionalSelectionLayerRightClickedOptions={(event)=>({ + text: "I'm an additional option", + className: "createDiversityRegion", + onClick: () => this.addDiversityRegionIfPossible() + })} prop` + }); + + // constructor(props) { + // super(props); + // setupOptions({ that: this, defaultState, props }); + // } + + useEffect(() => { + if (props.history) { + const diff = difference( + { + alignmentDataId, + showDemoOptions, + forceHeightMode, + isFullyZoomedOut, + setMinimapLaneHeight, + setMinimapLaneSpacing, + setAlignmentName, + noClickDragHandlers, + hasTemplate, + noVisibilityOptions, + setTickSpacing + }, + defaultState + ); + setCurrentParamsOnUrl(diff, props.history.replace); + } + }, [ + alignmentDataId, + forceHeightMode, + hasTemplate, + isFullyZoomedOut, + noClickDragHandlers, + noVisibilityOptions, + props.history, + setAlignmentName, + setMinimapLaneHeight, + setMinimapLaneSpacing, + setTickSpacing, + showDemoOptions + ]); + + return ( +
+ {showDemoOptions && ( +
+
{showDemoOptionsSwitch}
+ { + setAlignmentDataId(val); + }} + options={bpSelectOptions} + /> +
+ {forceHeightModeSwitch} + {setAlignmentNameSwitch} + {isFullyZoomedOutSwitch} + {setMinimapLaneHeightSwitch} + {setMinimapLaneSpacingSwitch} + {noClickDragHandlersSwitch} + {allowTrackNameEditSwitch} + {handleAlignmentRenameSwitch} + {shouldAutosaveSwitch} + {allowTrimmingSwitch} + {allowTrackRearrangeSwitch} + {hasTemplateSwitch} + {setTickSpacingSwitch} + {noVisibilityOptionsSwitch} + {overrideSelectionRightClickSwitch} + {addSelectionRightClickOptionsSwitch} +

+

+

+

+

+
+ )} + [ + { + text: "I'm an additional option", + className: "createDiversityRegion", + onClick: () => window.toastr.success("You did it!") + } + ] + })} + {...(overrideSelectionRightClick && { + selectionLayerRightClicked: () => { + window.toastr.success("lezzz goooo!"); + } + })} + additionalTopLeftEl={ + } + id={alignmentDataId} + height={forceHeightMode ? 500 : undefined} + isFullyZoomedOut={isFullyZoomedOut} + minimapLaneHeight={setMinimapLaneHeight ? 13 : undefined} + minimapLaneSpacing={setMinimapLaneSpacing ? 3 : undefined} + handleAlignmentRename={ + handleAlignmentRename + ? newName => { + window.toastr.success( + `handleAlignmentRename triggered with ${newName}` + ); + setAlignmentNameValue(newName); + } + : undefined + } + alignmentName={ + alignmentName + ? alignmentName + : !setAlignmentName + ? "Ref Seq Name" + : "Alignment Name Placeholder" + } + noClickDragHandlers={noClickDragHandlers} + allowTrackNameEdit={allowTrackNameEdit} + allowTrimming={allowTrimming} + shouldAutosave={shouldAutosave} + handleAlignmentSave={ + shouldAutosave + ? () => { + window.toastr.success("Autosave Triggered"); + } + : undefined + } + allowTrackRearrange={allowTrackRearrange} + hasTemplate={hasTemplate} + noVisibilityOptions={noVisibilityOptions} + linearViewOptions={{ + ...(setTickSpacing && { tickSpacing: 10 }) + }} + /> +
+ ); +}; diff --git a/packages/ove/demo/src/index.js b/packages/ove/demo/src/index.js index 86c90e23..1b2543f9 100644 --- a/packages/ove/demo/src/index.js +++ b/packages/ove/demo/src/index.js @@ -116,7 +116,7 @@ const demos = { const Demo = () => { return ( - + ); }; diff --git a/packages/ove/demo/src/utils/useToggle.js b/packages/ove/demo/src/utils/useToggle.js new file mode 100644 index 00000000..84aa1eab --- /dev/null +++ b/packages/ove/demo/src/utils/useToggle.js @@ -0,0 +1,216 @@ +import React, { useEffect, useMemo, useState } from "react"; +import { + Switch, + Button, + HTMLSelect, + Dialog, + useHotkeys, + KeyCombo +} from "@blueprintjs/core"; +import ReactMarkdown from "react-markdown"; +import remarkGfm from "remark-gfm"; +import { + doesSearchValMatchText, + getCurrentParamsFromUrl, + getStringFromReactComponent, + setCurrentParamsOnUrl +} from "@teselagen/ui"; +import { startCase } from "lodash-es"; + +const HandleHotkeys = ({ combo, onKeyDown }) => { + const hotkeys = useMemo( + () => [ + { + combo, + global: true, + onKeyDown + } + ], + [combo, onKeyDown] + ); + useHotkeys(hotkeys); + return null; +}; + +const ShowInfo = ({ description, info, type }) => { + const [isOpen, setOpen] = useState(false); + return ( + <> + { + setOpen(false); + }} + isOpen={isOpen} + > +
+ +
+
+ + {description || info ? ( +
+
+ ) : ( +
+ )} + + ); +}; + +const useToggle = ({ + type, + isButton, + label, + onClick, + info, + description, + hook, + defaultValue: _defaultValue, + options, + disabled, + isSelect, + hidden, + alwaysShow, + hotkey, + searchInput, + controlledValue, + setControlledValue, + ...rest +}) => { + const defaultValue = _defaultValue || options?.[0]?.value || options?.[0]; + const [val, _setVal] = useState(); + + useEffect(() => { + const demoState = getDemoState(); + const toSet = demoState[type] || defaultValue; + setControlledValue?.(toSet); + _setVal(toSet); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const value = useMemo(() => controlledValue || val, [controlledValue, val]); + + const setVal = newVal => { + const demoState = getDemoState(); + demoState[type] = newVal; + setCurrentParamsOnUrl({ [type]: newVal }, undefined, true); + if (setControlledValue) setControlledValue(newVal); + _setVal(newVal); + }; + let comp; + + if (hidden) comp = null; + let toggleOrButton; + const labelOrText = label ? {label} : startCase(type); + const sharedProps = { + style: { marginBottom: 0 }, + "data-test": type || label, + label: labelOrText, + text: labelOrText, + ...rest + }; + let switchOnChange; + if (searchInput && !alwaysShow) { + if ( + !doesSearchValMatchText( + searchInput, + getStringFromReactComponent(labelOrText) + ) + ) { + comp = null; + } + } + if (isButton) { + toggleOrButton =
{ + onFragmentSelect(); +}; export const DigestTool = props => { const [selectedTab, setSelectedTab] = useState("virtualDigest"); const { editorName, - // height = 100, dimensions = {}, - lanes, digestTool: { selectedFragment, computePartialDigest }, onDigestSave, - computePartialDigestDisabled, - computeDigestDisabled, updateComputePartialDigest, boxHeight, digestLaneRightClicked, - ladders + ladders, + sequenceData, + sequenceLength, + selectionLayerUpdate: _selectionLayerUpdate, + updateSelectedFragment } = props; + + const isCircular = sequenceData.circular; + const cutsites = sequenceData.cutsites; + const computePartialDigestDisabled = + cutsites.length > MAX_PARTIAL_DIGEST_CUTSITES; + const computeDigestDisabled = cutsites.length > MAX_DIGEST_CUTSITES; + // The selection layer update function is memoized to prevent re-renders + // It changes triggered by the DataTables below + const selectionLayerUpdate = useStableReference(_selectionLayerUpdate); + + // This useMemo might not be necessary once if we figure out + // why the DataTables below triggers a re-render outside of them. + const lanes = useMemo(() => { + const { fragments } = getVirtualDigest({ + cutsites, + sequenceLength, + isCircular, + computePartialDigest, + computePartialDigestDisabled, + computeDigestDisabled + }); + const _lanes = [ + fragments.map(f => ({ + ...f, + onFragmentSelect: () => { + selectionLayerUpdate.current({ + start: f.start, + end: f.end, + name: f.name + }); + updateSelectedFragment(f.Intentid); + } + })) + ]; + return _lanes; + }, [ + computeDigestDisabled, + computePartialDigest, + computePartialDigestDisabled, + cutsites, + isCircular, + selectionLayerUpdate, + sequenceLength, + updateSelectedFragment + ]); + + // Same comment as above + const digestInfoLanes = useMemo( + () => + lanes[0].map(({ id, cut1, cut2, start, end, size, ...rest }) => { + return { + ...rest, + id, + start, + end, + length: size, + leftCutter: cut1.restrictionEnzyme.name, + rightCutter: cut2.restrictionEnzyme.name, + leftOverhang: getCutsiteType(cut1.restrictionEnzyme), + rightOverhang: getCutsiteType(cut2.restrictionEnzyme) + }; + }), + [lanes] + ); + return (
{ maxHeight={400} // noFooter withSearch={false} - onSingleRowSelect={({ onFragmentSelect }) => { - onFragmentSelect(); - }} + onSingleRowSelect={onSingleSelectRow} formName="digestInfoTable" - entities={lanes[0].map( - ({ id, cut1, cut2, start, end, size, ...rest }) => { - return { - ...rest, - id, - start, - end, - length: size, - leftCutter: cut1.restrictionEnzyme.name, - rightCutter: cut2.restrictionEnzyme.name, - leftOverhang: getCutsiteType(cut1.restrictionEnzyme), - rightOverhang: getCutsiteType(cut2.restrictionEnzyme) - }; - } - )} + entities={digestInfoLanes} schema={schema} /> } @@ -178,48 +225,4 @@ const schema = { ] }; -export default compose( - withEditorInteractions, - withProps( - ({ - sequenceData, - sequenceLength, - selectionLayerUpdate, - updateSelectedFragment, - digestTool: { computePartialDigest } - }) => { - const isCircular = sequenceData.circular; - const cutsites = sequenceData.cutsites; - const computePartialDigestDisabled = - cutsites.length > MAX_PARTIAL_DIGEST_CUTSITES; - const computeDigestDisabled = cutsites.length > MAX_DIGEST_CUTSITES; - - const { fragments, overlappingEnzymes } = getVirtualDigest({ - cutsites, - sequenceLength, - isCircular, - computePartialDigest, - computePartialDigestDisabled, - computeDigestDisabled - }); - return { - computePartialDigestDisabled, - computeDigestDisabled, - lanes: [ - fragments.map(f => ({ - ...f, - onFragmentSelect: () => { - selectionLayerUpdate({ - start: f.start, - end: f.end, - name: f.name - }); - updateSelectedFragment(f.Intentid); - } - })) - ], - overlappingEnzymes - }; - } - ) -)(DigestTool); +export default withEditorInteractions(DigestTool); diff --git a/packages/ove/src/GlobalDialogUtils.js b/packages/ove/src/GlobalDialogUtils.js index 5f8f98e7..bbfb8286 100644 --- a/packages/ove/src/GlobalDialogUtils.js +++ b/packages/ove/src/GlobalDialogUtils.js @@ -43,6 +43,7 @@ export function hideDialog() { delete dialogHolder.CustomModalComponent; delete dialogHolder.props; delete dialogHolder.overrideName; + delete dialogHolder.editorName; dialogHolder.setUniqKeyToForceRerender(); } diff --git a/packages/ove/src/helperComponents/PropertiesDialog/CutsiteProperties.js b/packages/ove/src/helperComponents/PropertiesDialog/CutsiteProperties.js index 24350e73..677305aa 100644 --- a/packages/ove/src/helperComponents/PropertiesDialog/CutsiteProperties.js +++ b/packages/ove/src/helperComponents/PropertiesDialog/CutsiteProperties.js @@ -1,16 +1,12 @@ -import React from "react"; -import { - DataTable, - withSelectedEntities, - createCommandMenu -} from "@teselagen/ui"; -import { map, get } from "lodash-es"; +import React, { useCallback, useMemo } from "react"; +import { DataTable, createCommandMenu } from "@teselagen/ui"; +import { get } from "lodash-es"; import CutsiteFilter from "../../CutsiteFilter"; import { Button, ButtonGroup } from "@blueprintjs/core"; import { connectToEditor } from "../../withEditorProps"; import { compose } from "recompose"; import selectors from "../../selectors"; -import commands from "../../commands"; +import _commands from "../../commands"; import { userDefinedHandlersAndOpts } from "../../Editor/userDefinedHandlersAndOpts"; import { pick } from "lodash-es"; import SingleEnzymeCutsiteInfo from "./SingleEnzymeCutsiteInfo"; @@ -18,105 +14,107 @@ import { withRestrictionEnzymes } from "../../CutsiteFilter/withRestrictionEnzym import { cutsitesSubmenu } from "../../MenuBar/viewSubmenu"; import { getVisFilter } from "./GenericAnnotationProperties"; -class CutsiteProperties extends React.Component { - constructor(props) { - super(props); - this.commands = commands(this); - } +const schema = { + fields: [ + { path: "name", type: "string" }, + { path: "numberOfCuts", type: "number" }, + { path: "groups", type: "string" } + ] +}; - SubComponent = row => { - return ( - - ); - }; +const defaultValues = { order: ["numberOfCuts"] }; - schema = { - fields: [ - { path: "name", type: "string" }, - { path: "numberOfCuts", type: "number" }, - { path: "groups", type: "string" } - ] - }; +const CutsiteProperties = props => { + const commands = _commands({ props }); + const { + allRestrictionEnzymes, + allCutsites, + annotationVisibilityShow, + createNewDigest, + dispatch, + editorName, + filteredCutsites, + selectedAnnotationId + } = props; - onChangeHook = () => { - this.props.annotationVisibilityShow("cutsites"); - }; - render() { - const { + const SubComponent = useCallback( + row => ( + + ), + [ + allCutsites, + allRestrictionEnzymes, + dispatch, editorName, - createNewDigest, - filteredCutsites: allCutsites, + filteredCutsites, selectedAnnotationId - } = this.props; + ] + ); - const { cutsitesByName, cutsitesById } = allCutsites; - const cutsitesToUse = map(cutsitesByName, cutsiteGroup => { - const name = cutsiteGroup[0].restrictionEnzyme.name; - let groups = ""; - const exisitingEnzymeGroups = window.getExistingEnzymeGroups(); + const onChangeHook = useCallback(() => { + annotationVisibilityShow("cutsites"); + }, [annotationVisibilityShow]); - Object.keys(exisitingEnzymeGroups).forEach(key => { - if (exisitingEnzymeGroups[key].includes(name)) groups += key; - groups += " "; - }); + const { cutsitesByName, cutsitesById } = filteredCutsites; - return { - cutsiteGroup, - id: name, - name, - numberOfCuts: cutsiteGroup.length, - enzyme: cutsiteGroup[0].restrictionEnzyme, - groups - // size: getRangeLength(cutsiteGroup, sequenceData.sequence.length) - }; - }); - return ( - <> -
- {/* + const cutsitesToUse = useMemo( + () => + Object.values(cutsitesByName || {}).map(cutsiteGroup => { + const name = cutsiteGroup[0].restrictionEnzyme.name; + let groups = ""; + const exisitingEnzymeGroups = window.getExistingEnzymeGroups(); + + Object.keys(exisitingEnzymeGroups).forEach(key => { + if (exisitingEnzymeGroups[key].includes(name)) groups += key; + groups += " "; + }); + + return { + cutsiteGroup, + id: name, + name, + numberOfCuts: cutsiteGroup.length, + enzyme: cutsiteGroup[0].restrictionEnzyme, + groups + }; + }), + [cutsitesByName] + ); + + const selectedIds = useMemo( + () => get(cutsitesById[selectedAnnotationId], "restrictionEnzyme.name"), + [cutsitesById, selectedAnnotationId] + ); + + return ( + <> +
+ {getVisFilter( + createCommandMenu(cutsitesSubmenu, commands, { + useTicks: true + }) + )} + - {/* */} - - - -
- + - - ); - } -} +
+ + + ); +}; export default compose( connectToEditor((editorState, ownProps) => { @@ -180,6 +172,5 @@ export default compose( cutsites: cutsites.cutsitesArray }; }), - withRestrictionEnzymes, - withSelectedEntities("cutsiteProperties") + withRestrictionEnzymes )(CutsiteProperties); diff --git a/packages/ove/src/helperComponents/PropertiesDialog/SingleEnzymeCutsiteInfo.js b/packages/ove/src/helperComponents/PropertiesDialog/SingleEnzymeCutsiteInfo.js index fa7a793e..0168b607 100644 --- a/packages/ove/src/helperComponents/PropertiesDialog/SingleEnzymeCutsiteInfo.js +++ b/packages/ove/src/helperComponents/PropertiesDialog/SingleEnzymeCutsiteInfo.js @@ -1,11 +1,17 @@ -import React from "react"; +import React, { useCallback, useMemo } from "react"; import { DataTable } from "@teselagen/ui"; - import { CutsiteTag } from "../../CutsiteFilter/AdditionalCutsiteInfoDialog"; - import EnzymeViewer from "../../EnzymeViewer"; import { getEnzymeAliases } from "../../utils/editorUtils"; +const schema = { + fields: [ + { path: "topSnipPosition", displayName: "Top Snip", type: "string" }, + { path: "position", type: "string" }, + { path: "strand", type: "string" } + ] +}; + export default function SingleEnzymeCutsiteInfo({ cutsiteGroup, enzyme, @@ -16,40 +22,52 @@ export default function SingleEnzymeCutsiteInfo({ allCutsites, filteredCutsites: { cutsitesByName: cutsitesByNameActive } }) { - const onRowSelect = ([record]) => { - if (!record) return; + const onRowSelect = useCallback( + ([record]) => { + if (!record) return; - dispatch({ - type: "CARET_POSITION_UPDATE", - payload: record.topSnipPosition, - meta: { - editorName - } - }); - }; - const aliases = getEnzymeAliases(enzyme); - const entities = cutsiteGroup - .sort((a, b) => a.topSnipPosition - b.topSnipPosition) - .map( - ({ - restrictionEnzyme: { forwardRegex, reverseRegex } = {}, - forward, - id, - topSnipBeforeBottom, - topSnipPosition, - bottomSnipPosition - }) => { - return { - id, - topSnipPosition, - position: topSnipBeforeBottom - ? topSnipPosition + " - " + bottomSnipPosition - : bottomSnipPosition + " - " + topSnipPosition, - strand: - forwardRegex === reverseRegex ? "Palindromic" : forward ? "1" : "-1" - }; - } - ); + dispatch({ + type: "CARET_POSITION_UPDATE", + payload: record.topSnipPosition, + meta: { + editorName + } + }); + }, + [dispatch, editorName] + ); + + const aliases = useMemo(() => getEnzymeAliases(enzyme), [enzyme]); + const entities = useMemo( + () => + cutsiteGroup + .sort((a, b) => a.topSnipPosition - b.topSnipPosition) + .map( + ({ + restrictionEnzyme: { forwardRegex, reverseRegex } = {}, + forward, + id, + topSnipBeforeBottom, + topSnipPosition, + bottomSnipPosition + }) => { + return { + id, + topSnipPosition, + position: topSnipBeforeBottom + ? topSnipPosition + " - " + bottomSnipPosition + : bottomSnipPosition + " - " + topSnipPosition, + strand: + forwardRegex === reverseRegex + ? "Palindromic" + : forward + ? "1" + : "-1" + }; + } + ), + [cutsiteGroup] + ); return (
@@ -61,14 +79,12 @@ export default function SingleEnzymeCutsiteInfo({ > {enzyme && ( )} -

+
{entities && !!entities.length && (
+ /> ); })}
@@ -117,14 +133,6 @@ export default function SingleEnzymeCutsiteInfo({ ); } -const schema = { - fields: [ - { path: "topSnipPosition", displayName: "Top Snip", type: "string" }, - { path: "position", type: "string" }, - { path: "strand", type: "string" } - ] -}; - // export default compose( // withEditorProps, // withRestrictionEnzymes diff --git a/packages/ove/src/helperComponents/PropertiesDialog/index.js b/packages/ove/src/helperComponents/PropertiesDialog/index.js index 07c0b3a7..0f402b79 100644 --- a/packages/ove/src/helperComponents/PropertiesDialog/index.js +++ b/packages/ove/src/helperComponents/PropertiesDialog/index.js @@ -18,11 +18,11 @@ import { pick } from "lodash-es"; const PropertiesContainer = Comp => props => { const { additionalFooterEls, additionalHeaderEls, ...rest } = props; return ( - + <> {additionalHeaderEls} {additionalFooterEls} - + ); }; const allTabs = { @@ -35,129 +35,130 @@ const allTabs = { orfs: PropertiesContainer(OrfProperties), genbank: PropertiesContainer(GenbankView) }; -export class PropertiesDialog extends React.Component { - render() { - const { - propertiesTool = {}, - propertiesViewTabUpdate, - dimensions = {}, - height, - editorName, - onSave, - showReadOnly, - showAvailability, - isProtein, - annotationsToSupport = {}, - disableSetReadOnly, - propertiesList = [ - "general", - "features", - "parts", - "primers", - "translations", - "cutsites", - "orfs", - "genbank" - ], - closePanelButton - } = { ...this.props, ...this.props.PropertiesProps }; - const { width, height: heightFromDim } = dimensions; +export const PropertiesDialog = props => { + const { + propertiesTool = {}, + propertiesViewTabUpdate, + dimensions = {}, + height, + editorName, + onSave, + showReadOnly, + showAvailability, + isProtein, + annotationsToSupport = {}, + disableSetReadOnly, + propertiesList = [ + "general", + "features", + "parts", + "primers", + "translations", + "cutsites", + "orfs", + "genbank" + ], + closePanelButton + } = { ...props, ...props.PropertiesProps }; - let { tabId, selectedAnnotationId } = propertiesTool; - if ( - propertiesList - .map(nameOrOverride => nameOrOverride.name || nameOrOverride) - .indexOf(tabId) === -1 - ) { - tabId = propertiesList[0].name || propertiesList[0]; + const { width, height: heightFromDim } = dimensions; + + let { tabId, selectedAnnotationId } = propertiesTool; + if ( + propertiesList + .map(nameOrOverride => nameOrOverride.name || nameOrOverride) + .indexOf(tabId) === -1 + ) { + tabId = propertiesList[0].name || propertiesList[0]; + } + + const propertiesTabs = flatMap(propertiesList, nameOrOverride => { + if (annotationsToSupport[nameOrOverride] === false) { + return []; } - const propertiesTabs = flatMap(propertiesList, nameOrOverride => { - if (annotationsToSupport[nameOrOverride] === false) { - return []; - } - const name = nameOrOverride.name || nameOrOverride; - const Comp = nameOrOverride.Comp || allTabs[name]; - if (isProtein) { - if ( - name === "translations" || - name === "orfs" || - name === "primers" || - name === "cutsites" - ) { - return null; - } + const name = nameOrOverride.name || nameOrOverride; + const Comp = nameOrOverride.Comp || allTabs[name]; + if (isProtein) { + if ( + name === "translations" || + name === "orfs" || + name === "primers" || + name === "cutsites" + ) { + return null; } - const title = (() => { - if (nameOrOverride.Comp) return name; //just use the user supplied name because this is a custom panel - if (name === "orfs") return "ORFs"; - if (name === "cutsites") return "Cut Sites"; - return startCase(name); - })(); - return ( - - } - /> - ); - }); - const heightToUse = Math.max(0, Number((heightFromDim || height) - 30)); + } + const title = (() => { + if (nameOrOverride.Comp) return name; //just use the user supplied name because this is a custom panel + if (name === "orfs") return "ORFs"; + if (name === "cutsites") return "Cut Sites"; + return startCase(name); + })(); + return ( + + } + /> + ); + }); + const heightToUse = Math.max(0, Number((heightFromDim || height) - 30)); + return ( +
+ {closePanelButton}
- {closePanelButton} -
- {propertiesTabs.length ? ( - - - {propertiesTabs} - - - ) : ( -
- No Properties to display -
- )} -
+ {propertiesTabs.length ? ( + + + {propertiesTabs} + + + ) : ( +
+ No Properties to display +
+ )}
- ); - } -} +
+ ); +}; export default compose( connectToEditor(({ propertiesTool, annotationsToSupport }) => { diff --git a/packages/ove/src/helperComponents/RemoveDuplicates/index.js b/packages/ove/src/helperComponents/RemoveDuplicates/index.js index 9ddbdef7..8b74a674 100644 --- a/packages/ove/src/helperComponents/RemoveDuplicates/index.js +++ b/packages/ove/src/helperComponents/RemoveDuplicates/index.js @@ -1,194 +1,178 @@ -import React from "react"; +import React, { useCallback, useMemo, useState } from "react"; import { reduxForm } from "redux-form"; - import { wrapDialog, DataTable, - withSelectedEntities, SwitchField, - tgFormValues + useTableEntities } from "@teselagen/ui"; import { compose } from "redux"; import { Button, Classes, Popover } from "@blueprintjs/core"; import classNames from "classnames"; - import withEditorProps from "../../withEditorProps"; import { forEach, camelCase, startCase } from "lodash-es"; import { sizeSchema } from "../PropertiesDialog/utils"; import { getRangeLength } from "@teselagen/range-utils"; +import { useFormValue } from "../../utils/useFormValue"; + +const dialogFormName = "RemoveDuplicatesDialog"; +const dataTableFormName = "duplicatesToRemove"; +const checkboxStyle = { marginTop: 0, marginBottom: 0 }; + +const RemoveDuplicatesDialog = props => { + const { + type, + sequenceData = { sequence: "" }, + sequenceLength, + isProtein, + hideModal + } = props; -class RemoveDuplicatesDialog extends React.Component { - state = { - dups: [] - }; - componentDidMount() { - this.recomputeDups(); - } + const { selectedEntities } = useTableEntities(dataTableFormName); - checkboxStyle = { marginTop: 0, marginBottom: 0 }; + const ignoreName = useFormValue(dialogFormName, "ignoreName"); + const ignoreStartAndEnd = useFormValue(dialogFormName, "ignoreStartAndEnd"); + const ignoreStrand = useFormValue(dialogFormName, "ignoreStrand"); - delayedRecomputeDups = () => { - setTimeout(() => { - this.recomputeDups(); - }); - }; - recomputeDups = () => { - const { - // hideModal, - type, - sequenceData = { sequence: "" }, - // handleSubmit, - sequenceLength, - ignoreName, - ignoreStrand, - ignoreStartAndEnd - // circular, - // upsertFeature - } = this.props; + const recomputeDups = useCallback( + values => { + const ignoreName = values?.ignoreName; + const ignoreStartAndEnd = values?.ignoreStartAndEnd; + const ignoreStrand = values?.ignoreStrand; + const annotations = sequenceData[type]; + const newDups = []; + const seqsHashByStartEndStrandName = {}; + forEach(annotations, a => { + const hash = `${ignoreStartAndEnd ? "" : a.start}&${ + ignoreStartAndEnd ? "" : a.end + }&${ignoreStrand ? "" : a.strand}&${ignoreName ? "" : a.name}`; + if (seqsHashByStartEndStrandName[hash]) { + newDups.push({ ...a, size: getRangeLength(a, sequenceLength) }); + } else { + seqsHashByStartEndStrandName[hash] = true; + } + }); + return newDups; + }, + [sequenceData, sequenceLength, type] + ); - const annotations = sequenceData[type]; - const dups = []; - const seqsHashByStartEndStrandName = {}; - forEach(annotations, a => { - const hash = `${ignoreStartAndEnd ? "" : a.start}&${ - ignoreStartAndEnd ? "" : a.end - }&${ignoreStrand ? "" : a.strand}&${ignoreName ? "" : a.name}`; - if (seqsHashByStartEndStrandName[hash]) { - dups.push({ ...a, size: getRangeLength(a, sequenceLength) }); - } else { - seqsHashByStartEndStrandName[hash] = true; - } - }); - this.setState({ dups }); - }; - render() { - const { duplicatesToRemoveSelectedEntities, hideModal, type } = this.props; + const [dups, setDups] = useState(recomputeDups); + const selectedIds = useMemo(() => dups.map(d => d.id), [dups]); - const selectedIds = this.state.dups.map(d => d.id); + const fieldSubmit = useCallback( + (newVal, field) => { + const values = { + ignoreName, + ignoreStartAndEnd, + ignoreStrand, + [field]: newVal + }; + const newDups = recomputeDups(values); + setDups(newDups); + }, + [ignoreName, ignoreStartAndEnd, ignoreStrand, recomputeDups] + ); - const schema = { + const schema = useMemo( + () => ({ fields: [ - // ...(noColor - // ? [] - // : [ - // { - // path: "color", - // type: "string", - // render: color => { - // return ( - // - //
- // - // ); - // } - // } - // ]), { path: "name", type: "string" }, // ...(noType ? [] : [{ path: "type", type: "string" }]), - sizeSchema(this.props.isProtein), + sizeSchema(isProtein), { path: "strand", type: "string" } ] - }; - // const sequenceLength = sequenceData.sequence.length; - // const isCirc = (this.state || {}).circular; - return ( -
- {/* {dups.map((d) => { - return
+ }), + [isProtein] + ); -
- })} */} - + +
+ } + content={ +
+
Ignore These Fields While Finding Duplicates:
+
+ fieldSubmit(newVal, "ignoreName")} + style={checkboxStyle} + name="ignoreName" + label="Name" + /> + fieldSubmit(newVal, "ignoreStrand")} + style={checkboxStyle} + name="ignoreStrand" + label="Strand" + /> + + fieldSubmit(newVal, "ignoreStartAndEnd") + } + style={checkboxStyle} + name="ignoreStartAndEnd" + label="Start and End" + /> +
+ } /> -
{ + props[camelCase(`delete_${type}`).slice(0, -1)]( + Object.keys(selectedEntities || {}) + ); + window.toastr.success( + `Successfully Deleted ${ + Object.keys(selectedEntities || {}).length + } ${startCase(type)}` + ); + hideModal(); }} + disabled={!Object.keys(selectedEntities || {}).length} > - } - content={ -
-
Ignore These Fields While Finding Duplicates:
-

- - - -
- } - >
- - -
+ Remove {Object.keys(selectedEntities || {}).length} Duplicates +
- ); - } -} +
+ ); +}; export default compose( wrapDialog(), withEditorProps, - - withSelectedEntities("duplicatesToRemove"), - - reduxForm({ - form: "RemoveDuplicatesDialog" - }), - tgFormValues("ignoreName", "ignoreStrand", "ignoreStartAndEnd") + reduxForm({ form: dialogFormName }) )(RemoveDuplicatesDialog); diff --git a/packages/ove/src/utils/useFormValue.js b/packages/ove/src/utils/useFormValue.js new file mode 100644 index 00000000..ec654230 --- /dev/null +++ b/packages/ove/src/utils/useFormValue.js @@ -0,0 +1,7 @@ +/* Copyright (C) 2018 TeselaGen Biotechnology, Inc. */ +import { useSelector } from "react-redux"; +import { get } from "lodash"; + +export const useFormValue = (formName, field) => { + return useSelector(state => get(state.form?.[formName]?.values, field)); +}; diff --git a/packages/ove/src/withEditorInteractions/index.js b/packages/ove/src/withEditorInteractions/index.js index 734f7a84..d8d28783 100644 --- a/packages/ove/src/withEditorInteractions/index.js +++ b/packages/ove/src/withEditorInteractions/index.js @@ -4,7 +4,6 @@ import { getAminoAcidStringFromSequenceString } from "@teselagen/sequence-utils"; import { getSequenceWithinRange } from "@teselagen/range-utils"; -import Clipboard from "clipboard"; import { compose } from "redux"; import { getReverseComplementSequenceAndAnnotations, @@ -93,6 +92,7 @@ function VectorInteractionHOC(Component /* options */) { return ; }; } + componentWillUnmount() { this.combokeys && this.combokeys.detach(); } @@ -183,6 +183,7 @@ function VectorInteractionHOC(Component /* options */) { omitIcons: true }); } + updateSelectionOrCaret = (shiftHeld, newRangeOrCaret) => { const { selectionLayer, @@ -257,7 +258,8 @@ function VectorInteractionHOC(Component /* options */) { e.preventDefault(); }; - handleCutOrCopy = isCut => e => { + handleCutOrCopy = isCut => async e => { + e.preventDefault(); const { onCopy = noop, sequenceData, @@ -303,7 +305,6 @@ function VectorInteractionHOC(Component /* options */) { }` ); - const clipboardData = e.clipboardData; const textToCopy = (this.sequenceDataToCopy || {}).textToCopy !== undefined ? this.sequenceDataToCopy.textToCopy @@ -312,9 +313,16 @@ function VectorInteractionHOC(Component /* options */) { : seqData.sequence; seqData.textToCopy = textToCopy; - clipboardData.setData("text/plain", textToCopy); - clipboardData.setData("application/json", JSON.stringify(seqData)); - e.preventDefault(); + await navigator.clipboard.writeText(textToCopy); + // application/json is not supported by clipboard api on browser + // await navigator.clipboard.write([ + // new ClipboardItem({ + // "application/json": new Blob([JSON.stringify(seqData)], { + // type: "application/json" + // }), + // "text/plain": new Blob([textToCopy], { type: "text/plain" }) + // }) + // ]); if (isCut && !(readOnly || disableBpEditing) && !disableBpEditing) { this.handleDnaDelete(false); @@ -326,10 +334,8 @@ function VectorInteractionHOC(Component /* options */) { }), this.props ); - document.body.removeEventListener("cut", this.handleCut); } else { onCopy(e, seqData, this.props); - document.body.removeEventListener("copy", this.handleCopy); } window.toastr.success( `Selection ${ @@ -340,6 +346,7 @@ function VectorInteractionHOC(Component /* options */) { ); this.sequenceDataToCopy = undefined; }; + handleCut = this.handleCutOrCopy(true); handleCopy = this.handleCutOrCopy(); @@ -358,6 +365,7 @@ function VectorInteractionHOC(Component /* options */) { } }; }; + createDisableBpEditingMsg = () => { window.toastr.warning( typeof this.props.disableBpEditing === "string" @@ -366,6 +374,7 @@ function VectorInteractionHOC(Component /* options */) { this.getDuplicateAction() ); }; + createReadOnlyMsg = () => { window.toastr.warning( this.props.readOnly === "string" @@ -486,6 +495,7 @@ function VectorInteractionHOC(Component /* options */) { //we only call caretPositionUpdate if we're actually changing something this.props.caretPositionUpdate(position); }; + selectionLayerUpdate = newSelection => { const { selectionLayer = { start: -1, end: -1 }, ignoreGapsOnHighlight } = this.props; @@ -582,6 +592,7 @@ function VectorInteractionHOC(Component /* options */) { annotationDeselectAll(undefined); annotationSelect(annotation); }; + insertHelper = { onClick: (e, ctxInfo) => { this.handleDnaInsert({ @@ -593,74 +604,55 @@ function VectorInteractionHOC(Component /* options */) { } }; - // eslint-disable-next-line no-unused-vars getCopyOptions = annotation => { const { sequenceData, readOnly, disableBpEditing, selectionLayer } = this.props; const { isProtein } = sequenceData; - const makeTextCopyable = (transformFunc, className, action = "copy") => { - return new Clipboard(`.${className}`, { - action: () => action, - text: () => { - const { selectionLayer, editorName, store } = this.props; - const { sequenceData, copyOptions } = - store.getState().VectorEditor[editorName]; + const makeTextCopyable = transformFunc => { + return async () => { + const { editorName, store } = this.props; + const { sequenceData, copyOptions, selectionLayer } = + store.getState().VectorEditor[editorName]; - const selectedSeqData = getSequenceDataBetweenRange( - sequenceData, - getSelFromWrappedAddon( - selectionLayer, - sequenceData.sequence.length - ), - { - excludePartial: { - features: !copyOptions.partialFeatures, - parts: !copyOptions.partialParts - }, - exclude: { - features: !copyOptions.features, - parts: !copyOptions.parts - } + const selectedSeqData = getSequenceDataBetweenRange( + sequenceData, + getSelFromWrappedAddon( + selectionLayer, + sequenceData.sequence.length + ), + { + excludePartial: { + features: !copyOptions.partialFeatures, + parts: !copyOptions.partialParts + }, + exclude: { + features: !copyOptions.features, + parts: !copyOptions.parts } - ); - const sequenceDataToCopy = transformFunc( - selectedSeqData, - sequenceData - ); - this.sequenceDataToCopy = sequenceDataToCopy; - if (action === "copy") { - document.body.addEventListener("copy", this.handleCopy); - } else { - document.body.addEventListener("cut", this.handleCut); - } - if (window.Cypress) { - window.Cypress.textToCopy = sequenceDataToCopy.textToCopy; - window.Cypress.seqDataToCopy = sequenceDataToCopy; } - return sequenceDataToCopy.textToCopy || sequenceDataToCopy.sequence; + ); + const sequenceDataToCopy = transformFunc( + selectedSeqData, + sequenceData + ); + this.sequenceDataToCopy = sequenceDataToCopy; + + if (window.Cypress) { + window.Cypress.textToCopy = sequenceDataToCopy.textToCopy; + window.Cypress.seqDataToCopy = sequenceDataToCopy; } - }); + }; }; const aaCopy = { text: "Copy AA Sequence", className: "openVeCopyAA", - willUnmount: () => { - this.openVeCopyAA && this.openVeCopyAA.destroy(); - }, - didMount: ({ className }) => { - this.openVeCopyAA = makeTextCopyable(selectedSeqData => { - const textToCopy = isProtein - ? selectedSeqData.proteinSequence.toUpperCase() - : getAminoAcidStringFromSequenceString(selectedSeqData.sequence); - return { - ...selectedSeqData, - textToCopy - }; - }, className); - } + onClick: makeTextCopyable(selectedSeqData => ({ + ...selectedSeqData, + textToCopy: isProtein + ? selectedSeqData.proteinSequence.toUpperCase() + : getAminoAcidStringFromSequenceString(selectedSeqData.sequence) + })) }; - // TODO: maybe stop using Clipboard.js and unify clipboard handling with - // a more versatile approach return [ ...(readOnly || disableBpEditing ? [] @@ -672,20 +664,7 @@ function VectorInteractionHOC(Component /* options */) { { text: "Cut", className: "openVeCut", - willUnmount: () => { - this.openVeCut && this.openVeCut.destroy(); - }, - didMount: ({ className }) => { - // TODO: Maybe use a cut action instead - this.openVeCut = makeTextCopyable( - s => ({ - ...s, - textToCopy: isProtein ? s.proteinSequence : s.sequence - }), - className, - "cut" - ); - } + onClick: this.handleCut } ]), { @@ -698,80 +677,45 @@ function VectorInteractionHOC(Component /* options */) { { text: isProtein ? "Copy DNA Bps" : "Copy", className: "openVeCopy2", - willUnmount: () => { - this.openVeCopy2 && this.openVeCopy2.destroy(); - }, - didMount: ({ className }) => { - this.openVeCopy2 = makeTextCopyable( - s => ({ ...s, textToCopy: s.sequence }), - className - ); - } + onClick: makeTextCopyable(s => ({ + ...s, + textToCopy: s.sequence + })) }, { text: "Copy Genbank For Selection", className: "openVeCopyGenbankForSelection", - willUnmount: () => { - this.openVeCopyGenbankForSelection && - this.openVeCopyGenbankForSelection.destroy(); - }, - didMount: ({ className }) => { - this.openVeCopyGenbankForSelection = makeTextCopyable( - getGenbankFromSelection, - className - ); - } + onClick: makeTextCopyable(getGenbankFromSelection) }, { text: isProtein ? "Copy Reverse Complement DNA Bps" : "Copy Reverse Complement", className: "openVeCopyReverse", - willUnmount: () => { - this.openVeCopyReverse && this.openVeCopyReverse.destroy(); - }, - didMount: ({ className }) => { - this.openVeCopyReverse = makeTextCopyable( - getReverseComplementSequenceAndAnnotations, - className - ); - } + onClick: makeTextCopyable( + getReverseComplementSequenceAndAnnotations + ) }, ...(isProtein ? [] : [aaCopy]), { text: "Copy Reverse Complement AA Sequence", className: "openVeCopyAAReverse", - willUnmount: () => { - this.openVeCopyAAReverse && this.openVeCopyAAReverse.destroy(); - }, - didMount: ({ className }) => { - this.openVeCopyAAReverse = makeTextCopyable(selectedSeqData => { - const revSeqData = - getReverseComplementSequenceAndAnnotations(selectedSeqData); - const textToCopy = isProtein + onClick: makeTextCopyable(selectedSeqData => { + const revSeqData = + getReverseComplementSequenceAndAnnotations(selectedSeqData); + return { + ...revSeqData, + textToCopy: isProtein ? revSeqData.proteinSequence.toUpperCase() - : getAminoAcidStringFromSequenceString(revSeqData.sequence); - return { - ...revSeqData, - textToCopy - }; - }, className); - } + : getAminoAcidStringFromSequenceString(revSeqData.sequence) + }; + }) }, { text: isProtein ? "Copy Complement DNA Bps" : "Copy Complement", className: "openVeCopyComplement", - willUnmount: () => { - this.openVeCopyComplement && - this.openVeCopyComplement.destroy(); - }, - didMount: ({ className }) => { - this.openVeCopyComplement = makeTextCopyable( - getComplementSequenceAndAnnotations, - className - ); - } + onClick: makeTextCopyable(getComplementSequenceAndAnnotations) }, copyOptionsMenu ] diff --git a/packages/ui/cypress/e2e/EditableCellTable.spec.js b/packages/ui/cypress/e2e/EditableCellTable.spec.js index b0420794..fc314531 100644 --- a/packages/ui/cypress/e2e/EditableCellTable.spec.js +++ b/packages/ui/cypress/e2e/EditableCellTable.spec.js @@ -1,4 +1,5 @@ import path from "path"; +import os from "os"; describe("EditableCellTable.spec", () => { it(`cell checkboxes and the header checkbox should work`, () => { @@ -240,8 +241,9 @@ describe("EditableCellTable.spec", () => { ); }); it(`undo/redo should work`, () => { - const undoCmd = [`Meta`, `z`]; - const redoCmd = [`Meta`, `Shift`, `z`]; + const IS_LINUX = os.platform().toLowerCase().search("linux") > -1; + const undoCmd = IS_LINUX ? [`Alt`, `z`] : [`Meta`, `z`]; + const redoCmd = IS_LINUX ? [`Alt`, `Shift`, `z`] : [`Meta`, `Shift`, `z`]; cy.visit("#/DataTable%20-%20EditableCellTable"); cy.get(`.rt-td:contains(tom88)`).dblclick(); cy.focused().type("{selectall}tasty55{enter}"); diff --git a/packages/ui/demo/src/examples/DataTable.js b/packages/ui/demo/src/examples/DataTable.js index b3500c8f..be77b6e0 100644 --- a/packages/ui/demo/src/examples/DataTable.js +++ b/packages/ui/demo/src/examples/DataTable.js @@ -586,7 +586,7 @@ const DataTableDemo = () => { onRefresh={onRefresh} onSingleRowSelect={noop} selectAllByDefault={selectAllByDefault} - initialSelectedIds={selectedIds} + selectedIds={selectedIds} shouldShowSubComponent={r => r.id !== 1} showCount={showCount} SubComponent={withSubComponent ? SubComp : undefined} diff --git a/packages/ui/src/DataTable/index.js b/packages/ui/src/DataTable/index.js index f76d5d2a..6036e465 100644 --- a/packages/ui/src/DataTable/index.js +++ b/packages/ui/src/DataTable/index.js @@ -102,6 +102,7 @@ import { useColumns } from "./Columns"; import { formValueSelector, change as _change } from "redux-form"; import { throwFormError } from "../throwFormError"; import { isObservableArray, toJS } from "mobx"; +import { isBeingCalledExcessively } from "../utils/isBeingCalledExcessively"; enablePatches(); const IS_LINUX = window.navigator.platform.toLowerCase().search("linux") > -1; @@ -425,7 +426,7 @@ const DataTable = ({ hideSelectedCount = isSimple, hideSetPageSize, hideTotalPages, - initialSelectedIds, + selectedIds, isCellEditable, isCopyable = true, isEntityDisabled = noop, @@ -501,16 +502,14 @@ const DataTable = ({ // This is because we need to maintain the reduxFormSelectedEntityIdMap and // allOrderedEntities updated useEffect(() => { - if (change) { - change("allOrderedEntities", entitiesAcrossPages); - if (entities.length === 0 || isEmpty(reduxFormSelectedEntityIdMap)) - return; - changeSelectedEntities({ - idMap: reduxFormSelectedEntityIdMap, - entities, - change - }); - } + isBeingCalledExcessively({ uniqName: `dt_entities_${formName}` }); + change("allOrderedEntities", entitiesAcrossPages); + if (entities.length === 0 || isEmpty(reduxFormSelectedEntityIdMap)) return; + changeSelectedEntities({ + idMap: reduxFormSelectedEntityIdMap, + entities, + change + }); // eslint-disable-next-line react-hooks/exhaustive-deps }, [entitiesAcrossPages, reduxFormSelectedEntityIdMap, change]); @@ -524,6 +523,7 @@ const DataTable = ({ } else { newTableConfig = getTableConfigFromStorage(formName); } + isBeingCalledExcessively({ uniqName: `dt_setTableConfig_${formName}` }); // if the tableConfig is the same as the newTableConfig, don't update setTableConfig(prev => { if (!newTableConfig) { @@ -1752,17 +1752,15 @@ const DataTable = ({ // We need to make sure this only runs at the beggining useEffect(() => { - if (initialSelectedIds) { - if (alreadySelected.current) return; - setSelectedIds(initialSelectedIds); - alreadySelected.current = true; + if (selectedIds) { + setSelectedIds(selectedIds); } if (selectAllByDefault && entities && entities.length) { if (alreadySelected.current) return; setSelectedIds(entities.map(getIdOrCodeOrIndex)); alreadySelected.current = true; } - }, [entities, initialSelectedIds, selectAllByDefault, setSelectedIds]); + }, [entities, selectedIds, selectAllByDefault, setSelectedIds]); const TheadComponent = useCallback( ({ className, style, children }) => { diff --git a/packages/ui/src/DataTable/utils/queryParams.js b/packages/ui/src/DataTable/utils/queryParams.js index 8f2aebcd..f13d9940 100644 --- a/packages/ui/src/DataTable/utils/queryParams.js +++ b/packages/ui/src/DataTable/utils/queryParams.js @@ -513,6 +513,7 @@ export function getCurrentParamsFromUrl(location, isSimple) { return parseFilters(queryString.parse(search, { ignoreQueryPrefix: true })); } + export function setCurrentParamsOnUrl(newParams, replace, isSimple) { const stringifiedFilters = stringifyFilters(newParams); const search = `?${queryString.stringify(stringifiedFilters)}`; diff --git a/packages/ui/src/FillWindow.js b/packages/ui/src/FillWindow.js index c333c342..83f5a52a 100644 --- a/packages/ui/src/FillWindow.js +++ b/packages/ui/src/FillWindow.js @@ -1,4 +1,5 @@ -import React, { createPortal } from "react"; +import React from "react"; +import { createPortal } from "react-dom"; import { isFunction } from "lodash-es"; import rerenderOnWindowResize from "./rerenderOnWindowResize"; import "./FillWindow.css"; diff --git a/packages/ui/src/utils/isBeingCalledExcessively.js b/packages/ui/src/utils/isBeingCalledExcessively.js new file mode 100644 index 00000000..beded458 --- /dev/null +++ b/packages/ui/src/utils/isBeingCalledExcessively.js @@ -0,0 +1,24 @@ +const keyCount = {}; +export const isBeingCalledExcessively = ({ uniqName }) => { + if (process.env.NODE_ENV !== "development") { + return; + } + if (!uniqName) { + throw new Error("uniqName is required"); + } + // if this function is hit more than 10 times in a row in 2 seconds with the same uniqName then throw an error + if (keyCount[uniqName + "_timeout"]) { + clearTimeout(keyCount[uniqName + "_timeout"]); + } + keyCount[uniqName] = keyCount[uniqName] || 0; + keyCount[uniqName]++; + + keyCount[uniqName + "_timeout"] = setTimeout(() => { + keyCount[uniqName] = 0; + }, 2000); + + if (keyCount[uniqName] > 20) { + keyCount[uniqName] = 0; + throw new Error(`isBeingCalledExcessively: ${uniqName}`); + } +}; diff --git a/yarn.lock b/yarn.lock index 8e2ffab9..6ca13fbf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1970,32 +1970,14 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@blueprintjs/colors@^4.0.0-alpha.2", "@blueprintjs/colors@^4.0.0-alpha.3": +"@blueprintjs/colors@^4.0.0-alpha.3": version "4.2.1" resolved "https://registry.yarnpkg.com/@blueprintjs/colors/-/colors-4.2.1.tgz#603b2512caee84feddcb3dbd536534c140b9a1f3" integrity sha512-Cx7J2YnUuxn+fi+y5XtXnBB7+cFHN4xBrRkaAetp78i3VTCXjUk+d1omrOr8TqbRucUXTdrhbZOUHpzRLFcJpQ== dependencies: tslib "~2.5.0" -"@blueprintjs/core@3.52.0": - version "3.52.0" - resolved "https://registry.yarnpkg.com/@blueprintjs/core/-/core-3.52.0.tgz#cfb558fb435ba4b3e79e44ed470c79a787fa3724" - integrity sha512-92Tsr0uw1ey8ZsdYSfPyeN1hbjI8PC+HWyXUSNG+nM4g5AYTuKXVXKTxxGBtZN9hG2LlmUld8YIMFWtuLBErDQ== - dependencies: - "@blueprintjs/colors" "^4.0.0-alpha.2" - "@blueprintjs/icons" "^3.31.0" - "@types/dom4" "^2.0.1" - classnames "^2.2" - dom4 "^2.1.5" - normalize.css "^8.0.1" - popper.js "^1.16.1" - react-lifecycles-compat "^3.0.4" - react-popper "^1.3.7" - react-transition-group "^2.9.0" - resize-observer-polyfill "^1.5.1" - tslib "~1.13.0" - -"@blueprintjs/core@^3.52.0": +"@blueprintjs/core@3.54.0", "@blueprintjs/core@^3.52.0", "@blueprintjs/core@^3.54.0": version "3.54.0" resolved "https://registry.yarnpkg.com/@blueprintjs/core/-/core-3.54.0.tgz#7269f34eccdf0d2874377c5ad973ca2a31562221" integrity sha512-u2c1s6MNn0ocxhnC6CuiG5g3KV6b4cKUvSobznepA9SC3/AL1s3XOvT7DLWoHRv2B/vBOHFYEDzLw2/vlcGGZg== @@ -2013,18 +1995,18 @@ react-transition-group "^2.9.0" tslib "~2.3.1" -"@blueprintjs/datetime@3.23.19": - version "3.23.19" - resolved "https://registry.yarnpkg.com/@blueprintjs/datetime/-/datetime-3.23.19.tgz#43145f7c68970d3880ec17a4299beef3632b7df6" - integrity sha512-u8CkI9OOHoC+Kz29QQh53jpV7SbnrDOPqZLEOtZcjjKUm/3fETgOCuFvzinP3+gd9joHKI9+KcM1ggdVAh+hqQ== +"@blueprintjs/datetime@^3.24.1": + version "3.24.1" + resolved "https://registry.yarnpkg.com/@blueprintjs/datetime/-/datetime-3.24.1.tgz#020ae9f1dbdc3e723394e6e3df4d8c7047699c56" + integrity sha512-+k5Zpmtzqqec1b+wiNMfXuw1N2pDUAlcuMAHQkZGbmrNKocpqMKLU6S6bPLGBsG0fwAbzQdYYiCCVz65m2z4Uw== dependencies: - "@blueprintjs/core" "^3.52.0" + "@blueprintjs/core" "^3.54.0" classnames "^2.2" react-day-picker "7.4.9" react-lifecycles-compat "^3.0.4" - tslib "~1.13.0" + tslib "~2.3.1" -"@blueprintjs/icons@^3.31.0", "@blueprintjs/icons@^3.33.0": +"@blueprintjs/icons@^3.33.0": version "3.33.0" resolved "https://registry.yarnpkg.com/@blueprintjs/icons/-/icons-3.33.0.tgz#4dacdb7731abdf08d1ab240f3a23a185df60918b" integrity sha512-Q6qoSDIm0kRYQZISm59UUcDCpV3oeHulkLuh3bSlw0HhcSjvEQh2PSYbtaifM60Q4aK4PCd6bwJHg7lvF1x5fQ== @@ -3647,6 +3629,13 @@ "@types/estree" "*" "@types/json-schema" "*" +"@types/estree-jsx@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz#858a88ea20f34fe65111f005a689fa1ebf70dc18" + integrity sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg== + dependencies: + "@types/estree" "*" + "@types/estree@*", "@types/estree@1.0.5", "@types/estree@^1.0.0": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" @@ -3659,12 +3648,12 @@ dependencies: "@types/node" "*" -"@types/hast@^2.0.0": - version "2.3.10" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643" - integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== +"@types/hast@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== dependencies: - "@types/unist" "^2" + "@types/unist" "*" "@types/hoist-non-react-statics@^3.3.1": version "3.3.5" @@ -3739,12 +3728,12 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.4.tgz#0303b64958ee070059e3a7184048a55159fe20b7" integrity sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ== -"@types/mdast@^3.0.0": - version "3.0.15" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" - integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== +"@types/mdast@^4.0.0": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" + integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== dependencies: - "@types/unist" "^2" + "@types/unist" "*" "@types/ms@*": version "0.7.34" @@ -3782,7 +3771,7 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== -"@types/prop-types@*", "@types/prop-types@^15.0.0": +"@types/prop-types@*": version "15.7.11" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== @@ -3864,7 +3853,12 @@ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== -"@types/unist@^2", "@types/unist@^2.0.0": +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" + integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== + +"@types/unist@^2.0.0": version "2.0.10" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== @@ -4032,6 +4026,11 @@ "@typescript-eslint/types" "7.10.0" eslint-visitor-keys "^3.4.3" +"@ungap/structured-clone@^1.0.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.1.tgz#28fa185f67daaf7b7a1a8c1d445132c5d979f8bd" + integrity sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA== + "@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" @@ -5147,11 +5146,26 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + character-entities@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== +character-reference-invalid@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -5273,15 +5287,6 @@ cli-width@^3.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== -clipboard@2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.8.tgz#ffc6c103dd2967a83005f3f61976aa4655a4cdba" - integrity sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ== - dependencies: - good-listener "^1.2.2" - select "^1.1.2" - tiny-emitter "^2.0.0" - cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -6087,11 +6092,6 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -delegate@^3.1.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" - integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== - dequal@^2.0.0, dequal@^2.0.2, dequal@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" @@ -6115,6 +6115,13 @@ detect-port@^1.5.1: address "^1.0.1" debug "4" +devlop@^1.0.0, devlop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== + dependencies: + dequal "^2.0.0" + diff-match-patch@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz#abb584d5f10cd1196dfc55aa03701592ae3f7b37" @@ -6130,7 +6137,7 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -diff@^5.0.0, diff@^5.1.0: +diff@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== @@ -6862,6 +6869,11 @@ estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-util-is-identifier-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz#0b5ef4c4ff13508b34dcd01ecfa945f61fce5dbd" + integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== + estree-walker@^2.0.1, estree-walker@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" @@ -7534,13 +7546,6 @@ globrex@^0.1.2: resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== -good-listener@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" - integrity sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw== - dependencies: - delegate "^3.1.2" - gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -7634,10 +7639,33 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: dependencies: function-bind "^1.1.2" -hast-util-whitespace@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" - integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== +hast-util-to-jsx-runtime@^2.0.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz#6d11b027473e69adeaa00ca4cfb5bb68e3d282fa" + integrity sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg== + dependencies: + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^1.0.0" + unist-util-position "^5.0.0" + vfile-message "^4.0.0" + +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== + dependencies: + "@types/hast" "^3.0.0" he@^1.2.0: version "1.2.0" @@ -7694,6 +7722,11 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +html-url-attributes@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/html-url-attributes/-/html-url-attributes-3.0.1.tgz#83b052cd5e437071b756cd74ae70f708870c2d87" + integrity sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ== + html2canvas@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543" @@ -7882,10 +7915,10 @@ ini@2.0.0: resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== +inline-style-parser@0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.4.tgz#f4af5fe72e612839fcd453d989a586566d695f22" + integrity sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q== inquirer@8.2.6: version "8.2.6" @@ -7924,6 +7957,19 @@ invariant@^2.2.4: dependencies: loose-envify "^1.0.0" +is-alphabetical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== + +is-alphanumerical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== + dependencies: + is-alphabetical "^2.0.0" + is-decimal "^2.0.0" + is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -7979,11 +8025,6 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -8017,6 +8058,11 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: dependencies: has-tostringtag "^1.0.0" +is-decimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== + is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" @@ -8070,6 +8116,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-hexadecimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== + is-installed-globally@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" @@ -9010,7 +9061,7 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -kleur@^4.0.3, kleur@^4.1.5: +kleur@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== @@ -9363,143 +9414,185 @@ math-expression-evaluator@^1.3.7: resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.4.0.tgz#3d66031117fbb7b9715ea6c9c68c2cd2eebd37e2" integrity sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw== -mdast-util-definitions@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" - integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - unist-util-visit "^4.0.0" - -mdast-util-find-and-replace@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz#cc2b774f7f3630da4bd592f61966fecade8b99b1" - integrity sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw== +mdast-util-find-and-replace@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz#a6fc7b62f0994e973490e45262e4bc07607b04e0" + integrity sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA== dependencies: - "@types/mdast" "^3.0.0" + "@types/mdast" "^4.0.0" escape-string-regexp "^5.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" -mdast-util-from-markdown@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" - integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== +mdast-util-from-markdown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz#4850390ca7cf17413a9b9a0fbefcd1bc0eb4160a" + integrity sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA== dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" decode-named-character-reference "^1.0.0" - mdast-util-to-string "^3.1.0" - micromark "^3.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-decode-string "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - unist-util-stringify-position "^3.0.0" - uvu "^0.5.0" - -mdast-util-gfm-autolink-literal@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz#67a13abe813d7eba350453a5333ae1bc0ec05c06" - integrity sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA== + devlop "^1.0.0" + mdast-util-to-string "^4.0.0" + micromark "^4.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-decode-string "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-stringify-position "^4.0.0" + +mdast-util-gfm-autolink-literal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz#abd557630337bd30a6d5a4bd8252e1c2dc0875d5" + integrity sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ== dependencies: - "@types/mdast" "^3.0.0" + "@types/mdast" "^4.0.0" ccount "^2.0.0" - mdast-util-find-and-replace "^2.0.0" - micromark-util-character "^1.0.0" + devlop "^1.0.0" + mdast-util-find-and-replace "^3.0.0" + micromark-util-character "^2.0.0" -mdast-util-gfm-footnote@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz#ce5e49b639c44de68d5bf5399877a14d5020424e" - integrity sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ== +mdast-util-gfm-footnote@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz#25a1753c7d16db8bfd53cd84fe50562bd1e6d6a9" + integrity sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ== dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-markdown "^1.3.0" - micromark-util-normalize-identifier "^1.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" -mdast-util-gfm-strikethrough@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz#5470eb105b483f7746b8805b9b989342085795b7" - integrity sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ== +mdast-util-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz#d44ef9e8ed283ac8c1165ab0d0dfd058c2764c16" + integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-markdown "^1.3.0" + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" -mdast-util-gfm-table@^1.0.0: - version "1.0.7" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz#3552153a146379f0f9c4c1101b071d70bbed1a46" - integrity sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg== +mdast-util-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz#7a435fb6223a72b0862b33afbd712b6dae878d38" + integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== dependencies: - "@types/mdast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" markdown-table "^3.0.0" - mdast-util-from-markdown "^1.0.0" - mdast-util-to-markdown "^1.3.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" -mdast-util-gfm-task-list-item@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz#b280fcf3b7be6fd0cc012bbe67a59831eb34097b" - integrity sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ== +mdast-util-gfm-task-list-item@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz#e68095d2f8a4303ef24094ab642e1047b991a936" + integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-markdown "^1.3.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" -mdast-util-gfm@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz#e92f4d8717d74bdba6de57ed21cc8b9552e2d0b6" - integrity sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg== - dependencies: - mdast-util-from-markdown "^1.0.0" - mdast-util-gfm-autolink-literal "^1.0.0" - mdast-util-gfm-footnote "^1.0.0" - mdast-util-gfm-strikethrough "^1.0.0" - mdast-util-gfm-table "^1.0.0" - mdast-util-gfm-task-list-item "^1.0.0" - mdast-util-to-markdown "^1.0.0" - -mdast-util-phrasing@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" - integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== +mdast-util-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz#3f2aecc879785c3cb6a81ff3a243dc11eca61095" + integrity sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-gfm-autolink-literal "^2.0.0" + mdast-util-gfm-footnote "^2.0.0" + mdast-util-gfm-strikethrough "^2.0.0" + mdast-util-gfm-table "^2.0.0" + mdast-util-gfm-task-list-item "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdx-expression@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz#43f0abac9adc756e2086f63822a38c8d3c3a5096" + integrity sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ== dependencies: - "@types/mdast" "^3.0.0" - unist-util-is "^5.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" -mdast-util-to-hast@^12.1.0: - version "12.3.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz#045d2825fb04374e59970f5b3f279b5700f6fb49" - integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== +mdast-util-mdx-jsx@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz#76b957b3da18ebcfd0de3a9b4451dcd6fdec2320" + integrity sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ== dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-definitions "^5.0.0" - micromark-util-sanitize-uri "^1.1.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + +mdast-util-mdxjs-esm@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz#019cfbe757ad62dd557db35a695e7314bcc9fa97" + integrity sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-phrasing@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz#7cc0a8dec30eaf04b7b1a9661a92adb3382aa6e3" + integrity sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w== + dependencies: + "@types/mdast" "^4.0.0" + unist-util-is "^6.0.0" + +mdast-util-to-hast@^13.0.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz#5ca58e5b921cc0a3ded1bc02eed79a4fe4fe41f4" + integrity sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + devlop "^1.0.0" + micromark-util-sanitize-uri "^2.0.0" trim-lines "^3.0.0" - unist-util-generated "^2.0.0" - unist-util-position "^4.0.0" - unist-util-visit "^4.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" -mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" - integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== +mdast-util-to-markdown@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz#f910ffe60897f04bb4b7e7ee434486f76288361b" + integrity sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA== dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" longest-streak "^3.0.0" - mdast-util-phrasing "^3.0.0" - mdast-util-to-string "^3.0.0" - micromark-util-decode-string "^1.0.0" - unist-util-visit "^4.0.0" + mdast-util-phrasing "^4.0.0" + mdast-util-to-string "^4.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-decode-string "^2.0.0" + unist-util-visit "^5.0.0" zwitch "^2.0.0" -mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" - integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== +mdast-util-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== dependencies: - "@types/mdast" "^3.0.0" + "@types/mdast" "^4.0.0" mdn-data@2.0.28: version "2.0.28" @@ -9531,278 +9624,278 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" - integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== +micromark-core-commonmark@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz#6a45bbb139e126b3f8b361a10711ccc7c6e15e93" + integrity sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w== dependencies: decode-named-character-reference "^1.0.0" - micromark-factory-destination "^1.0.0" - micromark-factory-label "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-factory-title "^1.0.0" - micromark-factory-whitespace "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-classify-character "^1.0.0" - micromark-util-html-tag-name "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - -micromark-extension-gfm-autolink-literal@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz#5853f0e579bbd8ef9e39a7c0f0f27c5a063a66e7" - integrity sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg== + devlop "^1.0.0" + micromark-factory-destination "^2.0.0" + micromark-factory-label "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-title "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-html-tag-name "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-autolink-literal@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz#6286aee9686c4462c1e3552a9d505feddceeb935" + integrity sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw== dependencies: - micromark-util-character "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-extension-gfm-footnote@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz#05e13034d68f95ca53c99679040bc88a6f92fe2e" - integrity sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q== - dependencies: - micromark-core-commonmark "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-extension-gfm-strikethrough@^1.0.0: - version "1.0.7" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz#c8212c9a616fa3bf47cb5c711da77f4fdc2f80af" - integrity sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw== +micromark-extension-gfm-footnote@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz#4dab56d4e398b9853f6fe4efac4fc9361f3e0750" + integrity sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw== + dependencies: + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-strikethrough@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz#86106df8b3a692b5f6a92280d3879be6be46d923" + integrity sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw== dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-classify-character "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-extension-gfm-table@^1.0.0: - version "1.0.7" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz#dcb46074b0c6254c3fc9cc1f6f5002c162968008" - integrity sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw== +micromark-extension-gfm-table@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz#5cadedfbb29fca7abf752447967003dc3b6583c9" + integrity sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g== dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-extension-gfm-tagfilter@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz#aa7c4dd92dabbcb80f313ebaaa8eb3dac05f13a7" - integrity sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g== +micromark-extension-gfm-tagfilter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz#f26d8a7807b5985fba13cf61465b58ca5ff7dc57" + integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== dependencies: - micromark-util-types "^1.0.0" + micromark-util-types "^2.0.0" -micromark-extension-gfm-task-list-item@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz#b52ce498dc4c69b6a9975abafc18f275b9dde9f4" - integrity sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ== +micromark-extension-gfm-task-list-item@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz#bcc34d805639829990ec175c3eea12bb5b781f2c" + integrity sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw== dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-extension-gfm@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz#e517e8579949a5024a493e49204e884aa74f5acf" - integrity sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ== - dependencies: - micromark-extension-gfm-autolink-literal "^1.0.0" - micromark-extension-gfm-footnote "^1.0.0" - micromark-extension-gfm-strikethrough "^1.0.0" - micromark-extension-gfm-table "^1.0.0" - micromark-extension-gfm-tagfilter "^1.0.0" - micromark-extension-gfm-task-list-item "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-factory-destination@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" - integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== +micromark-extension-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz#3e13376ab95dd7a5cfd0e29560dfe999657b3c5b" + integrity sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== + dependencies: + micromark-extension-gfm-autolink-literal "^2.0.0" + micromark-extension-gfm-footnote "^2.0.0" + micromark-extension-gfm-strikethrough "^2.0.0" + micromark-extension-gfm-table "^2.0.0" + micromark-extension-gfm-tagfilter "^2.0.0" + micromark-extension-gfm-task-list-item "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-destination@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz#8fef8e0f7081f0474fbdd92deb50c990a0264639" + integrity sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA== dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-factory-label@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" - integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== +micromark-factory-label@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz#5267efa97f1e5254efc7f20b459a38cb21058ba1" + integrity sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg== dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-factory-space@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" - integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== +micromark-factory-space@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz#36d0212e962b2b3121f8525fc7a3c7c029f334fc" + integrity sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg== dependencies: - micromark-util-character "^1.0.0" - micromark-util-types "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-types "^2.0.0" -micromark-factory-title@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" - integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== +micromark-factory-title@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz#237e4aa5d58a95863f01032d9ee9b090f1de6e94" + integrity sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw== dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-factory-whitespace@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" - integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== +micromark-factory-whitespace@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz#06b26b2983c4d27bfcc657b33e25134d4868b0b1" + integrity sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ== dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-util-character@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" - integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== +micromark-util-character@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz#2f987831a40d4c510ac261e89852c4e9703ccda6" + integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-util-chunked@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" - integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== +micromark-util-chunked@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz#47fbcd93471a3fccab86cff03847fc3552db1051" + integrity sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA== dependencies: - micromark-util-symbol "^1.0.0" + micromark-util-symbol "^2.0.0" -micromark-util-classify-character@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" - integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== +micromark-util-classify-character@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz#d399faf9c45ca14c8b4be98b1ea481bced87b629" + integrity sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q== dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-util-combine-extensions@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" - integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== +micromark-util-combine-extensions@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz#2a0f490ab08bff5cc2fd5eec6dd0ca04f89b30a9" + integrity sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg== dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-types "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-types "^2.0.0" -micromark-util-decode-numeric-character-reference@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" - integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== +micromark-util-decode-numeric-character-reference@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz#fcf15b660979388e6f118cdb6bf7d79d73d26fe5" + integrity sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw== dependencies: - micromark-util-symbol "^1.0.0" + micromark-util-symbol "^2.0.0" -micromark-util-decode-string@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" - integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== +micromark-util-decode-string@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz#6cb99582e5d271e84efca8e61a807994d7161eb2" + integrity sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ== dependencies: decode-named-character-reference "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-symbol "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-symbol "^2.0.0" -micromark-util-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" - integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== +micromark-util-encode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz#0d51d1c095551cfaac368326963cf55f15f540b8" + integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== -micromark-util-html-tag-name@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" - integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== +micromark-util-html-tag-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz#e40403096481986b41c106627f98f72d4d10b825" + integrity sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA== -micromark-util-normalize-identifier@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" - integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== +micromark-util-normalize-identifier@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz#c30d77b2e832acf6526f8bf1aa47bc9c9438c16d" + integrity sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q== dependencies: - micromark-util-symbol "^1.0.0" + micromark-util-symbol "^2.0.0" -micromark-util-resolve-all@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" - integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== +micromark-util-resolve-all@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz#e1a2d62cdd237230a2ae11839027b19381e31e8b" + integrity sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg== dependencies: - micromark-util-types "^1.0.0" + micromark-util-types "^2.0.0" -micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" - integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== +micromark-util-sanitize-uri@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz#ab89789b818a58752b73d6b55238621b7faa8fd7" + integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== dependencies: - micromark-util-character "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-symbol "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" -micromark-util-subtokenize@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" - integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== +micromark-util-subtokenize@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.3.tgz#70ffb99a454bd8c913c8b709c3dc97baefb65f96" + integrity sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg== dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" -micromark-util-symbol@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" - integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== +micromark-util-symbol@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz#e5da494e8eb2b071a0d08fb34f6cefec6c0a19b8" + integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== -micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" - integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== +micromark-util-types@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.1.tgz#a3edfda3022c6c6b55bfb049ef5b75d70af50709" + integrity sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ== -micromark@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" - integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== +micromark@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.1.tgz#294c2f12364759e5f9e925a767ae3dfde72223ff" + integrity sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw== dependencies: "@types/debug" "^4.0.0" debug "^4.0.0" decode-named-character-reference "^1.0.0" - micromark-core-commonmark "^1.0.1" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" micromatch@4.0.6: version "4.0.6" @@ -9981,11 +10074,6 @@ mock-fs@^5.2.0: resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-5.2.0.tgz#3502a9499c84c0a1218ee4bf92ae5bf2ea9b2b5e" integrity sha512-2dF2R6YMSZbpip1V1WHKGLNjr/k48uQClqMVb5H3MOvwc9qhYis3/IWbj02qIg/Y8MDXKFF4c5v0rxx2o6xTZw== -mri@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== - mrmime@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" @@ -10538,6 +10626,19 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-entities@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.2.tgz#61d46f5ed28e4ee62e9ddc43d6b010188443f159" + integrity sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw== + dependencies: + "@types/unist" "^2.0.0" + character-entities-legacy "^3.0.0" + character-reference-invalid "^2.0.0" + decode-named-character-reference "^1.0.0" + is-alphanumerical "^2.0.0" + is-decimal "^2.0.0" + is-hexadecimal "^2.0.0" + parse-github-url@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/parse-github-url/-/parse-github-url-1.0.2.tgz#242d3b65cbcdda14bb50439e3242acf6971db395" @@ -10849,7 +10950,7 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@15, prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.8.1: +prop-types@15, prop-types@^15.5.10, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -10997,26 +11098,21 @@ react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react-markdown@8.0.7: - version "8.0.7" - resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-8.0.7.tgz#c8dbd1b9ba5f1c5e7e5f2a44de465a3caafdf89b" - integrity sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ== - dependencies: - "@types/hast" "^2.0.0" - "@types/prop-types" "^15.0.0" - "@types/unist" "^2.0.0" - comma-separated-tokens "^2.0.0" - hast-util-whitespace "^2.0.0" - prop-types "^15.0.0" - property-information "^6.0.0" - react-is "^18.0.0" - remark-parse "^10.0.0" - remark-rehype "^10.0.0" - space-separated-tokens "^2.0.0" - style-to-object "^0.4.0" - unified "^10.0.0" - unist-util-visit "^4.0.0" - vfile "^5.0.0" +react-markdown@9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-9.0.1.tgz#c05ddbff67fd3b3f839f8c648e6fb35d022397d1" + integrity sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg== + dependencies: + "@types/hast" "^3.0.0" + devlop "^1.0.0" + hast-util-to-jsx-runtime "^2.0.0" + html-url-attributes "^3.0.0" + mdast-util-to-hast "^13.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.0.0" + unified "^11.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" react-measure@^2.5.2: version "2.5.2" @@ -11321,34 +11417,47 @@ release-zalgo@^1.0.0: dependencies: es6-error "^4.0.1" -remark-gfm@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f" - integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-gfm "^2.0.0" - micromark-extension-gfm "^2.0.0" - unified "^10.0.0" - -remark-parse@^10.0.0: - version "10.0.2" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.2.tgz#ca241fde8751c2158933f031a4e3efbaeb8bc262" - integrity sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw== +remark-gfm@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.0.tgz#aea777f0744701aa288b67d28c43565c7e8c35de" + integrity sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA== dependencies: - "@types/mdast" "^3.0.0" - mdast-util-from-markdown "^1.0.0" - unified "^10.0.0" + "@types/mdast" "^4.0.0" + mdast-util-gfm "^3.0.0" + micromark-extension-gfm "^3.0.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + unified "^11.0.0" -remark-rehype@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279" - integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== +remark-parse@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" + integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + micromark-util-types "^2.0.0" + unified "^11.0.0" + +remark-rehype@^11.0.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.1.tgz#f864dd2947889a11997c0a2667cd6b38f685bca7" + integrity sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +remark-stringify@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" + integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-to-hast "^12.1.0" - unified "^10.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-markdown "^2.0.0" + unified "^11.0.0" request-progress@^3.0.0: version "3.0.0" @@ -11377,7 +11486,7 @@ reselect@^4.1.7: resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.8.tgz#3f5dc671ea168dccdeb3e141236f69f02eaec524" integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== -resize-observer-polyfill@^1.5.0, resize-observer-polyfill@^1.5.1: +resize-observer-polyfill@^1.5.0: version "1.5.1" resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== @@ -11541,13 +11650,6 @@ rxjs@7.8.1, rxjs@^7.5.1, rxjs@^7.5.5, rxjs@^7.8.1: dependencies: tslib "^2.1.0" -sade@^1.7.3: - version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" - integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== - dependencies: - mri "^1.1.0" - safe-array-concat@^1.1.0, safe-array-concat@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" @@ -11610,11 +11712,6 @@ secure-compare@3.0.1: resolved "https://registry.yarnpkg.com/secure-compare/-/secure-compare-3.0.1.tgz#f1a0329b308b221fae37b9974f3d578d0ca999e3" integrity sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw== -select@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" - integrity sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA== - semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" @@ -12057,6 +12154,14 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +stringify-entities@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" + integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -12131,12 +12236,12 @@ strong-log-transformer@^2.1.0: minimist "^1.2.0" through "^2.3.4" -style-to-object@^0.4.0: - version "0.4.4" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" - integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== +style-to-object@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.8.tgz#67a29bca47eaa587db18118d68f9d95955e81292" + integrity sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g== dependencies: - inline-style-parser "0.1.1" + inline-style-parser "0.2.4" sugar-high@^0.6.1: version "0.6.1" @@ -12266,11 +12371,6 @@ throttleit@^1.0.0: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -tiny-emitter@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" - integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== - tiny-invariant@^1.0.2, tiny-invariant@^1.0.6: version "1.3.3" resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" @@ -12701,18 +12801,18 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -unified@^10.0.0: - version "10.1.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" - integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== +unified@^11.0.0: + version "11.0.5" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.5.tgz#f66677610a5c0a9ee90cab2b8d4d66037026d9e1" + integrity sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA== dependencies: - "@types/unist" "^2.0.0" + "@types/unist" "^3.0.0" bail "^2.0.0" + devlop "^1.0.0" extend "^3.0.0" - is-buffer "^2.0.0" is-plain-obj "^4.0.0" trough "^2.0.0" - vfile "^5.0.0" + vfile "^6.0.0" union@~0.5.0: version "0.5.0" @@ -12721,48 +12821,43 @@ union@~0.5.0: dependencies: qs "^6.4.0" -unist-util-generated@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" - integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== - -unist-util-is@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" - integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== +unist-util-is@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== dependencies: - "@types/unist" "^2.0.0" + "@types/unist" "^3.0.0" -unist-util-position@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" - integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== dependencies: - "@types/unist" "^2.0.0" + "@types/unist" "^3.0.0" -unist-util-stringify-position@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" - integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== +unist-util-stringify-position@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== dependencies: - "@types/unist" "^2.0.0" + "@types/unist" "^3.0.0" -unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: - version "5.1.3" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" - integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" -unist-util-visit@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" - integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== +unist-util-visit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.1.1" + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" universalify@^0.1.0: version "0.1.2" @@ -12867,16 +12962,6 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uvu@^0.5.0: - version "0.5.6" - resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" - integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== - dependencies: - dequal "^2.0.0" - diff "^5.0.0" - kleur "^4.0.3" - sade "^1.7.3" - v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" @@ -12957,23 +13042,21 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vfile-message@^3.0.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" - integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== +vfile-message@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" + integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^3.0.0" + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" -vfile@^5.0.0: - version "5.3.7" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" - integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== +vfile@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.3.tgz#3652ab1c496531852bf55a6bac57af981ebc38ab" + integrity sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^3.0.0" - vfile-message "^3.0.0" + "@types/unist" "^3.0.0" + vfile-message "^4.0.0" vite-node@1.6.0: version "1.6.0"