diff --git a/package.json b/package.json index a04e987..0d95a0a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "simple-ascii-chart", - "version": "4.0.6", + "version": "4.1.0", "description": "Simple ascii chart generator", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -19,8 +19,8 @@ "postversion": "git push && git push --tags" }, "devDependencies": { - "@types/jest": "^29.5.5", - "@types/node": "^20.6.2", + "@types/jest": "^29.5.12", + "@types/node": "^20.14.9", "@typescript-eslint/eslint-plugin": "^6.7.0", "@typescript-eslint/parser": "^6.7.0", "codecov": "^3.8.3", @@ -28,13 +28,13 @@ "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-import": "^2.28.1", - "husky": "^8.0.3", + "husky": "^9.0.11", "jest": "^29.7.0", - "lint-staged": "^14.0.1", - "prettier": "^3.0.3", - "ts-jest": "^29.1.1", - "tsc-watch": "^6.0.4", - "typescript": "^5.2.2" + "lint-staged": "^15.2.7", + "prettier": "^3.3.2", + "ts-jest": "^29.1.5", + "tsc-watch": "^6.2.0", + "typescript": "^5.5.3" }, "lint-staged": { "*.ts": "eslint . --ext .ts,.js --fix", diff --git a/src/services/__tests__/draw.test.ts b/src/services/__tests__/draw.test.ts index 692d839..1da24b9 100644 --- a/src/services/__tests__/draw.test.ts +++ b/src/services/__tests__/draw.test.ts @@ -25,6 +25,7 @@ describe('Drawing functions', () => { graph, yShift: 1, i: 0, + plotHeight: 3, scaledX: 1, shift: 0, signShift: 0, @@ -47,10 +48,13 @@ describe('Drawing functions', () => { yShift: 0, axis: { x: 0, y: 0 }, pointY: 1, + plotHeight: 3, transformLabel: (value: number) => value.toString(), axisSymbols: { y: 'Y' }, expansionX: [0], expansionY: [0, 1, 2], + coordsGetter: () => [0, 0] as Point, + plotGetter: () => [0, 0] as Point, }; drawYAxisEnd(params); @@ -71,10 +75,13 @@ describe('Drawing functions', () => { yShift: 1, axis: { x: 1, y: 1 }, pointY: 2, + plotHeight: 2, transformLabel: (value: number) => value.toString(), axisSymbols: AXIS, expansionX: [], expansionY: [], + coordsGetter: () => [0, 0] as Point, + plotGetter: () => [0, 0] as Point, }; drawYAxisEnd(args); expect(graph[2][3]).toEqual(AXIS.y); diff --git a/src/services/__tests__/overrides.test.ts b/src/services/__tests__/overrides.test.ts index a68df0d..9cb159b 100644 --- a/src/services/__tests__/overrides.test.ts +++ b/src/services/__tests__/overrides.test.ts @@ -57,7 +57,7 @@ describe('Graph Utility Functions', () => { it('should add the legend correctly', () => { const legend = { position: 'top', series: ['A', 'B'] } as Legend; - addLegend({ legend, graph, backgroundSymbol }); + addLegend({ legend, graph, backgroundSymbol, input: [[]] }); expect(graph[0].join('')).toContain('A'); expect(graph[1].join('')).toContain('B'); diff --git a/src/services/__tests__/settings.test.ts b/src/services/__tests__/settings.test.ts index 9d61b56..c327e6c 100644 --- a/src/services/__tests__/settings.test.ts +++ b/src/services/__tests__/settings.test.ts @@ -35,7 +35,7 @@ describe('getChartSymbols', () => { [['ansiBlack', 'ansiRed'], '\u001b[31m', 1], ])('', (input, output, series) => { it(input.toString(), () => { - const formatted = getChartSymbols(input as Color, series); + const formatted = getChartSymbols(input as Color, series, undefined, [[]], false); expect(formatted.we).toBe(`${output}━\u001b[0m`); expect(formatted.wns).toBe(`${output}┓\u001b[0m`); expect(formatted.ns).toBe(`${output}┃\u001b[0m`); diff --git a/src/services/coords.ts b/src/services/coords.ts index 2e7e2d4..bf24219 100644 --- a/src/services/coords.ts +++ b/src/services/coords.ts @@ -78,10 +78,26 @@ export const toSorted = (array: SingleLine): SingleLine => * @param {number} plotHeight - The height of the plot. * @returns {function} - A function that takes (x, y) and returns plot coordinates [scaledX, scaledY]. */ -export const toPlot = (plotWidth: number, plotHeight: number) => (x: number, y: number) => [ - Math.round((x / plotWidth) * plotWidth), - plotHeight - 1 - Math.round((y / plotHeight) * plotHeight), -]; +export const toPlot = + (plotWidth: number, plotHeight: number) => + (x: number, y: number): Point => [ + Math.round((x / plotWidth) * plotWidth), + plotHeight - 1 - Math.round((y / plotHeight) * plotHeight), + ]; + +/** + * Converts plot coordinates (scaledX, scaledY) back to the original coordinates in the specified plot dimensions. + * @param {number} plotWidth - The width of the plot. + * @param {number} plotHeight - The height of the plot. + * @returns {function} - A function that takes (scaledX, scaledY) and returns original coordinates [x, y]. + */ +export const fromPlot = + (plotWidth: number, plotHeight: number) => + (scaledX: number, scaledY: number): [number, number] => { + const x = (scaledX / plotWidth) * plotWidth; + const y = (plotHeight - 1 - scaledY) * (plotHeight / plotHeight); + return [Math.round(x), Math.round(y)]; + }; /** * Finds the maximum or minimum value in a single-line array of points. @@ -179,10 +195,9 @@ export const getPlotCoords = ( return coordinates.map(toScale); }; - /** * Gets the center point for an axis. - * @param {Point | void} axisCenter - The center point of the axis (optional). + * @param {Point | [number | undefined, number | undefined] | undefined} axisCenter - The center point of the axis. * @param {number} plotWidth - The width of the plot. * @param {number} plotHeight - The height of the plot. * @param {number[]} rangeX - The range of x values. @@ -191,20 +206,29 @@ export const getPlotCoords = ( * @returns {Point} - The center point of the axis. */ export const getAxisCenter = ( - axisCenter: Point | void, + axisCenter: Point | [number | undefined, number | undefined] | undefined, plotWidth: number, plotHeight: number, rangeX: number[], rangeY: number[], - initialValue: number[], -) => { + initialValue: [number, number], +): { x: number; y: number } => { const axis = { x: initialValue[0], y: initialValue[1] }; - // calculate axis position + if (axisCenter) { - const [centerX, centerY] = toCoordinates(axisCenter, plotWidth, plotHeight, rangeX, rangeY); - const [plotCenterX, plotCenterY] = toPlot(plotWidth, plotHeight)(centerX, centerY); - axis.x = plotCenterX; - axis.y = plotCenterY + 1; + const [x, y] = axisCenter; + + if (typeof x === 'number') { + const xScaler = scaler(rangeX, [0, plotWidth - 1]); + const xCoord = xScaler(x); + axis.x = Math.round(xCoord); + } + + if (typeof y === 'number') { + const yScaler = scaler(rangeY, [0, plotHeight - 1]); + const yCoord = yScaler(y); + axis.y = plotHeight - Math.round(yCoord); + } } return axis; diff --git a/src/services/defaults.ts b/src/services/defaults.ts index 7e797d0..fd48737 100644 --- a/src/services/defaults.ts +++ b/src/services/defaults.ts @@ -19,10 +19,12 @@ export const getChartSize = ({ input, width, height, + yRange, }: { input: MultiLine; width?: number; height?: number; + yRange?: [number, number]; }) => { const [rangeX, rangeY] = toArrays(input); @@ -32,7 +34,7 @@ export const getChartSize = ({ const maxY = getMax(rangeY); const expansionX = [minX, maxX]; - const expansionY = [minY, maxY]; + const expansionY = yRange || [minY, maxY]; // set default size const plotWidth = width || rangeX.length; diff --git a/src/services/draw.ts b/src/services/draw.ts index 26a42a9..b931683 100644 --- a/src/services/draw.ts +++ b/src/services/draw.ts @@ -1,5 +1,5 @@ import { AXIS, CHART } from '../constants'; -import { CustomSymbol, Formatter, Graph, MultiLine, Point, Symbols } from '../types'; +import { CustomSymbol, Formatter, Graph, MaybePoint, MultiLine, Point, Symbols } from '../types'; import { distance, toArray, toEmpty } from './coords'; export const drawXAxisEnd = ({ @@ -16,7 +16,7 @@ export const drawXAxisEnd = ({ pointXShift, }: { hasPlaceToRender: boolean; - axisCenter?: Point; + axisCenter?: Point | [number | undefined, number | undefined]; yPos: number; graph: Graph; yShift: number; @@ -28,15 +28,37 @@ export const drawXAxisEnd = ({ pointXShift: string[]; }) => { const yShiftWhenOccupied = hasPlaceToRender ? -1 : 0; - const yShiftWhenHasAxisCenter = axisCenter ? 1 : 0; + const yShiftWhenHasAxisCenter = axisCenter && axisCenter[1] !== undefined ? 1 : 0; - const graphY = yPos + yShiftWhenOccupied + yShiftWhenHasAxisCenter; - const graphX = scaledX + yShift - i + 2 + shift; + let graphY = yPos + yShiftWhenOccupied + yShiftWhenHasAxisCenter; + + // Boundary check + if (graphY < 0) { + graphY = 0; + } else if (graphY >= graph.length) { + graphY = graph.length - 1; + } + + let graphX = scaledX + yShift - i + 2 + shift; + + // Ensure graphX is within bounds + if (graphX < 0) { + graphX = 0; + } else if (graphX >= graph[graphY].length) { + graphX = graph[graphY].length - 1; + } graph[graphY][graphX] = pointXShift[pointXShift.length - 1 - i]; + // Add X tick only for the last value if (pointXShift.length - 1 === i) { - graph[yPos + signShift][scaledX + yShift + 2 + shift] = axisSymbols?.x || AXIS.x; + const xTickY = yPos + signShift; + const xTickX = scaledX + yShift + 2 + shift; + + // Ensure xTickY and xTickX are within bounds + if (xTickY >= 0 && xTickY < graph.length && xTickX >= 0 && xTickX < graph[xTickY].length) { + graph[xTickY][xTickX] = axisSymbols?.x || AXIS.x; + } } }; @@ -45,23 +67,82 @@ export const drawYAxisEnd = ({ scaledY, yShift, axis, + axisCenter, pointY, transformLabel, axisSymbols, expansionX, expansionY, + plotHeight, + showTickLabel, }: { graph: Graph; scaledY: number; yShift: number; + plotHeight: number; axis: { x: number; y: number }; + axisCenter?: MaybePoint; pointY: number; transformLabel: Formatter; axisSymbols: Symbols['axis']; expansionX: number[]; expansionY: number[]; + showTickLabel?: boolean; }) => { - // make sure position is not taken already + // Show all labels when showTickLabel is true + if (showTickLabel) { + const yMax = Math.max(...expansionY); + const yMin = Math.min(...expansionY); + + // Decide the number of ticks you want on the Y-axis + const numTicks = plotHeight; // You can adjust this number as needed + + // Calculate the step size for each tick + const yStep = (yMax - yMin) / numTicks; + + for (let i = 0; i <= numTicks; i += 1) { + // Calculate the Y value for this tick + const yValue = yMax - i * yStep; + + // Map the Y value to a graph Y position + const scaledYPos = ((yMax - yValue) / (yMax - yMin)) * (plotHeight - 1); + + const labelShift = axisCenter?.[1] !== undefined && axisCenter?.[1] > 0 ? 1 : 0; + + // Round to get the exact row index in the graph array + const graphYPos = Math.floor(scaledYPos) + 1 + labelShift; + + // Ensure the graphYPos is within the bounds of the graph array + if (graphYPos >= 0 && graphYPos < graph.length) { + // Check if the position is not already occupied + if (graph[graphYPos][axis.x + yShift + 1] !== axisSymbols?.y) { + const pointYShift = toArray( + transformLabel(yValue, { axis: 'y', xRange: expansionX, yRange: expansionY }), + ); + + // Place the tick label on the graph + for (let j = 0; j < pointYShift.length; j += 1) { + const colIndex = axis.x + yShift - j; + + // Ensure colIndex is within bounds + if (colIndex >= 0 && colIndex < graph[graphYPos].length) { + graph[graphYPos][colIndex] = pointYShift[pointYShift.length - 1 - j]; + } + } + + const tickMarkIndex = axis.x + yShift + 1; + + // Ensure tickMarkIndex is within bounds + if (tickMarkIndex >= 0 && tickMarkIndex < graph[graphYPos].length) { + graph[graphYPos][tickMarkIndex] = axisSymbols?.y || AXIS.y; + } + } + } + } + return; + } + + // Existing code for showing only values that are present if (graph[scaledY + 1][axis.x + yShift + 1] !== axisSymbols?.y) { const pointYShift = toArray( transformLabel(pointY, { axis: 'y', xRange: expansionX, yRange: expansionY }), @@ -84,7 +165,7 @@ export const drawAxis = ({ graph: Graph; axis: { x: number; y: number }; hideXAxis?: boolean; - axisCenter?: Point; + axisCenter?: MaybePoint; hideYAxis?: boolean; axisSymbols: Symbols['axis']; }) => { diff --git a/src/services/overrides.ts b/src/services/overrides.ts index 911a895..122f532 100644 --- a/src/services/overrides.ts +++ b/src/services/overrides.ts @@ -1,5 +1,5 @@ import { CHART } from '../constants'; -import { Colors, Formatter, Graph, Legend, Point, Symbols, Threshold } from '../types'; +import { Colors, Formatter, Graph, Legend, MultiLine, Point, Symbols, Threshold } from '../types'; import { getPlotCoords, toArray, toEmpty, toPlot } from './coords'; import { defaultFormatter, getAnsiColor, getChartSymbols } from './settings'; @@ -77,10 +77,12 @@ export const addLegend = ({ color, symbols, fillArea, + input, }: { graph: Graph; legend: Legend; backgroundSymbol: string; + input: MultiLine; color?: Colors; symbols?: Symbols; fillArea?: boolean; @@ -101,7 +103,7 @@ export const addLegend = ({ series.forEach((label, index) => { if (lineIndex !== index) return; // get chart symbols for series - const chartSymbols = getChartSymbols(color, index, symbols?.chart, fillArea); + const chartSymbols = getChartSymbols(color, index, symbols?.chart, input, fillArea); const reversedLabel = [ chartSymbols.area, @@ -122,7 +124,7 @@ export const addLegend = ({ series.forEach((label, index) => { // get chart symbols for series - const chartSymbols = getChartSymbols(color, index, symbols?.chart, fillArea); + const chartSymbols = getChartSymbols(color, index, symbols?.chart, input, fillArea); const newSymbol = [ chartSymbols.area, backgroundSymbol, @@ -144,7 +146,7 @@ export const addLegend = ({ graph.unshift(toEmpty(graph[0].length, backgroundSymbol)); // top // get chart symbols for series - const chartSymbols = getChartSymbols(color, index, symbols?.chart, fillArea); + const chartSymbols = getChartSymbols(color, index, symbols?.chart, input, fillArea); const newSymbol = [chartSymbols.area, backgroundSymbol, ...Array.from(label)]; graph[index].forEach((_, symbolIndex) => { @@ -161,7 +163,7 @@ export const addLegend = ({ graph.push(toEmpty(graph[0].length, backgroundSymbol)); // bottom // get chart symbols for series - const chartSymbols = getChartSymbols(color, index, symbols?.chart, fillArea); + const chartSymbols = getChartSymbols(color, index, symbols?.chart, input, fillArea); const newSymbol = [chartSymbols.area, backgroundSymbol, ...Array.from(label)]; graph[index].forEach((_, symbolIndex) => { diff --git a/src/services/plot.ts b/src/services/plot.ts index f1d9875..f22d107 100644 --- a/src/services/plot.ts +++ b/src/services/plot.ts @@ -32,6 +32,8 @@ export const plot: Plot = ( color, width, height, + yRange, + showTickLabel, axisCenter, formatter, lineFormatter, @@ -62,6 +64,7 @@ export const plot: Plot = ( width, height, input, + yRange, }); const { axisSymbols, emptySymbol, backgroundSymbol, borderSymbol } = getSymbols({ symbols }); @@ -76,7 +79,7 @@ export const plot: Plot = ( // get default chart symbols input.forEach((coords: SingleLine, series) => { // override default chart symbols with colored ones - const chartSymbols = getChartSymbols(color, series, symbols?.chart, fillArea); + const chartSymbols = getChartSymbols(color, series, symbols?.chart, input, fillArea); // sort input by the first value const sortedCoords = toSorted(coords); @@ -152,8 +155,11 @@ export const plot: Plot = ( const [scaledX, scaledY] = toPlot(plotWidth, plotHeight)(x, y); if (!hideYAxis) { drawYAxisEnd({ + showTickLabel, + plotHeight, graph, scaledY, + axisCenter, yShift, axis, pointY, @@ -184,18 +190,36 @@ export const plot: Plot = ( signShift = -2; } - const isSymbolOnXAxisOccupied = - graph[yPos + signShift][scaledX + yShift + 2 + shift] === axisSymbols.x; + const rowIndex = yPos + signShift; + const colIndex = scaledX + yShift + 2 + shift; + + // Check if rowIndex is within bounds + const rowExists = rowIndex >= 0 && rowIndex < graph.length; + + // Initialize isSymbolOnXAxisOccupied + let isSymbolOnXAxisOccupied = false; + + if (rowExists) { + const row = graph[rowIndex]; + + // Check if colIndex is within bounds + const colExists = colIndex >= 0 && colIndex < row.length; + + if (colExists) { + isSymbolOnXAxisOccupied = row[colIndex] === axisSymbols.x; + } + } // Make sure position is not taken already if (isSymbolOnXAxisOccupied) { break; } - // make sure that shift is applied only when place is taken + // Apply shift only when place is taken if (axisCenter) { yPos = axis.y + 1; } + drawXAxisEnd({ hasPlaceToRender, axisCenter, @@ -250,6 +274,7 @@ export const plot: Plot = ( if (legend) { addLegend({ + input, graph, legend, backgroundSymbol, diff --git a/src/services/settings.ts b/src/services/settings.ts index cbe3c75..4761fe4 100644 --- a/src/services/settings.ts +++ b/src/services/settings.ts @@ -1,5 +1,5 @@ import { CHART } from '../constants/index'; -import { Color, Formatter } from '../types/index'; +import { Color, ColorGetter, Formatter, MultiLine } from '../types/index'; const colorMap: Record = { ansiBlack: '\u001b[30m', @@ -15,9 +15,10 @@ const colorMap: Record = { export const getAnsiColor = (color: Color): string => colorMap[color] || colorMap.ansiWhite; export const getChartSymbols = ( - color: Color | Color[] | undefined, + color: Color | Color[] | undefined | ColorGetter, series: number, chartSymbols: Partial | void, + input: MultiLine, fillArea?: boolean, ) => { const chart = { ...CHART, ...chartSymbols }; @@ -27,10 +28,18 @@ export const getChartSymbols = ( }); } if (color) { - const currentColor = Array.isArray(color) ? color[series] : color; + let currentColor: Color = 'ansiWhite'; + + if (Array.isArray(color)) { + currentColor = color[series]; + } else if (typeof color === 'function') { + currentColor = color(series, input); + } else if (color) { + currentColor = color; + } Object.entries(chart).forEach(([key, sign]) => { - chart[key as keyof typeof chart] = `${getAnsiColor(currentColor as Color)}${sign}\u001b[0m`; + chart[key as keyof typeof chart] = `${getAnsiColor(currentColor)}${sign}\u001b[0m`; }); } return chart; diff --git a/src/types/index.ts b/src/types/index.ts index 7342631..b74bb03 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,6 +1,7 @@ import { AXIS, CHART } from '../constants'; export type Point = [x: number, y: number]; +export type MaybePoint = Point | undefined | [number | undefined, number | undefined]; export type SingleLine = Point[]; export type MultiLine = SingleLine[]; @@ -48,12 +49,15 @@ export type Threshold = { y?: number; color?: Color; }; -export type Colors = Color | Color[]; +export type ColorGetter = (series: number, coordinates: MultiLine) => Color; +export type Colors = Color | Color[] | ColorGetter; export type Graph = string[][]; export type Settings = { color?: Colors; width?: number; height?: number; + yRange?: [number, number]; + showTickLabel?: boolean; hideXAxis?: boolean; hideYAxis?: boolean; title?: string; @@ -62,7 +66,7 @@ export type Settings = { thresholds?: Threshold[]; fillArea?: boolean; legend?: Legend; - axisCenter?: Point; + axisCenter?: MaybePoint; formatter?: Formatter; lineFormatter?: (args: LineFormatterArgs) => CustomSymbol | CustomSymbol[]; symbols?: Symbols; diff --git a/yarn.lock b/yarn.lock index 8b69f74..6431469 100644 --- a/yarn.lock +++ b/yarn.lock @@ -697,10 +697,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^29.5.5": - version "29.5.5" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.5.tgz#727204e06228fe24373df9bae76b90f3e8236a2a" - integrity sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg== +"@types/jest@^29.5.12": + version "29.5.12" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" + integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -715,11 +715,18 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/node@*", "@types/node@^20.6.2": +"@types/node@*": version "20.6.4" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.4.tgz#7882cb8b8adc3106c352dac9c02d4d3ebb95cf3e" integrity sha512-nU6d9MPY0NBUMiE/nXd2IIoC4OLvsLpwAjheoAeuzgvDZA1Cb10QYg+91AF6zQiKWRN5i1m07x6sMe0niBznoQ== +"@types/node@^20.14.9": + version "20.14.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.9.tgz#12e8e765ab27f8c421a1820c99f5f313a933b420" + integrity sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg== + dependencies: + undici-types "~5.26.4" + "@types/semver@^7.5.0": version "7.5.2" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.2.tgz#31f6eec1ed7ec23f4f05608d3a2d381df041f564" @@ -861,12 +868,10 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.21.3" -ansi-escapes@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-5.0.0.tgz#b6a0caf0eef0c41af190e9a749e0c00ec04bb2a6" - integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== - dependencies: - type-fest "^1.0.2" +ansi-escapes@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.1.tgz#76c54ce9b081dad39acec4b5d53377913825fb0f" + integrity sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig== ansi-regex@^5.0.1: version "5.0.1" @@ -897,7 +902,7 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.0.0, ansi-styles@^6.1.0: +ansi-styles@^6.0.0, ansi-styles@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== @@ -1080,6 +1085,13 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + browserslist@^4.21.9: version "4.21.11" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.11.tgz#35f74a3e51adc4d193dcd76ea13858de7b8fecb8" @@ -1137,11 +1149,6 @@ caniuse-lite@^1.0.30001538: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz#9dbc6b9af1ff06b5eb12350c2012b3af56744f3f" integrity sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw== -chalk@5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== - chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -1159,6 +1166,11 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" @@ -1181,13 +1193,13 @@ cli-cursor@^4.0.0: dependencies: restore-cursor "^4.0.0" -cli-truncate@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" - integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== +cli-truncate@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== dependencies: slice-ansi "^5.0.0" - string-width "^5.0.0" + string-width "^7.0.0" cliui@^8.0.1: version "8.0.1" @@ -1248,10 +1260,10 @@ colorette@^2.0.20: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -commander@11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67" - integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== +commander@~12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== concat-map@0.0.1: version "0.0.1" @@ -1295,7 +1307,7 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -1309,6 +1321,13 @@ debug@^3.2.7: dependencies: ms "^2.1.1" +debug@~4.3.4: + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + dedent@^1.0.0: version "1.5.1" resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" @@ -1378,11 +1397,6 @@ duplexer@~0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - electron-to-chromium@^1.4.526: version "1.4.528" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz#7c900fd73d9d2e8bb0dab0e301f25f0f4776ef2c" @@ -1393,16 +1407,16 @@ emittery@^0.13.1: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== +emoji-regex@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" + integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -1666,21 +1680,6 @@ eventemitter3@^5.0.1: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== -execa@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" - integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^4.3.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -1696,6 +1695,21 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@~8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -1773,6 +1787,13 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -1855,6 +1876,11 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-east-asian-width@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" + integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== + get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" @@ -1870,11 +1896,16 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@^6.0.0, get-stream@^6.0.1: +get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -2030,15 +2061,15 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -human-signals@^4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" - integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== -husky@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" - integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== +husky@^9.0.11: + version "9.0.11" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.0.11.tgz#fc91df4c756050de41b3e478b2158b87c1e79af9" + integrity sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw== ignore-walk@3.0.4: version "3.0.4" @@ -2158,6 +2189,13 @@ is-fullwidth-code-point@^4.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== +is-fullwidth-code-point@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" + integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== + dependencies: + get-east-asian-width "^1.0.0" + is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" @@ -2748,43 +2786,43 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -lilconfig@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== +lilconfig@~3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" + integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -lint-staged@^14.0.1: - version "14.0.1" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-14.0.1.tgz#57dfa3013a3d60762d9af5d9c83bdb51291a6232" - integrity sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw== - dependencies: - chalk "5.3.0" - commander "11.0.0" - debug "4.3.4" - execa "7.2.0" - lilconfig "2.1.0" - listr2 "6.6.1" - micromatch "4.0.5" - pidtree "0.6.0" - string-argv "0.3.2" - yaml "2.3.1" - -listr2@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-6.6.1.tgz#08b2329e7e8ba6298481464937099f4a2cd7f95d" - integrity sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg== - dependencies: - cli-truncate "^3.1.0" +lint-staged@^15.2.7: + version "15.2.7" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.7.tgz#97867e29ed632820c0fb90be06cd9ed384025649" + integrity sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw== + dependencies: + chalk "~5.3.0" + commander "~12.1.0" + debug "~4.3.4" + execa "~8.0.1" + lilconfig "~3.1.1" + listr2 "~8.2.1" + micromatch "~4.0.7" + pidtree "~0.6.0" + string-argv "~0.3.2" + yaml "~2.4.2" + +listr2@~8.2.1: + version "8.2.3" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.3.tgz#c494bb89b34329cf900e4e0ae8aeef9081d7d7a5" + integrity sha512-Lllokma2mtoniUOS94CcOErHWAug5iu7HOmDrvWgpw8jyQH2fomgB+7lZS4HWZxytUuQwkGOwe49FvwVaA85Xw== + dependencies: + cli-truncate "^4.0.0" colorette "^2.0.20" eventemitter3 "^5.0.1" - log-update "^5.0.1" - rfdc "^1.3.0" - wrap-ansi "^8.1.0" + log-update "^6.0.0" + rfdc "^1.4.1" + wrap-ansi "^9.0.0" locate-path@^5.0.0: version "5.0.0" @@ -2810,16 +2848,16 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -log-update@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-5.0.1.tgz#9e928bf70cb183c1f0c9e91d9e6b7115d597ce09" - integrity sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw== +log-update@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.0.0.tgz#0ddeb7ac6ad658c944c1de902993fce7c33f5e59" + integrity sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw== dependencies: - ansi-escapes "^5.0.0" + ansi-escapes "^6.2.0" cli-cursor "^4.0.0" - slice-ansi "^5.0.0" - strip-ansi "^7.0.1" - wrap-ansi "^8.0.1" + slice-ansi "^7.0.0" + strip-ansi "^7.1.0" + wrap-ansi "^9.0.0" lru-cache@^5.1.1: version "5.1.1" @@ -2869,7 +2907,7 @@ 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== -micromatch@4.0.5, micromatch@^4.0.4: +micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -2877,6 +2915,14 @@ micromatch@4.0.5, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" +micromatch@~4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -3142,7 +3188,7 @@ picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pidtree@0.6.0: +pidtree@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== @@ -3164,10 +3210,10 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" - integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== +prettier@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a" + integrity sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA== pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" @@ -3276,10 +3322,10 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== +rfdc@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== rimraf@^3.0.2: version "3.0.2" @@ -3361,6 +3407,11 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -3379,6 +3430,14 @@ slice-ansi@^5.0.0: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" +slice-ansi@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" + integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + source-map-support@0.5.13: version "0.5.13" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" @@ -3425,7 +3484,7 @@ stream-events@^1.0.5: dependencies: stubs "^3.0.0" -string-argv@0.3.2, string-argv@^0.3.1: +string-argv@^0.3.1, string-argv@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== @@ -3447,14 +3506,14 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.0, string-width@^5.0.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== +string-width@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" string.prototype.trim@^1.2.8: version "1.2.8" @@ -3490,7 +3549,7 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1: +strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== @@ -3610,10 +3669,10 @@ ts-api-utils@^1.0.1: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== -ts-jest@^29.1.1: - version "29.1.1" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.1.tgz#f58fe62c63caf7bfcc5cc6472082f79180f0815b" - integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== +ts-jest@^29.1.5: + version "29.1.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.5.tgz#d6c0471cc78bffa2cb4664a0a6741ef36cfe8f69" + integrity sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg== dependencies: bs-logger "0.x" fast-json-stable-stringify "2.x" @@ -3624,10 +3683,10 @@ ts-jest@^29.1.1: semver "^7.5.3" yargs-parser "^21.0.1" -tsc-watch@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/tsc-watch/-/tsc-watch-6.0.4.tgz#af15229f03cd53086771a97b10653db063bc6c59" - integrity sha512-cHvbvhjO86w2aGlaHgSCeQRl+Aqw6X6XN4sQMPZKF88GoP30O+oTuh5lRIJr5pgFWrRpF1AgXnJJ2DoFEIPHyg== +tsc-watch@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tsc-watch/-/tsc-watch-6.2.0.tgz#4b191c36c6ed24c2bf6e721013af0825cd73d217" + integrity sha512-2LBhf9kjKXnz7KQ/puLHlozMzzUNHAdYBNMkg3eksQJ9GBAgMg8czznM83T5PmsoUvDnXzfIeQn2lNcIYDr8LA== dependencies: cross-spawn "^7.0.3" node-cleanup "^2.1.2" @@ -3666,11 +3725,6 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^1.0.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== - typed-array-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" @@ -3710,10 +3764,10 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" -typescript@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" - integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== +typescript@^5.5.3: + version "5.5.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.3.tgz#e1b0a3c394190838a0b168e771b0ad56a0af0faa" + integrity sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== unbox-primitive@^1.0.2: version "1.0.2" @@ -3725,6 +3779,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + update-browserslist-db@^1.0.13: version "1.0.13" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" @@ -3819,14 +3878,14 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== +wrap-ansi@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" + integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" wrappy@1: version "1.0.2" @@ -3856,10 +3915,10 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" - integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== +yaml@~2.4.2: + version "2.4.5" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" + integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1"