diff --git a/frontend/package.json b/frontend/package.json index 5fcae7cce..1b47cf74f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -61,6 +61,7 @@ "start": "react-app-rewired start --scripts-version react-scripts", "build": "BUILD_PATH='./build' react-app-rewired build --openssl-legacy-provider build", "test": "react-app-rewired test", + "test-coverage": "react-app-rewired test --coverage", "test:ci": "CI=true react-app-rewired test", "eject": "react-scripts eject", "format": "prettier --write .", diff --git a/frontend/src/store/slice/Pipeline/Pipeline.test.ts b/frontend/src/store/slice/Pipeline/Pipeline.test.ts new file mode 100644 index 000000000..afa709b9d --- /dev/null +++ b/frontend/src/store/slice/Pipeline/Pipeline.test.ts @@ -0,0 +1,388 @@ +import { expect, describe, test, beforeEach } from "@jest/globals" +import { AnyAction } from "@reduxjs/toolkit" + +import { + run, + runByCurrentUid, + pollRunResult, + cancelResult, +} from "store/slice/Pipeline/PipelineActions" +import * as selectors from "store/slice/Pipeline/PipelineSelectors" +import reducer, { initialState } from "store/slice/Pipeline/PipelineSlice" +import { + createFulfilledWithRunPostDataAction, + createPendingAction, + createPendingWithRequestIdAction, + createRejectedAction, + createRunResultAndCancelFulfilledAction, + createRunResultAndCancelRejectedAction, + runPostData, + pollRunResultPayload, +} from "store/slice/Pipeline/PipelineTestUtils" +import { + NODE_RESULT_STATUS, + Pipeline, + PipelineType, + RUN_STATUS, +} from "store/slice/Pipeline/PipelineType" +import { isStartedPipeline } from "store/slice/Pipeline/PipelineUtils" +import { RootState } from "store/store" + +describe("Pipeline State Test", () => { + describe("Pipeline Run", () => { + test(run.fulfilled.type, () => { + const runFulfilledAction = createFulfilledWithRunPostDataAction( + run, + ) as AnyAction + const targetState = reducer( + reducer(initialState, createPendingWithRequestIdAction(run)), + runFulfilledAction, + ) + + const expectState = { + currentPipeline: { uid: "response data" }, + run: { + runPostData, + runResult: {}, + status: RUN_STATUS.START_SUCCESS, + uid: "response data", + }, + runBtn: 1, + } + expect(targetState).toEqual(expectState) + }) + + test(run.pending.type, () => { + const targetState = reducer( + initialState, + createPendingWithRequestIdAction(run), + ) + const expectState = { + run: { status: RUN_STATUS.START_PENDING }, + runBtn: 1, + } + expect(targetState).toEqual(expectState) + }) + + test(run.rejected.type, () => { + const targetState = reducer( + reducer(initialState, createPendingWithRequestIdAction(run)), + createRejectedAction(run), + ) + const expectState = { run: { status: RUN_STATUS.START_ERROR }, runBtn: 1 } + expect(targetState).toEqual(expectState) + }) + }) + + describe("Pipeline RunByCurrentId", () => { + test(runByCurrentUid.fulfilled.type, () => { + const runByCurrentUidFulfilledAction = + createFulfilledWithRunPostDataAction(runByCurrentUid) + const targetState = reducer( + reducer(initialState, createPendingAction(runByCurrentUid)), + runByCurrentUidFulfilledAction, + ) + + const expectState = { + currentPipeline: { uid: "response data" }, + run: { + runPostData, + runResult: {}, + status: RUN_STATUS.START_SUCCESS, + uid: "response data", + }, + runBtn: 1, + } + expect(targetState).toEqual(expectState) + }) + + test(runByCurrentUid.pending.type, () => { + const targetState = reducer( + initialState, + createPendingAction(runByCurrentUid), + ) + const expectState = { + run: { status: RUN_STATUS.START_PENDING }, + runBtn: 1, + } + expect(targetState).toEqual(expectState) + }) + + test(runByCurrentUid.rejected.type, () => { + const targetState = reducer( + reducer(initialState, createPendingAction(runByCurrentUid)), + createRejectedAction(runByCurrentUid), + ) + const expectState = { run: { status: RUN_STATUS.START_ERROR }, runBtn: 1 } + expect(targetState).toEqual(expectState) + }) + }) + + describe("Pipeline PollRunResult", () => { + test(pollRunResult.fulfilled.type, () => { + const mockState: Pipeline = { + ...initialState, + run: { + ...initialState.run, + status: "StartSuccess" as const, // Ensures TypeScript treats this as a literal + runResult: { + node1: { + status: "success", + name: "Node 1", + message: "", + outputPaths: { + output1: { path: "./output/path", type: "image" }, + }, + }, + node2: { status: "pending", name: "Node 2", message: "" }, + }, + uid: "test-uid", + runPostData, + }, + } + + const targetState = reducer( + reducer(mockState, createPendingAction(pollRunResult)), + createRunResultAndCancelFulfilledAction( + pollRunResult, + pollRunResultPayload, + ), + ) + + const expectState = { + ...initialState, + run: { + ...initialState.run, + runPostData, + runResult: { + node1: { + status: "success", + message: "Node 1 completed successfully", + name: "Node 1", + outputPaths: { + output1: { path: "/path/to/output1", type: "image" }, + }, + }, + node2: { + status: "error", + message: "Node 2 failed", + name: "Node 2", + }, + }, + status: RUN_STATUS.FINISHED, + uid: "test-uid", + }, + } + expect(targetState).toEqual(expectState) + }) + + test(pollRunResult.rejected.type, () => { + const targetState = reducer( + reducer(initialState, createPendingAction(pollRunResult)), + createRunResultAndCancelRejectedAction(pollRunResult, "error message"), + ) + const expectState = { + ...initialState, + run: { ...initialState.run, status: RUN_STATUS.ABORTED }, + } + expect(targetState).toEqual(expectState) + }) + }) + + describe("Pipeline CancelResult", () => { + test(cancelResult.fulfilled.type, () => { + const targetState = reducer( + reducer(initialState, createPendingAction(cancelResult)), + createRunResultAndCancelFulfilledAction( + cancelResult, + "Cancellation successful", + ), + ) + + const expectState = { + ...initialState, + run: { + ...initialState.run, + status: RUN_STATUS.CANCELED, + }, + } + expect(targetState).toEqual(expectState) + }) + + // Status is not changing when CancelResult is pending at PipelineSlice + test(cancelResult.pending.type, () => { + const targetState = reducer( + initialState, + createPendingWithRequestIdAction(cancelResult), + ) + const expectState = { + run: { status: RUN_STATUS.START_UNINITIALIZED }, + runBtn: 1, + } + expect(targetState).toEqual(expectState) + }) + + // Status is not changing when CancelResult is rejected at PipelineSlice + test(cancelResult.rejected.type, () => { + const targetState = reducer( + reducer(initialState, createPendingWithRequestIdAction(cancelResult)), + createRunResultAndCancelRejectedAction(cancelResult, "error message"), + ) + const expectState = { + ...initialState, + run: { ...initialState.run, status: RUN_STATUS.START_UNINITIALIZED }, + } + expect(targetState).toEqual(expectState) + }) + }) +}) + +describe("PipelineUtils isStartedPipeline", () => { + test("returns true for status RUN_STATUS.START_SUCCESS", () => { + const pipeline: PipelineType = { + status: RUN_STATUS.START_SUCCESS, + uid: "test-uid", + runPostData: runPostData, + runResult: {}, + } + expect(isStartedPipeline(pipeline)).toBe(true) + }) + + test("returns true for status RUN_STATUS.FINISHED", () => { + const pipeline: PipelineType = { + status: RUN_STATUS.FINISHED, + uid: "test-uid", + runPostData: runPostData, + runResult: {}, + } + expect(isStartedPipeline(pipeline)).toBe(true) + }) + + test("returns true for status RUN_STATUS.ABORTED", () => { + const pipeline: PipelineType = { + status: RUN_STATUS.ABORTED, + uid: "test-uid", + runPostData: runPostData, + runResult: {}, + } + expect(isStartedPipeline(pipeline)).toBe(true) + }) + + test("returns false for status other than START_SUCCESS, FINISHED, or ABORTED", () => { + const pipeline: PipelineType = { + status: RUN_STATUS.START_PENDING, // Example of a non-started status + // add other necessary fields for PipelineType if needed + } + expect(isStartedPipeline(pipeline)).toBe(false) + }) +}) + +describe("Pipeline Selectors", () => { + let initialState: RootState + + beforeEach(() => { + initialState = { + pipeline: { + currentPipeline: { uid: "123" }, + run: { + runResult: { + node1: { + status: "pending", + message: "Processing...", + nodeResult: { + status: NODE_RESULT_STATUS.PENDING, + }, + }, + node2: { + status: "success", + message: "Completed", + outputPaths: { key1: { path: "/output/file1", type: "csv" } }, + }, + }, + status: RUN_STATUS.START_SUCCESS, + }, + runBtn: false, + }, + experiments: { + status: "fulfilled", + experimentList: { + "123": { name: "Pipeline 123" }, + }, + }, + } as unknown as RootState + }) + + test("selectPipelineLatestUid should return the latest pipeline UID", () => { + const result = selectors.selectPipelineLatestUid(initialState) + expect(result).toBe("123") + }) + + test("selectCurrentPipelineName should return the current pipeline name", () => { + const result = selectors.selectCurrentPipelineName(initialState) + expect(result).toBe("Pipeline 123") + }) + + test("selectRunResultPendingList should return pending nodes", () => { + const result = selectors.selectRunResultPendingList(initialState) + const expectedValue = [ + { + message: "Processing...", + nodeResult: { status: "pending" }, + status: "pending", + }, + ] + expect(result).toEqual(expectedValue) + }) + + test("selectRunResultPendingNodeIdList should return pending node IDs", () => { + const result = selectors.selectRunResultPendingNodeIdList(initialState) + expect(result).toEqual(["node1"]) + }) + + test("selectPipelineIsStartedSuccess should return true if pipeline is started successfully", () => { + const result = selectors.selectPipelineIsStartedSuccess(initialState) + expect(result).toBe(true) + }) + + test("selectPipelineNodeResultOutputFilePath should return the output file path for a given node and key", () => { + const result = selectors.selectPipelineNodeResultOutputFilePath( + "node2", + "key1", + )(initialState) + expect(result).toBe("/output/file1") + }) + + test("selectPipelineNodeResultOutputFileDataType should return the data type for a given node and key", () => { + const result = selectors.selectPipelineNodeResultOutputFileDataType( + "node2", + "key1", + )(initialState) + expect(result).toBe("csv") + }) + + test("selectPipelineNodeResultMessage should return the message for a given node", () => { + const result = + selectors.selectPipelineNodeResultMessage("node1")(initialState) + expect(result).toBe("Processing...") + }) + + test("selectPipelineNodeResultOutputKeyList should return the output keys for a given node", () => { + const result = + selectors.selectPipelineNodeResultOutputKeyList("node2")(initialState) + expect(result).toEqual(["key1"]) + }) + + test("selectPipelineNodeResultSuccessList should return nodes with success status", () => { + const result = selectors.selectPipelineNodeResultSuccessList(initialState) + expect(result).toEqual([ + { + nodeId: "node2", + nodeResult: { + status: "success", + message: "Completed", + outputPaths: { key1: { path: "/output/file1", type: "csv" } }, + }, + }, + ]) + }) +}) diff --git a/frontend/src/store/slice/Pipeline/PipelineSlice.ts b/frontend/src/store/slice/Pipeline/PipelineSlice.ts index 5f3dfc95b..4c25a8920 100644 --- a/frontend/src/store/slice/Pipeline/PipelineSlice.ts +++ b/frontend/src/store/slice/Pipeline/PipelineSlice.ts @@ -26,7 +26,7 @@ import { fetchWorkflow, } from "store/slice/Workflow/WorkflowActions" -const initialState: Pipeline = { +export const initialState: Pipeline = { run: { status: RUN_STATUS.START_UNINITIALIZED, }, diff --git a/frontend/src/store/slice/Pipeline/PipelineTestUtils.ts b/frontend/src/store/slice/Pipeline/PipelineTestUtils.ts new file mode 100644 index 000000000..22c3413fb --- /dev/null +++ b/frontend/src/store/slice/Pipeline/PipelineTestUtils.ts @@ -0,0 +1,177 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { Edge } from "reactflow" + +import { AsyncThunk, AnyAction } from "@reduxjs/toolkit" + +import { + NodeDict, + InputNodePostData, + AlgorithmNodePostData, + EdgeDict, + RunPostData, +} from "api/run/Run" +import { ParamType, ParamMap } from "utils/param/ParamType" + +const requestId = "FmYmw6sCHA2Ll5JJfPuJN" + +// Factory for reusable mock data structures +const createNodeDict = (): NodeDict => ({ + node1: { + id: "node1", + position: { x: 0, y: 0 }, + data: { + type: "input", + label: "input1", + path: "/path/to/input", + fileType: "image", + } as InputNodePostData, + }, + node2: { + id: "node2", + position: { x: 1, y: 1 }, + data: { + path: "/path/to/algorithm", + param: { + key: { + type: "child", + value: "", + path: "key", + children: { + key1: { + type: "child", + value: "value1", + path: "key.key1", + } as ParamType, + }, + }, + } as ParamMap, + } as AlgorithmNodePostData, + }, +}) + +const createEdgeDict = (): EdgeDict => ({ + node1: { id: "node1", type: "type1", data: { key: "value1" } } as Edge, + node2: { id: "node2", type: "type2", data: { key: "value2" } } as Edge, +}) + +const createSnakemakeParam = (): ParamMap => ({ + config: { + type: "parent", + children: { + cores: { type: "child", value: 4, path: "config.cores" }, + memory: { type: "child", value: "16GB", path: "config.memory" }, + restartTimes: { type: "child", value: 3, path: "config.restartTimes" }, + }, + }, +}) + +const createNwbParam = (): ParamMap => ({ + config: { + type: "parent", + children: { + filePath: { + type: "child", + value: "/path/to/nwb/file", + path: "nwbParam.filePath", + }, + options: { + type: "child", + value: { option1: true, option2: false }, + path: "nwbParam.options", + }, + }, + }, +}) + +export const runPostData: RunPostData = { + name: "record test", + nodeDict: createNodeDict(), + edgeDict: createEdgeDict(), + snakemakeParam: createSnakemakeParam(), + nwbParam: createNwbParam(), + forceRunList: [], +} + +export const pollRunResultPayload = { + node1: { + status: "success", + message: "Node 1 completed successfully", + name: "Node 1", + outputPaths: { + output1: { path: "/path/to/output1", type: "images" }, + }, + }, + node2: { status: "failed", message: "Node 2 failed", name: "Node 2" }, +} + +export const createFulfilledWithRunPostDataAction = ( + actionType: AsyncThunk, + payload = "response data", +) => ({ + type: actionType.fulfilled.type, + meta: { + requestId: requestId, + requestStatus: "fulfilled", + arg: { runPostData }, + }, + payload, +}) + +export const createPendingWithRequestIdAction = ( + actionType: AsyncThunk, +): AnyAction => ({ + type: actionType.pending.type, + meta: { + requestId: requestId, + requestStatus: "pending", + }, +}) + +export const createRejectedAction = ( + actionType: AsyncThunk, + error = "error message", +) => ({ + type: actionType.rejected.type, + meta: { + requestId: requestId, + requestStatus: "rejected", + arg: { runPostData }, + }, + error, +}) + +export const createPendingAction = ( + actionType: AsyncThunk, +): AnyAction => ({ + type: actionType.pending.type, + meta: { + requestStatus: "pending", + }, +}) + +export const createRunResultAndCancelFulfilledAction = ( + actionType: AsyncThunk, + payload: any, +) => ({ + type: actionType.fulfilled.type, + meta: { + requestId: requestId, + requestStatus: "fulfilled", + arg: { uid: "test-uid" }, + }, + payload, +}) + +export const createRunResultAndCancelRejectedAction = ( + actionType: AsyncThunk, + errorMessage: string, +) => ({ + type: actionType.rejected.type, + meta: { + requestId: requestId, + requestStatus: "rejected", + arg: { uid: "test-uid" }, + }, + error: errorMessage, +}) diff --git a/frontend/yarn.lock b/frontend/yarn.lock index da6c88cd7..c967312a0 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -1232,16 +1232,16 @@ resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz#2cbcf822bf3764c9658c4d2e568bd0c0cb748016" integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== -"@emotion/babel-plugin@^11.12.0": - version "11.12.0" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz#7b43debb250c313101b3f885eba634f1d723fcc2" - integrity sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw== +"@emotion/babel-plugin@^11.13.5": + version "11.13.5" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz#eab8d65dbded74e0ecfd28dc218e75607c4e7bc0" + integrity sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ== dependencies: "@babel/helper-module-imports" "^7.16.7" "@babel/runtime" "^7.18.3" "@emotion/hash" "^0.9.2" "@emotion/memoize" "^0.9.0" - "@emotion/serialize" "^1.2.0" + "@emotion/serialize" "^1.3.3" babel-plugin-macros "^3.1.0" convert-source-map "^1.5.0" escape-string-regexp "^4.0.0" @@ -1249,14 +1249,14 @@ source-map "^0.5.7" stylis "4.2.0" -"@emotion/cache@^11.11.0", "@emotion/cache@^11.13.0": - version "11.13.1" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.13.1.tgz#fecfc54d51810beebf05bf2a161271a1a91895d7" - integrity sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw== +"@emotion/cache@^11.11.0", "@emotion/cache@^11.13.5": + version "11.13.5" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.13.5.tgz#e78dad0489e1ed7572507ba8ed9d2130529e4266" + integrity sha512-Z3xbtJ+UcK76eWkagZ1onvn/wAVb1GOMuR15s30Fm2wrMgC7jzpnO2JZXr4eujTTqoQFUrZIw/rT0c6Zzjca1g== dependencies: "@emotion/memoize" "^0.9.0" "@emotion/sheet" "^1.4.0" - "@emotion/utils" "^1.4.0" + "@emotion/utils" "^1.4.2" "@emotion/weak-memoize" "^0.4.0" stylis "4.2.0" @@ -1290,28 +1290,28 @@ integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ== "@emotion/react@^11.7.1": - version "11.13.3" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.13.3.tgz#a69d0de2a23f5b48e0acf210416638010e4bd2e4" - integrity sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg== + version "11.13.5" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.13.5.tgz#fc818ff5b13424f86501ba4d0740f343ae20b8d9" + integrity sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ== dependencies: "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.12.0" - "@emotion/cache" "^11.13.0" - "@emotion/serialize" "^1.3.1" + "@emotion/babel-plugin" "^11.13.5" + "@emotion/cache" "^11.13.5" + "@emotion/serialize" "^1.3.3" "@emotion/use-insertion-effect-with-fallbacks" "^1.1.0" - "@emotion/utils" "^1.4.0" + "@emotion/utils" "^1.4.2" "@emotion/weak-memoize" "^0.4.0" hoist-non-react-statics "^3.3.1" -"@emotion/serialize@^1.2.0", "@emotion/serialize@^1.3.0", "@emotion/serialize@^1.3.1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.2.tgz#e1c1a2e90708d5d85d81ccaee2dfeb3cc0cccf7a" - integrity sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA== +"@emotion/serialize@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.3.tgz#d291531005f17d704d0463a032fe679f376509e8" + integrity sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA== dependencies: "@emotion/hash" "^0.9.2" "@emotion/memoize" "^0.9.0" "@emotion/unitless" "^0.10.0" - "@emotion/utils" "^1.4.1" + "@emotion/utils" "^1.4.2" csstype "^3.0.2" "@emotion/sheet@^1.4.0": @@ -1320,16 +1320,16 @@ integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg== "@emotion/styled@^11.6.0": - version "11.13.0" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.13.0.tgz#633fd700db701472c7a5dbef54d6f9834e9fb190" - integrity sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA== + version "11.13.5" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.13.5.tgz#0fa6602227414c5e42cf267506e3c35bae655df9" + integrity sha512-gnOQ+nGLPvDXgIx119JqGalys64lhMdnNQA9TMxhDA4K0Hq5+++OE20Zs5GxiCV9r814xQ2K5WmtofSpHVW6BQ== dependencies: "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.12.0" + "@emotion/babel-plugin" "^11.13.5" "@emotion/is-prop-valid" "^1.3.0" - "@emotion/serialize" "^1.3.0" + "@emotion/serialize" "^1.3.3" "@emotion/use-insertion-effect-with-fallbacks" "^1.1.0" - "@emotion/utils" "^1.4.0" + "@emotion/utils" "^1.4.2" "@emotion/unitless@0.8.1": version "0.8.1" @@ -1346,10 +1346,10 @@ resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz#1a818a0b2c481efba0cf34e5ab1e0cb2dcb9dfaf" integrity sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw== -"@emotion/utils@^1.4.0", "@emotion/utils@^1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.1.tgz#b3adbb43de12ee2149541c4f1337d2eb7774f0ad" - integrity sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA== +"@emotion/utils@^1.4.2": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.2.tgz#6df6c45881fcb1c412d6688a311a98b7f59c1b52" + integrity sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA== "@emotion/weak-memoize@^0.4.0": version "0.4.0" @@ -1835,14 +1835,14 @@ prop-types "^15.8.1" "@mui/base@^5.0.0-beta.20": - version "5.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.61.tgz#729e816b5104da1eeeacb11d1e61be90f2c21dcc" - integrity sha512-YaMOTXS3ecDNGsPKa6UdlJ8loFLvcL9+VbpCK3hfk71OaNauZRp4Yf7KeXDYr7Ms3M/XBD3SaiR6JMr6vYtfDg== + version "5.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.62.tgz#d5cec750691f76f997b3678a2053d99464155caa" + integrity sha512-TzJLCNlrMkSU4bTCdTT+TVUiGx4sjZLhH673UV6YN+rNNP8wJpkWfRSvjDB5HcbH2T0lUamnz643ZnV+8IiMjw== dependencies: "@babel/runtime" "^7.26.0" "@floating-ui/react-dom" "^2.1.1" "@mui/types" "^7.2.19" - "@mui/utils" "^6.1.6" + "@mui/utils" "^6.1.8" "@popperjs/core" "^2.11.8" clsx "^2.1.1" prop-types "^15.8.1" @@ -1940,10 +1940,10 @@ prop-types "^15.8.1" react-is "^18.3.1" -"@mui/utils@^6.1.6": - version "6.1.7" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-6.1.7.tgz#0959d9772ae13c6ceac984a493e06aebb9087e71" - integrity sha512-Gr7cRZxBoZ0BIa3Xqf/2YaUrBLyNPJvXPQH3OsD9WMZukI/TutibbQBVqLYpgqJn8pKSjbD50Yq2auG0wI1xOw== +"@mui/utils@^6.1.8": + version "6.1.8" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-6.1.8.tgz#ae07cad4f6099eeb43dbc71267b4a96304ba3982" + integrity sha512-O2DWb1kz8hiANVcR7Z4gOB3SvPPsSQGUmStpyBDzde6dJIfBzgV9PbEQOBZd3EBsd1pB+Uv1z5LAJAbymmawrA== dependencies: "@babel/runtime" "^7.26.0" "@mui/types" "^7.2.19" @@ -2800,9 +2800,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz#3c9997ae9d00bc236e45c6374e84f2596458d9db" - integrity sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA== + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz#812d2871e5eea17fb0bd5214dda7a7b748c0e12a" + integrity sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2965,16 +2965,16 @@ "@types/node" "*" "@types/node@*": - version "22.9.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.0.tgz#b7f16e5c3384788542c72dc3d561a7ceae2c0365" - integrity sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ== + version "22.9.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.3.tgz#08f3d64b3bc6d74b162d36f60213e8a6704ef2b4" + integrity sha512-F3u1fs/fce3FFk+DAxbxc78DF8x0cY09RRL8GnXLmkJ1jvx3TtPdWoTT5/NiYfI5ASqXBmfqJi9dZ3gxMx4lzw== dependencies: undici-types "~6.19.8" "@types/node@^20.9.0": - version "20.17.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.6.tgz#6e4073230c180d3579e8c60141f99efdf5df0081" - integrity sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ== + version "20.17.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.7.tgz#790151a28c5a172773d95d53a0c23d3c59a883c4" + integrity sha512-sZXXnpBFMKbao30dUAvzKbdwA2JM1fwUtVEq/kxKuPI5mMwZiRElCpTXb0Biq/LMEVpXDZL5G5V0RPnxKeyaYg== dependencies: undici-types "~6.19.2" @@ -4282,9 +4282,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001669: - version "1.0.30001680" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz#5380ede637a33b9f9f1fc6045ea99bd142f3da5e" - integrity sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA== + version "1.0.30001684" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz#0eca437bab7d5f03452ff0ef9de8299be6b08e16" + integrity sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ== canvas-fit@^1.5.0: version "1.5.0" @@ -4334,9 +4334,9 @@ char-regex@^1.0.2: integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== char-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-2.0.1.tgz#6dafdb25f9d3349914079f010ba8d0e6ff9cd01e" - integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw== + version "2.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-2.0.2.tgz#81385bb071af4df774bff8721d0ca15ef29ea0bb" + integrity sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg== check-types@^11.2.3: version "11.2.3" @@ -5591,9 +5591,9 @@ ejs@^3.1.6: jake "^10.8.5" electron-to-chromium@^1.5.41: - version "1.5.63" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.63.tgz#69444d592fbbe628d129866c2355691ea93eda3e" - integrity sha512-ddeXKuY9BHo/mw145axlyWjlJ1UBt4WK3AlvkT7W2AbqfRQoacVoRUCF6wL3uIx/8wT9oLKXzI+rFqHHscByaA== + version "1.5.64" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.64.tgz#ac8c4c89075d35a1514b620f47dfe48a71ec3697" + integrity sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ== element-size@^1.1.1: version "1.1.1" @@ -5686,7 +5686,7 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" -es-abstract@^1.17.2, es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: +es-abstract@^1.17.2, es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5: version "1.23.5" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.5.tgz#f4599a4946d57ed467515ed10e4f157289cd52fb" integrity sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ== @@ -6870,7 +6870,7 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" -globalthis@^1.0.3, globalthis@^1.0.4: +globalthis@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== @@ -7511,12 +7511,12 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-finalizationregistry@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" - integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== +is-finalizationregistry@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz#d74a7d0c5f3578e34a20729e69202e578d495dc2" + integrity sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" is-finite@^1.0.1: version "1.1.0" @@ -10370,9 +10370,9 @@ proxy-from-env@^1.1.0: integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== psl@^1.1.33: - version "1.10.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.10.0.tgz#1450f7e16f922c3beeb7bd9db3f312635018fa15" - integrity sha512-KSKHEbjAnpUuAUserOq0FxGXCUrzC3WniuSJhvdbs102rL55266ZcHBqLWOsG30spQMlPdpy7icATiAQehg/iA== + version "1.13.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.13.0.tgz#8b2357f13ef3cf546af3f52de00543a94da86cfa" + integrity sha512-BFwmFXiJoFqlUpZ5Qssolv15DMyc84gTBds1BjsV1BfXEo1UyyD7GsmN67n7J77uRhoSNW1AXtXKPLcBFQn9Aw== dependencies: punycode "^2.3.1" @@ -10797,18 +10797,18 @@ redux@^4.0.0, redux@^4.0.4, redux@^4.0.5, redux@^4.2.0, redux@^4.2.1: dependencies: "@babel/runtime" "^7.9.2" -reflect.getprototypeof@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" - integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== +reflect.getprototypeof@^1.0.4, reflect.getprototypeof@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz#04311b33a1b713ca5eb7b5aed9950a86481858e5" + integrity sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" - es-abstract "^1.23.1" + es-abstract "^1.23.5" es-errors "^1.3.0" get-intrinsic "^1.2.4" - globalthis "^1.0.3" - which-builtin-type "^1.1.3" + gopd "^1.0.1" + which-builtin-type "^1.1.4" regenerate-unicode-properties@^10.2.0: version "10.2.0" @@ -10855,14 +10855,14 @@ regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2, regexp.prototype.f set-function-name "^2.0.2" regexpu-core@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.1.1.tgz#b469b245594cb2d088ceebc6369dceb8c00becac" - integrity sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw== + version "6.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.2.0.tgz#0e5190d79e542bf294955dccabae04d3c7d53826" + integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== dependencies: regenerate "^1.4.2" regenerate-unicode-properties "^10.2.0" regjsgen "^0.8.0" - regjsparser "^0.11.0" + regjsparser "^0.12.0" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" @@ -10871,10 +10871,10 @@ regjsgen@^0.8.0: resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== -regjsparser@^0.11.0: - version "0.11.2" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.11.2.tgz#7404ad42be00226d72bcf1f003f1f441861913d8" - integrity sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA== +regjsparser@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc" + integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== dependencies: jsesc "~3.0.2" @@ -12216,9 +12216,9 @@ tryer@^1.0.1: integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== ts-api-utils@^1.0.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.0.tgz#709c6f2076e511a81557f3d07a0cbd566ae8195c" - integrity sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ== + version "1.4.1" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.1.tgz#7c0a304cd446d9a497c24c960b8abbf0bc1611ae" + integrity sha512-5RU2/lxTA3YUZxju61HO2U6EoZLvBLtmV2mbTvqyu4a/7s7RmJPT+1YekhMVsQhznRWk/czIwDUg+V8Q9ZuG4w== ts-interface-checker@^0.1.9: version "0.1.13" @@ -12325,9 +12325,9 @@ typed-array-byte-length@^1.0.1: is-typed-array "^1.1.13" typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz#3fa9f22567700cc86aaf86a1e7176f74b59600f2" + integrity sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw== dependencies: available-typed-arrays "^1.0.7" call-bind "^1.0.7" @@ -12335,18 +12335,19 @@ typed-array-byte-offset@^1.0.2: gopd "^1.0.1" has-proto "^1.0.3" is-typed-array "^1.1.13" + reflect.getprototypeof "^1.0.6" typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== dependencies: call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-proto "^1.0.3" is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" typedarray-pool@^1.1.0: version "1.2.0" @@ -12369,9 +12370,9 @@ typedarray@^0.0.6: integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== typescript@^5.2.2: - version "5.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" - integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== + version "5.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" + integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== unbox-primitive@^1.0.2: version "1.0.2" @@ -12778,16 +12779,17 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-builtin-type@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.4.tgz#592796260602fc3514a1b5ee7fa29319b72380c3" - integrity sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w== +which-builtin-type@^1.1.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.0.tgz#58042ac9602d78a6d117c7e811349df1268ba63c" + integrity sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA== dependencies: + call-bind "^1.0.7" function.prototype.name "^1.1.6" has-tostringtag "^1.0.2" is-async-function "^2.0.0" is-date-object "^1.0.5" - is-finalizationregistry "^1.0.2" + is-finalizationregistry "^1.1.0" is-generator-function "^1.0.10" is-regex "^1.1.4" is-weakref "^1.0.2" @@ -13116,9 +13118,9 @@ yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yaml@^2.3.4: - version "2.6.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.0.tgz#14059ad9d0b1680d0f04d3a60fe00f3a857303c3" - integrity sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ== + version "2.6.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.6.1.tgz#42f2b1ba89203f374609572d5349fb8686500773" + integrity sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg== yaml@~2.5.0: version "2.5.1"