Add functionality to download custom reports as an image. (#4219)

* Add functionality to download custom reports as an image.

* Add functionality to download custom reports as an image.

* Switched from html2canvas to html-to-image due to size considerations.

* Snapshot filename

* Add functionality to download custom reports as an image.

* Add functionality to download custom reports as an image.

* Update ReportTopbar.tsx

Fixed mistake

* Use existing date function

* fix imports

* Update VRT

* move component out of common in aid of components lib migration

---------

Co-authored-by: Matt Fiddaman <github@m.fiddaman.uk>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
This commit is contained in:
ADRROE
2025-04-08 17:20:22 +02:00
committed by GitHub
parent 6b22e7422b
commit 0d420ab4d9
30 changed files with 295 additions and 20 deletions

View File

@@ -65,6 +65,7 @@
"eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-rulesdir": "^0.2.2", "eslint-plugin-rulesdir": "^0.2.2",
"globals": "^15.13.0", "globals": "^15.13.0",
"html-to-image": "^1.11.11",
"husky": "^9.1.7", "husky": "^9.1.7",
"lint-staged": "^15.5.0", "lint-staged": "^15.5.0",
"node-jq": "^4.0.2", "node-jq": "^4.0.2",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

After

Width:  |  Height:  |  Size: 121 KiB

View File

@@ -9,12 +9,15 @@ import {
SvgListBullet, SvgListBullet,
SvgQueue, SvgQueue,
SvgTag, SvgTag,
SvgCamera,
SvgChartArea, SvgChartArea,
} from '@actual-app/components/icons/v1'; } from '@actual-app/components/icons/v1';
import { SpaceBetween } from '@actual-app/components/space-between'; import { SpaceBetween } from '@actual-app/components/space-between';
import { theme } from '@actual-app/components/theme'; import { theme } from '@actual-app/components/theme';
import { View } from '@actual-app/components/view'; import { View } from '@actual-app/components/view';
import { toPng } from 'html-to-image';
import * as monthUtils from 'loot-core/shared/months';
import { import {
type CustomReportEntity, type CustomReportEntity,
type RuleConditionEntity, type RuleConditionEntity,
@@ -25,6 +28,7 @@ import { FilterButton } from '../filters/FiltersMenu';
import { GraphButton } from './GraphButton'; import { GraphButton } from './GraphButton';
import { SaveReport } from './SaveReport'; import { SaveReport } from './SaveReport';
import { setSessionReport } from './setSessionReport'; import { setSessionReport } from './setSessionReport';
import { SnapshotButton } from './SnapshotButton';
type ReportTopbarProps = { type ReportTopbarProps = {
customReportItems: CustomReportEntity; customReportItems: CustomReportEntity;
@@ -63,6 +67,20 @@ export function ReportTopbar({
defaultItems(cond); defaultItems(cond);
}; };
const downloadSnapshot = async () => {
const reportElement = document.getElementById('custom-report-content');
const title = report.name;
if (reportElement) {
const dataUrl = await toPng(reportElement);
const link = document.createElement('a');
link.href = dataUrl;
link.download = `${monthUtils.currentDay()} - ${title}.png`;
link.click();
} else {
console.error('Report container not found.');
}
};
return ( return (
<View <View
style={{ style={{
@@ -180,7 +198,6 @@ export function ReportTopbar({
> >
<SvgTag width={15} height={15} /> <SvgTag width={15} height={15} />
</GraphButton> </GraphButton>
<View <View
style={{ style={{
width: 1, width: 1,
@@ -190,7 +207,22 @@ export function ReportTopbar({
flexShrink: 0, flexShrink: 0,
}} }}
/> />
<SnapshotButton
style={{ marginRight: 15 }}
title={t('Download Snapshot')}
onSelect={downloadSnapshot}
>
<SvgCamera width={15} height={15} />
</SnapshotButton>
<View
style={{
width: 1,
height: 30,
backgroundColor: theme.pillBorderDark,
marginRight: 15,
flexShrink: 0,
}}
/>
<SpaceBetween <SpaceBetween
style={{ style={{
flexWrap: 'nowrap', flexWrap: 'nowrap',

View File

@@ -0,0 +1,45 @@
import React, { type ReactNode, type CSSProperties } from 'react';
import { Button } from '@actual-app/components/button';
import { styles } from '@actual-app/components/styles';
import { Text } from '@actual-app/components/text';
import { theme } from '@actual-app/components/theme';
import { Tooltip } from '@actual-app/components/tooltip';
type SnapshotButtonProps = {
selected?: boolean;
children: ReactNode;
style?: CSSProperties;
onSelect?: () => void;
title?: string;
};
export function SnapshotButton({
selected,
children,
style,
onSelect,
title,
}: SnapshotButtonProps) {
return (
<Tooltip
placement="bottom start"
content={<Text>{title}</Text>}
style={{ ...styles.tooltip, lineHeight: 1.5, padding: '6px 10px' }}
>
<Button
variant="bare"
style={{
...(selected && {
backgroundColor: theme.buttonBareBackgroundHover,
}),
...style,
}}
onPress={onSelect}
aria-label={title}
>
{children}
</Button>
</Tooltip>
);
}

View File

@@ -848,6 +848,7 @@ function CustomReportInner({ report: initialReport }: CustomReportInnerProps) {
</View> </View>
)} )}
<View <View
id="custom-report-content"
style={{ style={{
backgroundColor: theme.tableBackground, backgroundColor: theme.tableBackground,
flexDirection: 'row', flexDirection: 'row',

View File

@@ -0,0 +1,6 @@
---
category: Features
authors: [ADRROE]
---
Add functionality to download custom reports as an image.

226
yarn.lock
View File

@@ -434,7 +434,14 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.26.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": "@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3":
version: 7.22.5
resolution: "@babel/helper-plugin-utils@npm:7.22.5"
checksum: 10/ab220db218089a2aadd0582f5833fd17fa300245999f5f8784b10f5a75267c4e808592284a29438a0da365e702f05acb369f99e1c915c02f9f9210ec60eab8ea
languageName: node
linkType: hard
"@babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.26.5":
version: 7.26.5 version: 7.26.5
resolution: "@babel/helper-plugin-utils@npm:7.26.5" resolution: "@babel/helper-plugin-utils@npm:7.26.5"
checksum: 10/1cc0fd8514da3bb249bed6c27227696ab5e84289749d7258098701cffc0c599b7f61ec40dd332f8613030564b79899d9826813c96f966330bcfc7145a8377857 checksum: 10/1cc0fd8514da3bb249bed6c27227696ab5e84289749d7258098701cffc0c599b7f61ec40dd332f8613030564b79899d9826813c96f966330bcfc7145a8377857
@@ -486,6 +493,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/helper-string-parser@npm:^7.24.8":
version: 7.24.8
resolution: "@babel/helper-string-parser@npm:7.24.8"
checksum: 10/6d1bf8f27dd725ce02bdc6dffca3c95fb9ab8a06adc2edbd9c1c9d68500274230d1a609025833ed81981eff560045b6b38f7b4c6fb1ab19fc90e5004e3932535
languageName: node
linkType: hard
"@babel/helper-string-parser@npm:^7.25.9": "@babel/helper-string-parser@npm:^7.25.9":
version: 7.25.9 version: 7.25.9
resolution: "@babel/helper-string-parser@npm:7.25.9" resolution: "@babel/helper-string-parser@npm:7.25.9"
@@ -500,6 +514,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/helper-validator-identifier@npm:^7.24.7":
version: 7.24.7
resolution: "@babel/helper-validator-identifier@npm:7.24.7"
checksum: 10/86875063f57361471b531dbc2ea10bbf5406e12b06d249b03827d361db4cad2388c6f00936bcd9dc86479f7e2c69ea21412c2228d4b3672588b754b70a449d4b
languageName: node
linkType: hard
"@babel/helper-validator-option@npm:^7.23.5, @babel/helper-validator-option@npm:^7.25.9": "@babel/helper-validator-option@npm:^7.23.5, @babel/helper-validator-option@npm:^7.25.9":
version: 7.25.9 version: 7.25.9
resolution: "@babel/helper-validator-option@npm:7.25.9" resolution: "@babel/helper-validator-option@npm:7.25.9"
@@ -528,7 +549,18 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.26.10, @babel/parser@npm:^7.26.9": "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7":
version: 7.25.6
resolution: "@babel/parser@npm:7.25.6"
dependencies:
"@babel/types": "npm:^7.25.6"
bin:
parser: ./bin/babel-parser.js
checksum: 10/830aab72116aa14eb8d61bfa8f9d69fc8f3a43d909ce993cb4350ae14d3af1a2f740a54410a22d821c48a253263643dfecbc094f9608e6a70ce9ff3c0bbfe91a
languageName: node
linkType: hard
"@babel/parser@npm:^7.23.9, @babel/parser@npm:^7.26.10, @babel/parser@npm:^7.26.9":
version: 7.26.10 version: 7.26.10
resolution: "@babel/parser@npm:7.26.10" resolution: "@babel/parser@npm:7.26.10"
dependencies: dependencies:
@@ -694,7 +726,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/plugin-syntax-jsx@npm:^7.25.9, @babel/plugin-syntax-jsx@npm:^7.7.2": "@babel/plugin-syntax-jsx@npm:^7.25.9":
version: 7.25.9 version: 7.25.9
resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" resolution: "@babel/plugin-syntax-jsx@npm:7.25.9"
dependencies: dependencies:
@@ -705,6 +737,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/plugin-syntax-jsx@npm:^7.7.2":
version: 7.22.5
resolution: "@babel/plugin-syntax-jsx@npm:7.22.5"
dependencies:
"@babel/helper-plugin-utils": "npm:^7.22.5"
peerDependencies:
"@babel/core": ^7.0.0-0
checksum: 10/8829d30c2617ab31393d99cec2978e41f014f4ac6f01a1cecf4c4dd8320c3ec12fdc3ce121126b2d8d32f6887e99ca1a0bad53dedb1e6ad165640b92b24980ce
languageName: node
linkType: hard
"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4, @babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": "@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4, @babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3":
version: 7.10.4 version: 7.10.4
resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4"
@@ -793,7 +836,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/plugin-syntax-typescript@npm:^7.25.9, @babel/plugin-syntax-typescript@npm:^7.7.2": "@babel/plugin-syntax-typescript@npm:^7.25.9":
version: 7.25.9 version: 7.25.9
resolution: "@babel/plugin-syntax-typescript@npm:7.25.9" resolution: "@babel/plugin-syntax-typescript@npm:7.25.9"
dependencies: dependencies:
@@ -804,6 +847,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/plugin-syntax-typescript@npm:^7.7.2":
version: 7.22.5
resolution: "@babel/plugin-syntax-typescript@npm:7.22.5"
dependencies:
"@babel/helper-plugin-utils": "npm:^7.22.5"
peerDependencies:
"@babel/core": ^7.0.0-0
checksum: 10/8ab7718fbb026d64da93681a57797d60326097fd7cb930380c8bffd9eb101689e90142c760a14b51e8e69c88a73ba3da956cb4520a3b0c65743aee5c71ef360a
languageName: node
linkType: hard
"@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": "@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6":
version: 7.18.6 version: 7.18.6
resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6"
@@ -1589,6 +1643,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/types@npm:^7.25.6":
version: 7.25.6
resolution: "@babel/types@npm:7.25.6"
dependencies:
"@babel/helper-string-parser": "npm:^7.24.8"
"@babel/helper-validator-identifier": "npm:^7.24.7"
to-fast-properties: "npm:^2.0.0"
checksum: 10/7b54665e1b51f525fe0f451efdd9fe7a4a6dfba3fd4956c3530bc77336b66ffe3d78c093796ed044119b5d213176af7cf326f317a2057c538d575c6cefcb3562
languageName: node
linkType: hard
"@bcoe/v8-coverage@npm:^0.2.3": "@bcoe/v8-coverage@npm:^0.2.3":
version: 0.2.3 version: 0.2.3
resolution: "@bcoe/v8-coverage@npm:0.2.3" resolution: "@bcoe/v8-coverage@npm:0.2.3"
@@ -5566,7 +5631,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/babel__core@npm:^7, @types/babel__core@npm:^7.1.14": "@types/babel__core@npm:^7":
version: 7.20.5 version: 7.20.5
resolution: "@types/babel__core@npm:7.20.5" resolution: "@types/babel__core@npm:7.20.5"
dependencies: dependencies:
@@ -5579,6 +5644,19 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/babel__core@npm:^7.1.14":
version: 7.20.0
resolution: "@types/babel__core@npm:7.20.0"
dependencies:
"@babel/parser": "npm:^7.20.7"
"@babel/types": "npm:^7.20.7"
"@types/babel__generator": "npm:*"
"@types/babel__template": "npm:*"
"@types/babel__traverse": "npm:*"
checksum: 10/b82e432bfc42075d4f6218e5ed5c4a7cdeb087e0416f969fc65a755c41d129d7e369c93e9a9dc59d43291327aa8d7cd149f3573d1c3b54d0192561d02bb225eb
languageName: node
linkType: hard
"@types/babel__generator@npm:*": "@types/babel__generator@npm:*":
version: 7.6.4 version: 7.6.4
resolution: "@types/babel__generator@npm:7.6.4" resolution: "@types/babel__generator@npm:7.6.4"
@@ -5800,7 +5878,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6": "@types/estree@npm:*, @types/estree@npm:^1.0.6":
version: 1.0.6 version: 1.0.6
resolution: "@types/estree@npm:1.0.6" resolution: "@types/estree@npm:1.0.6"
checksum: 10/9d35d475095199c23e05b431bcdd1f6fec7380612aed068b14b2a08aa70494de8a9026765a5a91b1073f636fb0368f6d8973f518a31391d519e20c59388ed88d checksum: 10/9d35d475095199c23e05b431bcdd1f6fec7380612aed068b14b2a08aa70494de8a9026765a5a91b1073f636fb0368f6d8973f518a31391d519e20c59388ed88d
@@ -5814,7 +5892,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/estree@npm:1.0.5": "@types/estree@npm:1.0.5, @types/estree@npm:^1.0.0":
version: 1.0.5 version: 1.0.5
resolution: "@types/estree@npm:1.0.5" resolution: "@types/estree@npm:1.0.5"
checksum: 10/7de6d928dd4010b0e20c6919e1a6c27b61f8d4567befa89252055fad503d587ecb9a1e3eab1b1901f923964d7019796db810b7fd6430acb26c32866d126fd408 checksum: 10/7de6d928dd4010b0e20c6919e1a6c27b61f8d4567befa89252055fad503d587ecb9a1e3eab1b1901f923964d7019796db810b7fd6430acb26c32866d126fd408
@@ -6905,7 +6983,14 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"acorn-walk@npm:^8.0.0, acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.3.2": "acorn-walk@npm:^8.0.0, acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.3.2":
version: 8.3.2
resolution: "acorn-walk@npm:8.3.2"
checksum: 10/57dbe2fd8cf744f562431775741c5c087196cd7a65ce4ccb3f3981cdfad25cd24ad2bad404997b88464ac01e789a0a61e5e355b2a84876f13deef39fb39686ca
languageName: node
linkType: hard
"acorn-walk@npm:^8.0.2":
version: 8.3.4 version: 8.3.4
resolution: "acorn-walk@npm:8.3.4" resolution: "acorn-walk@npm:8.3.4"
dependencies: dependencies:
@@ -6914,7 +6999,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"acorn@npm:^8.0.4, acorn@npm:^8.1.0, acorn@npm:^8.10.0, acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.4.1, acorn@npm:^8.8.1, acorn@npm:^8.8.2": "acorn@npm:^8.0.4, acorn@npm:^8.10.0, acorn@npm:^8.4.1, acorn@npm:^8.8.2":
version: 8.11.2
resolution: "acorn@npm:8.11.2"
bin:
acorn: bin/acorn
checksum: 10/ff559b891382ad4cd34cc3c493511d0a7075a51f5f9f02a03440e92be3705679367238338566c5fbd3521ecadd565d29301bc8e16cb48379206bffbff3d72500
languageName: node
linkType: hard
"acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.8.1":
version: 8.14.1 version: 8.14.1
resolution: "acorn@npm:8.14.1" resolution: "acorn@npm:8.14.1"
bin: bin:
@@ -6923,6 +7017,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"acorn@npm:^8.14.0":
version: 8.14.0
resolution: "acorn@npm:8.14.0"
bin:
acorn: bin/acorn
checksum: 10/6df29c35556782ca9e632db461a7f97947772c6c1d5438a81f0c873a3da3a792487e83e404d1c6c25f70513e91aa18745f6eafb1fcc3a43ecd1920b21dd173d2
languageName: node
linkType: hard
"actual@workspace:.": "actual@workspace:.":
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "actual@workspace:." resolution: "actual@workspace:."
@@ -6939,6 +7042,7 @@ __metadata:
eslint-plugin-react-hooks: "npm:^5.2.0" eslint-plugin-react-hooks: "npm:^5.2.0"
eslint-plugin-rulesdir: "npm:^0.2.2" eslint-plugin-rulesdir: "npm:^0.2.2"
globals: "npm:^15.13.0" globals: "npm:^15.13.0"
html-to-image: "npm:^1.11.11"
husky: "npm:^9.1.7" husky: "npm:^9.1.7"
lint-staged: "npm:^15.5.0" lint-staged: "npm:^15.5.0"
node-jq: "npm:^4.0.2" node-jq: "npm:^4.0.2"
@@ -7036,7 +7140,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"ajv@npm:^8.0.0, ajv@npm:^8.6.0, ajv@npm:^8.9.0": "ajv@npm:^8.0.0, ajv@npm:^8.9.0":
version: 8.17.1 version: 8.17.1
resolution: "ajv@npm:8.17.1" resolution: "ajv@npm:8.17.1"
dependencies: dependencies:
@@ -7048,6 +7152,18 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"ajv@npm:^8.6.0":
version: 8.12.0
resolution: "ajv@npm:8.12.0"
dependencies:
fast-deep-equal: "npm:^3.1.1"
json-schema-traverse: "npm:^1.0.0"
require-from-string: "npm:^2.0.2"
uri-js: "npm:^4.2.2"
checksum: 10/b406f3b79b5756ac53bfe2c20852471b08e122bc1ee4cde08ae4d6a800574d9cd78d60c81c69c63ff81e4da7cd0b638fafbb2303ae580d49cf1600b9059efb85
languageName: node
linkType: hard
"ansi-escapes@npm:^4.2.1": "ansi-escapes@npm:^4.2.1":
version: 4.3.2 version: 4.3.2
resolution: "ansi-escapes@npm:4.3.2" resolution: "ansi-escapes@npm:4.3.2"
@@ -8306,7 +8422,26 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.5.2, chokidar@npm:^3.5.3": "chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.5.3":
version: 3.5.3
resolution: "chokidar@npm:3.5.3"
dependencies:
anymatch: "npm:~3.1.2"
braces: "npm:~3.0.2"
fsevents: "npm:~2.3.2"
glob-parent: "npm:~5.1.2"
is-binary-path: "npm:~2.1.0"
is-glob: "npm:~4.0.1"
normalize-path: "npm:~3.0.0"
readdirp: "npm:~3.6.0"
dependenciesMeta:
fsevents:
optional: true
checksum: 10/863e3ff78ee7a4a24513d2a416856e84c8e4f5e60efbe03e8ab791af1a183f569b62fc6f6b8044e2804966cb81277ddbbc1dc374fba3265bd609ea8efd62f5b3
languageName: node
linkType: hard
"chokidar@npm:^3.5.2":
version: 3.6.0 version: 3.6.0
resolution: "chokidar@npm:3.6.0" resolution: "chokidar@npm:3.6.0"
dependencies: dependencies:
@@ -9297,15 +9432,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"debug@npm:4, debug@npm:^4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:^4.4.0": "debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4":
version: 4.4.0 version: 4.3.6
resolution: "debug@npm:4.4.0" resolution: "debug@npm:4.3.6"
dependencies: dependencies:
ms: "npm:^2.1.3" ms: "npm:2.1.2"
peerDependenciesMeta: peerDependenciesMeta:
supports-color: supports-color:
optional: true optional: true
checksum: 10/1847944c2e3c2c732514b93d11886575625686056cd765336212dc15de2d2b29612b6cd80e1afba767bb8e1803b778caf9973e98169ef1a24a7a7009e1820367 checksum: 10/d3adb9af7d57a9e809a68f404490cf776122acca16e6359a2702c0f462e510e91f9765c07f707b8ab0d91e03bad57328f3256f5082631cefb5393d0394d50fb7
languageName: node languageName: node
linkType: hard linkType: hard
@@ -9318,6 +9453,18 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"debug@npm:^4, debug@npm:^4.3.6, debug@npm:^4.4.0":
version: 4.4.0
resolution: "debug@npm:4.4.0"
dependencies:
ms: "npm:^2.1.3"
peerDependenciesMeta:
supports-color:
optional: true
checksum: 10/1847944c2e3c2c732514b93d11886575625686056cd765336212dc15de2d2b29612b6cd80e1afba767bb8e1803b778caf9973e98169ef1a24a7a7009e1820367
languageName: node
linkType: hard
"decimal.js-light@npm:^2.4.1": "decimal.js-light@npm:^2.4.1":
version: 2.5.1 version: 2.5.1
resolution: "decimal.js-light@npm:2.5.1" resolution: "decimal.js-light@npm:2.5.1"
@@ -12530,6 +12677,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"html-to-image@npm:^1.11.11":
version: 1.11.11
resolution: "html-to-image@npm:1.11.11"
checksum: 10/099206c3aaa54ca36d0df91426fe2b05258fe73c913dca6874dd8250973d47f629d3f45e427d5d51cc416ee305b898ce8db0a71336b3700a059ef1116b64d944
languageName: node
linkType: hard
"htmlparser2@npm:^9.1.0": "htmlparser2@npm:^9.1.0":
version: 9.1.0 version: 9.1.0
resolution: "htmlparser2@npm:9.1.0" resolution: "htmlparser2@npm:9.1.0"
@@ -16016,6 +16170,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"ms@npm:2.1.2":
version: 2.1.2
resolution: "ms@npm:2.1.2"
checksum: 10/673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f
languageName: node
linkType: hard
"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": "ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3":
version: 2.1.3 version: 2.1.3
resolution: "ms@npm:2.1.3" resolution: "ms@npm:2.1.3"
@@ -18897,7 +19058,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": "semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.6.0":
version: 7.6.3
resolution: "semver@npm:7.6.3"
bin:
semver: bin/semver.js
checksum: 10/36b1fbe1a2b6f873559cd57b238f1094a053dbfd997ceeb8757d79d1d2089c56d1321b9f1069ce263dc64cfa922fa1d2ad566b39426fe1ac6c723c1487589e10
languageName: node
linkType: hard
"semver@npm:^7.5.4":
version: 7.7.1 version: 7.7.1
resolution: "semver@npm:7.7.1" resolution: "semver@npm:7.7.1"
bin: bin:
@@ -20289,6 +20459,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"to-fast-properties@npm:^2.0.0":
version: 2.0.0
resolution: "to-fast-properties@npm:2.0.0"
checksum: 10/be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168
languageName: node
linkType: hard
"to-regex-range@npm:^5.0.1": "to-regex-range@npm:^5.0.1":
version: 5.0.1 version: 5.0.1
resolution: "to-regex-range@npm:5.0.1" resolution: "to-regex-range@npm:5.0.1"
@@ -21876,7 +22053,20 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.2": "which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.2":
version: 1.1.15
resolution: "which-typed-array@npm:1.1.15"
dependencies:
available-typed-arrays: "npm:^1.0.7"
call-bind: "npm:^1.0.7"
for-each: "npm:^0.3.3"
gopd: "npm:^1.0.1"
has-tostringtag: "npm:^1.0.2"
checksum: 10/c3b6a99beadc971baa53c3ee5b749f2b9bdfa3b3b9a70650dd8511a48b61d877288b498d424712e9991d16019633086bd8b5923369460d93463c5825fa36c448
languageName: node
linkType: hard
"which-typed-array@npm:^1.1.16":
version: 1.1.16 version: 1.1.16
resolution: "which-typed-array@npm:1.1.16" resolution: "which-typed-array@npm:1.1.16"
dependencies: dependencies: