From 397eeada462899da1be4c55e1d532e914c5ca928 Mon Sep 17 00:00:00 2001 From: "Joseph T. French" Date: Fri, 10 Apr 2026 20:54:58 -0500 Subject: [PATCH 1/3] Implement Closing Book feature with sidebar navigation and content panels - Updated sidebar configuration to include a new "Close" link. - Added new components for the Closing Book feature, including CloseContent, StructureSidebar, and various panels (AccountRollupsPanel, PeriodClosePanel, SchedulePanel, StatementPanel). - Implemented data fetching and state management for closing book categories and entries. - Enhanced user interface with loading states and error handling for better user experience. - Introduced view mode toggle functionality for rendered and facts views. --- package-lock.json | 1815 +++++++++-------- package.json | 2 +- .../__tests__/AccountRollupsPanel.test.tsx | 335 +++ .../close/__tests__/FactsTable.test.tsx | 155 ++ .../close/__tests__/StatementTable.test.tsx | 226 ++ .../close/__tests__/StructureSidebar.test.tsx | 282 +++ .../close/__tests__/ViewModeToggle.test.tsx | 59 + .../ledger/close/__tests__/content.test.tsx | 302 +++ .../close/components/AccountRollupsPanel.tsx | 183 ++ .../ledger/close/components/FactsTable.tsx | 93 + .../close/components/PeriodClosePanel.tsx | 232 +++ .../ledger/close/components/SchedulePanel.tsx | 216 ++ .../close/components/StatementPanel.tsx | 364 ++++ .../close/components/StatementTable.tsx | 123 ++ .../close/components/StructureSidebar.tsx | 175 ++ .../close/components/ViewModeToggle.tsx | 42 + src/app/(app)/ledger/close/content.tsx | 221 ++ src/app/(app)/ledger/close/page.tsx | 15 + src/app/(app)/sidebar-config.tsx | 2 +- .../core/task-monitoring/operationHooks.ts | 4 +- 20 files changed, 3936 insertions(+), 910 deletions(-) create mode 100644 src/app/(app)/ledger/close/__tests__/AccountRollupsPanel.test.tsx create mode 100644 src/app/(app)/ledger/close/__tests__/FactsTable.test.tsx create mode 100644 src/app/(app)/ledger/close/__tests__/StatementTable.test.tsx create mode 100644 src/app/(app)/ledger/close/__tests__/StructureSidebar.test.tsx create mode 100644 src/app/(app)/ledger/close/__tests__/ViewModeToggle.test.tsx create mode 100644 src/app/(app)/ledger/close/__tests__/content.test.tsx create mode 100644 src/app/(app)/ledger/close/components/AccountRollupsPanel.tsx create mode 100644 src/app/(app)/ledger/close/components/FactsTable.tsx create mode 100644 src/app/(app)/ledger/close/components/PeriodClosePanel.tsx create mode 100644 src/app/(app)/ledger/close/components/SchedulePanel.tsx create mode 100644 src/app/(app)/ledger/close/components/StatementPanel.tsx create mode 100644 src/app/(app)/ledger/close/components/StatementTable.tsx create mode 100644 src/app/(app)/ledger/close/components/StructureSidebar.tsx create mode 100644 src/app/(app)/ledger/close/components/ViewModeToggle.tsx create mode 100644 src/app/(app)/ledger/close/content.tsx create mode 100644 src/app/(app)/ledger/close/page.tsx diff --git a/package-lock.json b/package-lock.json index 7c30780..7b1273d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-sns": "^3.1021.0", - "@robosystems/client": "0.2.44", + "@robosystems/client": "0.2.48", "flowbite": "^3.1", "flowbite-react": "^0.12.5", "intuit-oauth": "^4.1.0", @@ -103,34 +103,32 @@ } }, "node_modules/@asamuzakjp/css-color": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.0.1.tgz", - "integrity": "sha512-2SZFvqMyvboVV1d15lMf7XiI3m7SDqXUuKaTymJYLN6dSGadqp+fVojqJlVoMlbZnlTmu3S0TLwLTJpvBMO1Aw==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.9.tgz", + "integrity": "sha512-zd9c/Wdso6v1U7v6w3i/hbAr4K7NaSHImdpvmLt+Y9ea5BhilnIGNkfhOJ7FEIuPipAnE9tZeDOll05WDT0kgg==", "dev": true, "license": "MIT", "dependencies": { "@csstools/css-calc": "^3.1.1", "@csstools/css-color-parser": "^4.0.2", "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0", - "lru-cache": "^11.2.6" + "@csstools/css-tokenizer": "^4.0.0" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, "node_modules/@asamuzakjp/dom-selector": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.0.4.tgz", - "integrity": "sha512-jXR6x4AcT3eIrS2fSNAwJpwirOkGcd+E7F7CP3zjdTqz9B/2huHOL8YJZBgekKwLML+u7qB/6P1LXQuMScsx0w==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.0.9.tgz", + "integrity": "sha512-r3ElRr7y8ucyN2KdICwGsmj19RoN13CLCa/pvGydghWK6ZzeKQ+TcDjVdtEZz2ElpndM5jXw//B9CEee0mWnVg==", "dev": true, "license": "MIT", "dependencies": { "@asamuzakjp/nwsapi": "^2.3.9", "bidi-js": "^1.0.3", "css-tree": "^3.2.1", - "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.2.7" + "is-potential-custom-element-name": "^1.0.1" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0" @@ -269,48 +267,48 @@ } }, "node_modules/@aws-sdk/client-sns": { - "version": "3.1021.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sns/-/client-sns-3.1021.0.tgz", - "integrity": "sha512-rAwHx1iGNzfFTlz/VdYu6BFsiYIujk48yaafqQED91DWgM03f+9TDfFBXxnlIm5LBNwkXc/UWFmxOV29yP3mgg==", + "version": "3.1029.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sns/-/client-sns-3.1029.0.tgz", + "integrity": "sha512-1ZLIpwTYua+fM2qTfH7WKRaMWqbuKhNxee4naz0DmWI7vS489g022WHRlIR6tXwn2czOqBfiPLKCpEqJqsopdw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/credential-provider-node": "^3.972.29", - "@aws-sdk/middleware-host-header": "^3.972.8", - "@aws-sdk/middleware-logger": "^3.972.8", - "@aws-sdk/middleware-recursion-detection": "^3.972.9", - "@aws-sdk/middleware-user-agent": "^3.972.28", - "@aws-sdk/region-config-resolver": "^3.972.10", - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/util-endpoints": "^3.996.5", - "@aws-sdk/util-user-agent-browser": "^3.972.8", - "@aws-sdk/util-user-agent-node": "^3.973.14", - "@smithy/config-resolver": "^4.4.13", - "@smithy/core": "^3.23.13", - "@smithy/fetch-http-handler": "^5.3.15", - "@smithy/hash-node": "^4.2.12", - "@smithy/invalid-dependency": "^4.2.12", - "@smithy/middleware-content-length": "^4.2.12", - "@smithy/middleware-endpoint": "^4.4.28", - "@smithy/middleware-retry": "^4.4.46", - "@smithy/middleware-serde": "^4.2.16", - "@smithy/middleware-stack": "^4.2.12", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/node-http-handler": "^4.5.1", - "@smithy/protocol-http": "^5.3.12", - "@smithy/smithy-client": "^4.12.8", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/credential-provider-node": "^3.972.30", + "@aws-sdk/middleware-host-header": "^3.972.9", + "@aws-sdk/middleware-logger": "^3.972.9", + "@aws-sdk/middleware-recursion-detection": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.29", + "@aws-sdk/region-config-resolver": "^3.972.11", + "@aws-sdk/types": "^3.973.7", + "@aws-sdk/util-endpoints": "^3.996.6", + "@aws-sdk/util-user-agent-browser": "^3.972.9", + "@aws-sdk/util-user-agent-node": "^3.973.15", + "@smithy/config-resolver": "^4.4.14", + "@smithy/core": "^3.23.14", + "@smithy/fetch-http-handler": "^5.3.16", + "@smithy/hash-node": "^4.2.13", + "@smithy/invalid-dependency": "^4.2.13", + "@smithy/middleware-content-length": "^4.2.13", + "@smithy/middleware-endpoint": "^4.4.29", + "@smithy/middleware-retry": "^4.5.0", + "@smithy/middleware-serde": "^4.2.17", + "@smithy/middleware-stack": "^4.2.13", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/node-http-handler": "^4.5.2", + "@smithy/protocol-http": "^5.3.13", + "@smithy/smithy-client": "^4.12.9", + "@smithy/types": "^4.14.0", + "@smithy/url-parser": "^4.2.13", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-body-length-node": "^4.2.3", - "@smithy/util-defaults-mode-browser": "^4.3.44", - "@smithy/util-defaults-mode-node": "^4.2.48", - "@smithy/util-endpoints": "^3.3.3", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-retry": "^4.2.13", + "@smithy/util-defaults-mode-browser": "^4.3.45", + "@smithy/util-defaults-mode-node": "^4.2.49", + "@smithy/util-endpoints": "^3.3.4", + "@smithy/util-middleware": "^4.2.13", + "@smithy/util-retry": "^4.3.0", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, @@ -319,22 +317,22 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.973.26", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.26.tgz", - "integrity": "sha512-A/E6n2W42ruU+sfWk+mMUOyVXbsSgGrY3MJ9/0Az5qUdG67y8I6HYzzoAa+e/lzxxl1uCYmEL6BTMi9ZiZnplQ==", + "version": "3.973.27", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.27.tgz", + "integrity": "sha512-CUZ5m8hwMCH6OYI4Li/WgMfIEx10Q2PLI9Y3XOUTPGZJ53aZ0007jCv+X/ywsaERyKPdw5MRZWk877roQksQ4A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/xml-builder": "^3.972.16", - "@smithy/core": "^3.23.13", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/property-provider": "^4.2.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/signature-v4": "^5.3.12", - "@smithy/smithy-client": "^4.12.8", - "@smithy/types": "^4.13.1", + "@aws-sdk/types": "^3.973.7", + "@aws-sdk/xml-builder": "^3.972.17", + "@smithy/core": "^3.23.14", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/property-provider": "^4.2.13", + "@smithy/protocol-http": "^5.3.13", + "@smithy/signature-v4": "^5.3.13", + "@smithy/smithy-client": "^4.12.9", + "@smithy/types": "^4.14.0", "@smithy/util-base64": "^4.3.2", - "@smithy/util-middleware": "^4.2.12", + "@smithy/util-middleware": "^4.2.13", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, @@ -343,15 +341,15 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.972.24", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.24.tgz", - "integrity": "sha512-FWg8uFmT6vQM7VuzELzwVo5bzExGaKHdubn0StjgrcU5FvuLExUe+k06kn/40uKv59rYzhez8eFNM4yYE/Yb/w==", + "version": "3.972.25", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.25.tgz", + "integrity": "sha512-6QfI0wv4jpG5CrdO/AO0JfZ2ux+tKwJPrUwmvxXF50vI5KIypKVGNF6b4vlkYEnKumDTI1NX2zUBi8JoU5QU3A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/types": "^3.973.6", - "@smithy/property-provider": "^4.2.12", - "@smithy/types": "^4.13.1", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/types": "^3.973.7", + "@smithy/property-provider": "^4.2.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -359,20 +357,20 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.26", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.26.tgz", - "integrity": "sha512-CY4ppZ+qHYqcXqBVi//sdHST1QK3KzOEiLtpLsc9W2k2vfZPKExGaQIsOwcyvjpjUEolotitmd3mUNY56IwDEA==", + "version": "3.972.27", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.27.tgz", + "integrity": "sha512-3V3Usj9Gs93h865DqN4M2NWJhC5kXU9BvZskfN3+69omuYlE3TZxOEcVQtBGLOloJB7BVfJKXVLqeNhOzHqSlQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/types": "^3.973.6", - "@smithy/fetch-http-handler": "^5.3.15", - "@smithy/node-http-handler": "^4.5.1", - "@smithy/property-provider": "^4.2.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/smithy-client": "^4.12.8", - "@smithy/types": "^4.13.1", - "@smithy/util-stream": "^4.5.21", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/types": "^3.973.7", + "@smithy/fetch-http-handler": "^5.3.16", + "@smithy/node-http-handler": "^4.5.2", + "@smithy/property-provider": "^4.2.13", + "@smithy/protocol-http": "^5.3.13", + "@smithy/smithy-client": "^4.12.9", + "@smithy/types": "^4.14.0", + "@smithy/util-stream": "^4.5.22", "tslib": "^2.6.2" }, "engines": { @@ -380,24 +378,24 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.972.28", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.28.tgz", - "integrity": "sha512-wXYvq3+uQcZV7k+bE4yDXCTBdzWTU9x/nMiKBfzInmv6yYK1veMK0AKvRfRBd72nGWYKcL6AxwiPg9z/pYlgpw==", + "version": "3.972.29", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.29.tgz", + "integrity": "sha512-SiBuAnXecCbT/OpAf3vqyI/AVE3mTaYr9ShXLybxZiPLBiPCCOIWSGAtYYGQWMRvobBTiqOewaB+wcgMMZI2Aw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/credential-provider-env": "^3.972.24", - "@aws-sdk/credential-provider-http": "^3.972.26", - "@aws-sdk/credential-provider-login": "^3.972.28", - "@aws-sdk/credential-provider-process": "^3.972.24", - "@aws-sdk/credential-provider-sso": "^3.972.28", - "@aws-sdk/credential-provider-web-identity": "^3.972.28", - "@aws-sdk/nested-clients": "^3.996.18", - "@aws-sdk/types": "^3.973.6", - "@smithy/credential-provider-imds": "^4.2.12", - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/credential-provider-env": "^3.972.25", + "@aws-sdk/credential-provider-http": "^3.972.27", + "@aws-sdk/credential-provider-login": "^3.972.29", + "@aws-sdk/credential-provider-process": "^3.972.25", + "@aws-sdk/credential-provider-sso": "^3.972.29", + "@aws-sdk/credential-provider-web-identity": "^3.972.29", + "@aws-sdk/nested-clients": "^3.996.19", + "@aws-sdk/types": "^3.973.7", + "@smithy/credential-provider-imds": "^4.2.13", + "@smithy/property-provider": "^4.2.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -405,18 +403,18 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.972.28", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.28.tgz", - "integrity": "sha512-ZSTfO6jqUTCysbdBPtEX5OUR//3rbD0lN7jO3sQeS2Gjr/Y+DT6SbIJ0oT2cemNw3UzKu97sNONd1CwNMthuZQ==", + "version": "3.972.29", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.29.tgz", + "integrity": "sha512-OGOslTbOlxXexKMqhxCEbBQbUIfuhGxU5UXw3Fm56ypXHvrXH4aTt/xb5Y884LOoteP1QST1lVZzHfcTnWhiPQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/nested-clients": "^3.996.18", - "@aws-sdk/types": "^3.973.6", - "@smithy/property-provider": "^4.2.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/nested-clients": "^3.996.19", + "@aws-sdk/types": "^3.973.7", + "@smithy/property-provider": "^4.2.13", + "@smithy/protocol-http": "^5.3.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -424,22 +422,22 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.972.29", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.29.tgz", - "integrity": "sha512-clSzDcvndpFJAggLDnDb36sPdlZYyEs5Zm6zgZjjUhwsJgSWiWKwFIXUVBcbruidNyBdbpOv2tNDL9sX8y3/0g==", + "version": "3.972.30", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.30.tgz", + "integrity": "sha512-FMnAnWxc8PG+ZrZ2OBKzY4luCUJhe9CG0B9YwYr4pzrYGLXBS2rl+UoUvjGbAwiptxRL6hyA3lFn03Bv1TLqTw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "^3.972.24", - "@aws-sdk/credential-provider-http": "^3.972.26", - "@aws-sdk/credential-provider-ini": "^3.972.28", - "@aws-sdk/credential-provider-process": "^3.972.24", - "@aws-sdk/credential-provider-sso": "^3.972.28", - "@aws-sdk/credential-provider-web-identity": "^3.972.28", - "@aws-sdk/types": "^3.973.6", - "@smithy/credential-provider-imds": "^4.2.12", - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", + "@aws-sdk/credential-provider-env": "^3.972.25", + "@aws-sdk/credential-provider-http": "^3.972.27", + "@aws-sdk/credential-provider-ini": "^3.972.29", + "@aws-sdk/credential-provider-process": "^3.972.25", + "@aws-sdk/credential-provider-sso": "^3.972.29", + "@aws-sdk/credential-provider-web-identity": "^3.972.29", + "@aws-sdk/types": "^3.973.7", + "@smithy/credential-provider-imds": "^4.2.13", + "@smithy/property-provider": "^4.2.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -447,16 +445,16 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.972.24", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.24.tgz", - "integrity": "sha512-Q2k/XLrFXhEztPHqj4SLCNID3hEPdlhh1CDLBpNnM+1L8fq7P+yON9/9M1IGN/dA5W45v44ylERfXtDAlmMNmw==", + "version": "3.972.25", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.25.tgz", + "integrity": "sha512-HR7ynNRdNhNsdVCOCegy1HsfsRzozCOPtD3RzzT1JouuaHobWyRfJzCBue/3jP7gECHt+kQyZUvwg/cYLWurNQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/types": "^3.973.6", - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/types": "^3.973.7", + "@smithy/property-provider": "^4.2.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -464,18 +462,18 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.972.28", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.28.tgz", - "integrity": "sha512-IoUlmKMLEITFn1SiCTjPfR6KrE799FBo5baWyk/5Ppar2yXZoUdaRqZzJzK6TcJxx450M8m8DbpddRVYlp5R/A==", + "version": "3.972.29", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.29.tgz", + "integrity": "sha512-HWv4SEq3jZDYPlwryZVef97+U8CxxRos5mK8sgGO1dQaFZpV5giZLzqGE5hkDmh2csYcBO2uf5XHjPTpZcJlig==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/nested-clients": "^3.996.18", - "@aws-sdk/token-providers": "3.1021.0", - "@aws-sdk/types": "^3.973.6", - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/nested-clients": "^3.996.19", + "@aws-sdk/token-providers": "3.1026.0", + "@aws-sdk/types": "^3.973.7", + "@smithy/property-provider": "^4.2.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -483,17 +481,17 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.972.28", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.28.tgz", - "integrity": "sha512-d+6h0SD8GGERzKe27v5rOzNGKOl0D+l0bWJdqrxH8WSQzHzjsQFIAPgIeOTUwBHVsKKwtSxc91K/SWax6XgswQ==", + "version": "3.972.29", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.29.tgz", + "integrity": "sha512-PdMBza1WEKEUPFEmMGCfnU2RYCz9MskU2e8JxjyUOsMKku7j9YaDKvbDi2dzC0ihFoM6ods2SbhfAAro+Gwlew==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/nested-clients": "^3.996.18", - "@aws-sdk/types": "^3.973.6", - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/nested-clients": "^3.996.19", + "@aws-sdk/types": "^3.973.7", + "@smithy/property-provider": "^4.2.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -501,14 +499,14 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", - "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", + "version": "3.972.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.9.tgz", + "integrity": "sha512-je5vRdNw4SkuTnmRbFZLdye4sQ0faLt8kwka5wnnSU30q1mHO4X+idGEJOOE+Tn1ME7Oryn05xxkDvIb3UaLaQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", + "@aws-sdk/types": "^3.973.7", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -516,13 +514,13 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz", - "integrity": "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==", + "version": "3.972.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.9.tgz", + "integrity": "sha512-HsVgDrruhqI28RkaXALm8grJ7Agc1wF6Et0xh6pom8NdO2VdO/SD9U/tPwUjewwK/pVoka+EShBxyCvgsPCtog==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/types": "^4.13.1", + "@aws-sdk/types": "^3.973.7", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -530,15 +528,15 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.9", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.9.tgz", - "integrity": "sha512-/Wt5+CT8dpTFQxEJ9iGy/UGrXr7p2wlIOEHvIr/YcHYByzoLjrqkYqXdJjd9UIgWjv7eqV2HnFJen93UTuwfTQ==", + "version": "3.972.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.10.tgz", + "integrity": "sha512-RVQQbq5orQ/GHUnXvqEOj2HHPBJm+mM+ySwZKS5UaLBwra5ugRtiH09PLUoOZRl7a1YzaOzXSuGbn9iD5j60WQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.6", + "@aws-sdk/types": "^3.973.7", "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -546,18 +544,18 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.972.28", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.28.tgz", - "integrity": "sha512-cfWZFlVh7Va9lRay4PN2A9ARFzaBYcA097InT5M2CdRS05ECF5yaz86jET8Wsl2WcyKYEvVr/QNmKtYtafUHtQ==", + "version": "3.972.29", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.29.tgz", + "integrity": "sha512-f/sIRzuTfEjg6NsbMYvye2VsmnQoNgntntleQyx5uGacUYzszbfIlO3GcI6G6daWUmTm0IDZc11qMHWwF0o0mQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/util-endpoints": "^3.996.5", - "@smithy/core": "^3.23.13", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-retry": "^4.2.13", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/types": "^3.973.7", + "@aws-sdk/util-endpoints": "^3.996.6", + "@smithy/core": "^3.23.14", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", + "@smithy/util-retry": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -565,47 +563,47 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.996.18", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.18.tgz", - "integrity": "sha512-c7ZSIXrESxHKx2Mcopgd8AlzZgoXMr20fkx5ViPWPOLBvmyhw9VwJx/Govg8Ef/IhEon5R9l53Z8fdYSEmp6VA==", + "version": "3.996.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.19.tgz", + "integrity": "sha512-uFkmCDXvmQYLanlYdOFS0+MQWkrj9wPMt/ZCc/0J0fjPim6F5jBVBmEomvGY/j77ILW6GTPwN22Jc174Mhkw6Q==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/middleware-host-header": "^3.972.8", - "@aws-sdk/middleware-logger": "^3.972.8", - "@aws-sdk/middleware-recursion-detection": "^3.972.9", - "@aws-sdk/middleware-user-agent": "^3.972.28", - "@aws-sdk/region-config-resolver": "^3.972.10", - "@aws-sdk/types": "^3.973.6", - "@aws-sdk/util-endpoints": "^3.996.5", - "@aws-sdk/util-user-agent-browser": "^3.972.8", - "@aws-sdk/util-user-agent-node": "^3.973.14", - "@smithy/config-resolver": "^4.4.13", - "@smithy/core": "^3.23.13", - "@smithy/fetch-http-handler": "^5.3.15", - "@smithy/hash-node": "^4.2.12", - "@smithy/invalid-dependency": "^4.2.12", - "@smithy/middleware-content-length": "^4.2.12", - "@smithy/middleware-endpoint": "^4.4.28", - "@smithy/middleware-retry": "^4.4.46", - "@smithy/middleware-serde": "^4.2.16", - "@smithy/middleware-stack": "^4.2.12", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/node-http-handler": "^4.5.1", - "@smithy/protocol-http": "^5.3.12", - "@smithy/smithy-client": "^4.12.8", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/middleware-host-header": "^3.972.9", + "@aws-sdk/middleware-logger": "^3.972.9", + "@aws-sdk/middleware-recursion-detection": "^3.972.10", + "@aws-sdk/middleware-user-agent": "^3.972.29", + "@aws-sdk/region-config-resolver": "^3.972.11", + "@aws-sdk/types": "^3.973.7", + "@aws-sdk/util-endpoints": "^3.996.6", + "@aws-sdk/util-user-agent-browser": "^3.972.9", + "@aws-sdk/util-user-agent-node": "^3.973.15", + "@smithy/config-resolver": "^4.4.14", + "@smithy/core": "^3.23.14", + "@smithy/fetch-http-handler": "^5.3.16", + "@smithy/hash-node": "^4.2.13", + "@smithy/invalid-dependency": "^4.2.13", + "@smithy/middleware-content-length": "^4.2.13", + "@smithy/middleware-endpoint": "^4.4.29", + "@smithy/middleware-retry": "^4.5.0", + "@smithy/middleware-serde": "^4.2.17", + "@smithy/middleware-stack": "^4.2.13", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/node-http-handler": "^4.5.2", + "@smithy/protocol-http": "^5.3.13", + "@smithy/smithy-client": "^4.12.9", + "@smithy/types": "^4.14.0", + "@smithy/url-parser": "^4.2.13", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-body-length-node": "^4.2.3", - "@smithy/util-defaults-mode-browser": "^4.3.44", - "@smithy/util-defaults-mode-node": "^4.2.48", - "@smithy/util-endpoints": "^3.3.3", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-retry": "^4.2.13", + "@smithy/util-defaults-mode-browser": "^4.3.45", + "@smithy/util-defaults-mode-node": "^4.2.49", + "@smithy/util-endpoints": "^3.3.4", + "@smithy/util-middleware": "^4.2.13", + "@smithy/util-retry": "^4.3.0", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, @@ -614,15 +612,15 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.10.tgz", - "integrity": "sha512-1dq9ToC6e070QvnVhhbAs3bb5r6cQ10gTVc6cyRV5uvQe7P138TV2uG2i6+Yok4bAkVAcx5AqkTEBUvWEtBlsQ==", + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.11.tgz", + "integrity": "sha512-6Q8B1dcx6BBqUTY1Mc/eROKA0FImEEY5VPSd6AGPEUf0ErjExz4snVqa9kNJSoVDV1rKaNf3qrWojgcKW+SdDg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/config-resolver": "^4.4.13", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/types": "^4.13.1", + "@aws-sdk/types": "^3.973.7", + "@smithy/config-resolver": "^4.4.14", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -630,17 +628,17 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.1021.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1021.0.tgz", - "integrity": "sha512-TKY6h9spUk3OLs5v1oAgW9mAeBE3LAGNBwJokLy96wwmd4W2v/tYlXseProyed9ValDj2u1jK/4Rg1T+1NXyJA==", + "version": "3.1026.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1026.0.tgz", + "integrity": "sha512-Ieq/HiRrbEtrYP387Nes0XlR7H1pJiJOZKv+QyQzMYpvTiDs0VKy2ZB3E2Zf+aFovWmeE7lRE4lXyF7dYM6GgA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.26", - "@aws-sdk/nested-clients": "^3.996.18", - "@aws-sdk/types": "^3.973.6", - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", + "@aws-sdk/core": "^3.973.27", + "@aws-sdk/nested-clients": "^3.996.19", + "@aws-sdk/types": "^3.973.7", + "@smithy/property-provider": "^4.2.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -648,12 +646,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.973.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", - "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", + "version": "3.973.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.7.tgz", + "integrity": "sha512-reXRwoJ6CfChoqAsBszUYajAF8Z2LRE+CRcKocvFSMpIiLOtYU3aJ9trmn6VVPAzbbY5LXF+FfmUslbXk1SYFg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -661,15 +659,15 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.996.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.5.tgz", - "integrity": "sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==", + "version": "3.996.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.6.tgz", + "integrity": "sha512-2nUQ+2ih7CShuKHpGSIYvvAIOHy52dOZguYG36zptBukhw6iFwcvGfG0tes0oZFWQqEWvgZe9HLWaNlvXGdOrg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", - "@smithy/util-endpoints": "^3.3.3", + "@aws-sdk/types": "^3.973.7", + "@smithy/types": "^4.14.0", + "@smithy/url-parser": "^4.2.13", + "@smithy/util-endpoints": "^3.3.4", "tslib": "^2.6.2" }, "engines": { @@ -689,27 +687,27 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz", - "integrity": "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==", + "version": "3.972.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.9.tgz", + "integrity": "sha512-sn/LMzTbGjYqCCF24390WxPd6hkpoSptiUn5DzVp4cD71yqw+yGEGm1YCxyEoPXyc8qciM8UzLJcZBFslxo5Uw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.6", - "@smithy/types": "^4.13.1", + "@aws-sdk/types": "^3.973.7", + "@smithy/types": "^4.14.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.973.14", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.14.tgz", - "integrity": "sha512-vNSB/DYaPOyujVZBg/zUznH9QC142MaTHVmaFlF7uzzfg3CgT9f/l4C0Yi+vU/tbBhxVcXVB90Oohk5+o+ZbWw==", + "version": "3.973.15", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.15.tgz", + "integrity": "sha512-fYn3s9PtKdgQkczGZCFMgkNEe8aq1JCVbnRqjqN9RSVW43xn2RV9xdcZ3z01a48Jpkuh/xCmBKJxdLOo4Ozg7w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "^3.972.28", - "@aws-sdk/types": "^3.973.6", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/types": "^4.13.1", + "@aws-sdk/middleware-user-agent": "^3.972.29", + "@aws-sdk/types": "^3.973.7", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/types": "^4.14.0", "@smithy/util-config-provider": "^4.2.2", "tslib": "^2.6.2" }, @@ -726,12 +724,12 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.972.16", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.16.tgz", - "integrity": "sha512-iu2pyvaqmeatIJLURLqx9D+4jKAdTH20ntzB6BFwjyN7V960r4jK32mx0Zf7YbtOYAbmbtQfDNuL60ONinyw7A==", + "version": "3.972.17", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.17.tgz", + "integrity": "sha512-Ra7hjqAZf1OXRRMueB13qex7mFJRDK/pgCvdSFemXBT8KCGnQDPoKzHY1SjN+TjJVmnpSF14W5tJ1vDamFu+Gg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "fast-xml-parser": "5.5.8", "tslib": "^2.6.2" }, @@ -1222,9 +1220,9 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.1.tgz", - "integrity": "sha512-BvqN0AMWNAnLk9G8jnUT77D+mUbY/H2b3uDTvg2isJkHaOufUE2R3AOwxWo7VBQKT1lOdwdvorddo2B/lk64+w==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.2.tgz", + "integrity": "sha512-5GkLzz4prTIpoyeUiIu3iV6CSG3Plo7xRVOFPKI7FVEJ3mZ0A8SwK0XU3Gl7xAkiQ+mDyam+NNp875/C5y+jSA==", "dev": true, "funding": [ { @@ -1278,20 +1276,20 @@ } }, "node_modules/@emnapi/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", - "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", + "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.2.0", + "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", - "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", "license": "MIT", "optional": true, "dependencies": { @@ -1299,9 +1297,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", - "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", "license": "MIT", "optional": true, "dependencies": { @@ -1309,9 +1307,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", - "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", "cpu": [ "ppc64" ], @@ -1326,9 +1324,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", - "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", "cpu": [ "arm" ], @@ -1343,9 +1341,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", - "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", "cpu": [ "arm64" ], @@ -1360,9 +1358,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", - "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", "cpu": [ "x64" ], @@ -1377,9 +1375,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", - "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", "cpu": [ "arm64" ], @@ -1394,9 +1392,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", - "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", "cpu": [ "x64" ], @@ -1411,9 +1409,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", - "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", "cpu": [ "arm64" ], @@ -1428,9 +1426,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", - "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", "cpu": [ "x64" ], @@ -1445,9 +1443,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", - "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", "cpu": [ "arm" ], @@ -1462,9 +1460,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", - "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", "cpu": [ "arm64" ], @@ -1479,9 +1477,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", - "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", "cpu": [ "ia32" ], @@ -1496,9 +1494,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", - "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", "cpu": [ "loong64" ], @@ -1513,9 +1511,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", - "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", "cpu": [ "mips64el" ], @@ -1530,9 +1528,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", - "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", "cpu": [ "ppc64" ], @@ -1547,9 +1545,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", - "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", "cpu": [ "riscv64" ], @@ -1564,9 +1562,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", - "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", "cpu": [ "s390x" ], @@ -1581,9 +1579,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", - "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", "cpu": [ "x64" ], @@ -1598,9 +1596,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", - "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", "cpu": [ "arm64" ], @@ -1615,9 +1613,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", - "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", "cpu": [ "x64" ], @@ -1632,9 +1630,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", - "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", "cpu": [ "arm64" ], @@ -1649,9 +1647,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", - "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", "cpu": [ "x64" ], @@ -1666,9 +1664,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", - "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", "cpu": [ "arm64" ], @@ -1683,9 +1681,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", - "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", "cpu": [ "x64" ], @@ -1700,9 +1698,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", - "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", "cpu": [ "arm64" ], @@ -1717,9 +1715,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", - "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", "cpu": [ "ia32" ], @@ -1734,9 +1732,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", - "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", "cpu": [ "x64" ], @@ -2648,31 +2646,33 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz", - "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.3.tgz", + "integrity": "sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==", "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" }, "funding": { "type": "github", "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" } }, "node_modules/@next/env": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.1.tgz", - "integrity": "sha512-n8P/HCkIWW+gVal2Z8XqXJ6aB3J0tuM29OcHpCsobWlChH/SITBs1DFBk/HajgrwDkqqBXPbuUuzgDvUekREPg==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.3.tgz", + "integrity": "sha512-ZWXyj4uNu4GCWQw9cjRxWlbD+33mcDszIo9iQxFnBX3Wmgq9ulaSJcl6VhuWx5pCWqqD+9W6Wfz7N0lM5lYPMA==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.2.tgz", - "integrity": "sha512-IOPbWzDQ+76AtjZioaCjpIY72xNSDMnarZ2GMQ4wjNLvnJEJHqxQwGFhgnIWLV9klb4g/+amg88Tk5OXVpyLTw==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.3.tgz", + "integrity": "sha512-nE/b9mht28XJxjTwKs/yk7w4XTaU3t40UHVAky6cjiijdP/SEy3hGsnQMPxmXPTpC7W4/97okm6fngKnvCqVaA==", "dev": true, "license": "MIT", "dependencies": { @@ -2680,9 +2680,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.1.tgz", - "integrity": "sha512-BwZ8w8YTaSEr2HIuXLMLxIdElNMPvY9fLqb20LX9A9OMGtJilhHLbCL3ggyd0TwjmMcTxi0XXt+ur1vWUoxj2Q==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.3.tgz", + "integrity": "sha512-u37KDKTKQ+OQLvY+z7SNXixwo4Q2/IAJFDzU1fYe66IbCE51aDSAzkNDkWmLN0yjTUh4BKBd+hb69jYn6qqqSg==", "cpu": [ "arm64" ], @@ -2696,9 +2696,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.1.tgz", - "integrity": "sha512-/vrcE6iQSJq3uL3VGVHiXeaKbn8Es10DGTGRJnRZlkNQQk3kaNtAJg8Y6xuAlrx/6INKVjkfi5rY0iEXorZ6uA==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.3.tgz", + "integrity": "sha512-gHjL/qy6Q6CG3176FWbAKyKh9IfntKZTB3RY/YOJdDFpHGsUDXVH38U4mMNpHVGXmeYW4wj22dMp1lTfmu/bTQ==", "cpu": [ "x64" ], @@ -2712,9 +2712,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.1.tgz", - "integrity": "sha512-uLn+0BK+C31LTVbQ/QU+UaVrV0rRSJQ8RfniQAHPghDdgE+SlroYqcmFnO5iNjNfVWCyKZHYrs3Nl0mUzWxbBw==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.3.tgz", + "integrity": "sha512-U6vtblPtU/P14Y/b/n9ZY0GOxbbIhTFuaFR7F4/uMBidCi2nSdaOFhA0Go81L61Zd6527+yvuX44T4ksnf8T+Q==", "cpu": [ "arm64" ], @@ -2728,9 +2728,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.1.tgz", - "integrity": "sha512-ssKq6iMRnHdnycGp9hCuGnXJZ0YPr4/wNwrfE5DbmvEcgl9+yv97/Kq3TPVDfYome1SW5geciLB9aiEqKXQjlQ==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.3.tgz", + "integrity": "sha512-/YV0LgjHUmfhQpn9bVoGc4x4nan64pkhWR5wyEV8yCOfwwrH630KpvRg86olQHTwHIn1z59uh6JwKvHq1h4QEw==", "cpu": [ "arm64" ], @@ -2744,9 +2744,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.1.tgz", - "integrity": "sha512-HQm7SrHRELJ30T1TSmT706IWovFFSRGxfgUkyWJZF/RKBMdbdRWJuFrcpDdE5vy9UXjFOx6L3mRdqH04Mmx0hg==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.3.tgz", + "integrity": "sha512-/HiWEcp+WMZ7VajuiMEFGZ6cg0+aYZPqCJD3YJEfpVWQsKYSjXQG06vJP6F1rdA03COD9Fef4aODs3YxKx+RDQ==", "cpu": [ "x64" ], @@ -2760,9 +2760,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.1.tgz", - "integrity": "sha512-aV2iUaC/5HGEpbBkE+4B8aHIudoOy5DYekAKOMSHoIYQ66y/wIVeaRx8MS2ZMdxe/HIXlMho4ubdZs/J8441Tg==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.3.tgz", + "integrity": "sha512-Kt44hGJfZSefebhk/7nIdivoDr3Ugp5+oNz9VvF3GUtfxutucUIHfIO0ZYO8QlOPDQloUVQn4NVC/9JvHRk9hw==", "cpu": [ "x64" ], @@ -2776,9 +2776,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.1.tgz", - "integrity": "sha512-IXdNgiDHaSk0ZUJ+xp0OQTdTgnpx1RCfRTalhn3cjOP+IddTMINwA7DXZrwTmGDO8SUr5q2hdP/du4DcrB1GxA==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.3.tgz", + "integrity": "sha512-O2NZ9ie3Tq6xj5Z5CSwBT3+aWAMW2PIZ4egUi9MaWLkwaehgtB7YZjPm+UpcNpKOme0IQuqDcor7BsW6QBiQBw==", "cpu": [ "arm64" ], @@ -2792,9 +2792,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.1.tgz", - "integrity": "sha512-qvU+3a39Hay+ieIztkGSbF7+mccbbg1Tk25hc4JDylf8IHjYmY/Zm64Qq1602yPyQqvie+vf5T/uPwNxDNIoeg==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.3.tgz", + "integrity": "sha512-Ibm29/GgB/ab5n7XKqlStkm54qqZE8v2FnijUPBgrd67FWrac45o/RsNlaOWjme/B5UqeWt/8KM4aWBwA1D2Kw==", "cpu": [ "x64" ], @@ -3219,9 +3219,9 @@ } }, "node_modules/@robosystems/client": { - "version": "0.2.44", - "resolved": "https://registry.npmjs.org/@robosystems/client/-/client-0.2.44.tgz", - "integrity": "sha512-b9gYvM7Y2lsxguHp5e7lPZqVF4VN1J6u4bpgBAJhwzYPBLxtFGyiX4HGJSkGO5/I9SMWdBKM3JV2eFAfB0ijRA==", + "version": "0.2.48", + "resolved": "https://registry.npmjs.org/@robosystems/client/-/client-0.2.48.tgz", + "integrity": "sha512-Ye4qABMGT2wihPelzz0IvGhAtdtmxULZvzpdlyzH0dB1kx5Ko/fXgwHEPjHETd6DQiZ/8lNzI/HCEHSo6LB49g==", "license": "MIT", "bin": { "create-feature": "bin/create-feature.sh" @@ -3261,6 +3261,26 @@ } } }, + "node_modules/@rollup/plugin-node-resolve/node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/@rollup/pluginutils": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", @@ -3290,9 +3310,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.1.tgz", - "integrity": "sha512-xB0b51TB7IfDEzAojXahmr+gfA00uYVInJGgNNkeQG6RPnCPGr7udsylFLTubuIUSRE6FkcI1NElyRt83PP5oQ==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", "cpu": [ "arm" ], @@ -3304,9 +3324,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.1.tgz", - "integrity": "sha512-XOjPId0qwSDKHaIsdzHJtKCxX0+nH8MhBwvrNsT7tVyKmdTx1jJ4XzN5RZXCdTzMpufLb+B8llTC0D8uCrLhcw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", "cpu": [ "arm64" ], @@ -3318,9 +3338,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.1.tgz", - "integrity": "sha512-vQuRd28p0gQpPrS6kppd8IrWmFo42U8Pz1XLRjSZXq5zCqyMDYFABT7/sywL11mO1EL10Qhh7MVPEwkG8GiBeg==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", "cpu": [ "arm64" ], @@ -3332,9 +3352,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.1.tgz", - "integrity": "sha512-x6VG6U29+Ivlnajrg1IHdzXeAwSoEHBFVO+CtC9Brugx6de712CUJobRUxsIA0KYrQvCmzNrMPFTT1A4CCqNTg==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", "cpu": [ "x64" ], @@ -3346,9 +3366,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.1.tgz", - "integrity": "sha512-Sgi0Uo6t1YCHJMNO3Y8+bm+SvOanUGkoZKn/VJPwYUe2kp31X5KnXmzKd/NjW8iA3gFcfNZ64zh14uOGrIllCQ==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", "cpu": [ "arm64" ], @@ -3360,9 +3380,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.1.tgz", - "integrity": "sha512-AM4xnwEZwukdhk7laMWfzWu9JGSVnJd+Fowt6Fd7QW1nrf3h0Hp7Qx5881M4aqrUlKBCybOxz0jofvIIfl7C5g==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", "cpu": [ "x64" ], @@ -3374,9 +3394,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.1.tgz", - "integrity": "sha512-KUizqxpwaR2AZdAUsMWfL/C94pUu7TKpoPd88c8yFVixJ+l9hejkrwoK5Zj3wiNh65UeyryKnJyxL1b7yNqFQA==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", "cpu": [ "arm" ], @@ -3388,9 +3408,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.1.tgz", - "integrity": "sha512-MZoQ/am77ckJtZGFAtPucgUuJWiop3m2R3lw7tC0QCcbfl4DRhQUBUkHWCkcrT3pqy5Mzv5QQgY6Dmlba6iTWg==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", "cpu": [ "arm" ], @@ -3402,9 +3422,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.1.tgz", - "integrity": "sha512-Sez95TP6xGjkWB1608EfhCX1gdGrO5wzyN99VqzRtC17x/1bhw5VU1V0GfKUwbW/Xr1J8mSasoFoJa6Y7aGGSA==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", "cpu": [ "arm64" ], @@ -3416,9 +3436,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.1.tgz", - "integrity": "sha512-9Cs2Seq98LWNOJzR89EGTZoiP8EkZ9UbQhBlDgfAkM6asVna1xJ04W2CLYWDN/RpUgOjtQvcv8wQVi1t5oQazA==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", "cpu": [ "arm64" ], @@ -3430,9 +3450,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.1.tgz", - "integrity": "sha512-n9yqttftgFy7IrNEnHy1bOp6B4OSe8mJDiPkT7EqlM9FnKOwUMnCK62ixW0Kd9Clw0/wgvh8+SqaDXMFvw3KqQ==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", "cpu": [ "loong64" ], @@ -3444,9 +3464,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.1.tgz", - "integrity": "sha512-SfpNXDzVTqs/riak4xXcLpq5gIQWsqGWMhN1AGRQKB4qGSs4r0sEs3ervXPcE1O9RsQ5bm8Muz6zmQpQnPss1g==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", "cpu": [ "loong64" ], @@ -3458,9 +3478,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.1.tgz", - "integrity": "sha512-LjaChED0wQnjKZU+tsmGbN+9nN1XhaWUkAlSbTdhpEseCS4a15f/Q8xC2BN4GDKRzhhLZpYtJBZr2NZhR0jvNw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", "cpu": [ "ppc64" ], @@ -3472,9 +3492,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.1.tgz", - "integrity": "sha512-ojW7iTJSIs4pwB2xV6QXGwNyDctvXOivYllttuPbXguuKDX5vwpqYJsHc6D2LZzjDGHML414Tuj3LvVPe1CT1A==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", "cpu": [ "ppc64" ], @@ -3486,9 +3506,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.1.tgz", - "integrity": "sha512-FP+Q6WTcxxvsr0wQczhSE+tOZvFPV8A/mUE6mhZYFW9/eea/y/XqAgRoLLMuE9Cz0hfX5bi7p116IWoB+P237A==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", "cpu": [ "riscv64" ], @@ -3500,9 +3520,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.1.tgz", - "integrity": "sha512-L1uD9b/Ig8Z+rn1KttCJjwhN1FgjRMBKsPaBsDKkfUl7GfFq71pU4vWCnpOsGljycFEbkHWARZLf4lMYg3WOLw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", "cpu": [ "riscv64" ], @@ -3514,9 +3534,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.1.tgz", - "integrity": "sha512-EZc9NGTk/oSUzzOD4nYY4gIjteo2M3CiozX6t1IXGCOdgxJTlVu/7EdPeiqeHPSIrxkLhavqpBAUCfvC6vBOug==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", "cpu": [ "s390x" ], @@ -3528,9 +3548,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.1.tgz", - "integrity": "sha512-NQ9KyU1Anuy59L8+HHOKM++CoUxrQWrZWXRik4BJFm+7i5NP6q/SW43xIBr80zzt+PDBJ7LeNmloQGfa0JGk0w==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", "cpu": [ "x64" ], @@ -3542,9 +3562,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.1.tgz", - "integrity": "sha512-GZkLk2t6naywsveSFBsEb0PLU+JC9ggVjbndsbG20VPhar6D1gkMfCx4NfP9owpovBXTN+eRdqGSkDGIxPHhmQ==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", "cpu": [ "x64" ], @@ -3556,9 +3576,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.1.tgz", - "integrity": "sha512-1hjG9Jpl2KDOetr64iQd8AZAEjkDUUK5RbDkYWsViYLC1op1oNzdjMJeFiofcGhqbNTaY2kfgqowE7DILifsrA==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", "cpu": [ "x64" ], @@ -3570,9 +3590,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.1.tgz", - "integrity": "sha512-ARoKfflk0SiiYm3r1fmF73K/yB+PThmOwfWCk1sr7x/k9dc3uGLWuEE9if+Pw21el8MSpp3TMnG5vLNsJ/MMGQ==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", "cpu": [ "arm64" ], @@ -3584,9 +3604,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.1.tgz", - "integrity": "sha512-oOST61G6VM45Mz2vdzWMr1s2slI7y9LqxEV5fCoWi2MDONmMvgsJVHSXxce/I2xOSZPTZ47nDPOl1tkwKWSHcw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", "cpu": [ "arm64" ], @@ -3598,9 +3618,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.1.tgz", - "integrity": "sha512-x5WgLi5dWpRz7WclKBGEF15LcWTh0ewrHM6Cq4A+WUbkysUMZNeqt05bwPonOQ3ihPS/WMhAZV5zB1DfnI4Sxg==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", "cpu": [ "ia32" ], @@ -3612,9 +3632,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.1.tgz", - "integrity": "sha512-wS+zHAJRVP5zOL0e+a3V3E/NTEwM2HEvvNKoDy5Xcfs0o8lljxn+EAFPkUsxihBdmDq1JWzXmmB9cbssCPdxxw==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", "cpu": [ "x64" ], @@ -3626,9 +3646,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.1.tgz", - "integrity": "sha512-rhHyrMeLpErT/C7BxcEsU4COHQUzHyrPYW5tOZUeUhziNtRuYxmDWvqQqzpuUt8xpOgmbKa1btGXfnA/ANVO+g==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", "cpu": [ "x64" ], @@ -3647,16 +3667,16 @@ "license": "MIT" }, "node_modules/@smithy/config-resolver": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.13.tgz", - "integrity": "sha512-iIzMC5NmOUP6WL6o8iPBjFhUhBZ9pPjpUpQYWMUFQqKyXXzOftbfK8zcQCz/jFV1Psmf05BK5ypx4K2r4Tnwdg==", + "version": "4.4.14", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.14.tgz", + "integrity": "sha512-N55f8mPEccpzKetUagdvmAy8oohf0J5cuj9jLI1TaSceRlq0pJsIZepY3kmAXAhyxqXPV6hDerDQhqQPKWgAoQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.12", - "@smithy/types": "^4.13.1", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/types": "^4.14.0", "@smithy/util-config-provider": "^4.2.2", - "@smithy/util-endpoints": "^3.3.3", - "@smithy/util-middleware": "^4.2.12", + "@smithy/util-endpoints": "^3.3.4", + "@smithy/util-middleware": "^4.2.13", "tslib": "^2.6.2" }, "engines": { @@ -3664,18 +3684,18 @@ } }, "node_modules/@smithy/core": { - "version": "3.23.13", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.13.tgz", - "integrity": "sha512-J+2TT9D6oGsUVXVEMvz8h2EmdVnkBiy2auCie4aSJMvKlzUtO5hqjEzXhoCUkIMo7gAYjbQcN0g/MMSXEhDs1Q==", + "version": "3.23.14", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.14.tgz", + "integrity": "sha512-vJ0IhpZxZAkFYOegMKSrxw7ujhhT2pass/1UEcZ4kfl5srTAqtPU5I7MdYQoreVas3204ykCiNhY1o7Xlz6Yyg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", + "@smithy/url-parser": "^4.2.13", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-stream": "^4.5.21", + "@smithy/util-middleware": "^4.2.13", + "@smithy/util-stream": "^4.5.22", "@smithy/util-utf8": "^4.2.2", "@smithy/uuid": "^1.1.2", "tslib": "^2.6.2" @@ -3685,15 +3705,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.12.tgz", - "integrity": "sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.13.tgz", + "integrity": "sha512-wboCPijzf6RJKLOvnjDAiBxGSmSnGXj35o5ZAWKDaHa/cvQ5U3ZJ13D4tMCE8JG4dxVAZFy/P0x/V9CwwdfULQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.12", - "@smithy/property-provider": "^4.2.12", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/property-provider": "^4.2.13", + "@smithy/types": "^4.14.0", + "@smithy/url-parser": "^4.2.13", "tslib": "^2.6.2" }, "engines": { @@ -3701,14 +3721,14 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.3.15", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.15.tgz", - "integrity": "sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A==", + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.16.tgz", + "integrity": "sha512-nYDRUIvNd4mFmuXraRWt6w5UsZTNqtj4hXJA/iiOD4tuseIdLP9Lq38teH/SZTcIFCa2f+27o7hYpIsWktJKEQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.12", - "@smithy/querystring-builder": "^4.2.12", - "@smithy/types": "^4.13.1", + "@smithy/protocol-http": "^5.3.13", + "@smithy/querystring-builder": "^4.2.13", + "@smithy/types": "^4.14.0", "@smithy/util-base64": "^4.3.2", "tslib": "^2.6.2" }, @@ -3717,12 +3737,12 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.12.tgz", - "integrity": "sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.13.tgz", + "integrity": "sha512-4/oy9h0jjmY80a2gOIo75iLl8TOPhmtx4E2Hz+PfMjvx/vLtGY4TMU/35WRyH2JHPfT5CVB38u4JRow7gnmzJA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "@smithy/util-buffer-from": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" @@ -3732,12 +3752,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.12.tgz", - "integrity": "sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.13.tgz", + "integrity": "sha512-jvC0RB/8BLj2SMIkY0Npl425IdnxZJxInpZJbu563zIRnVjpDMXevU3VMCRSabaLB0kf/eFIOusdGstrLJ8IDg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3757,13 +3777,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.12.tgz", - "integrity": "sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.13.tgz", + "integrity": "sha512-IPMLm/LE4AZwu6qiE8Rr8vJsWhs9AtOdySRXrOM7xnvclp77Tyh7hMs/FRrMf26kgIe67vFJXXOSmVxS7oKeig==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3771,18 +3791,18 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.4.28", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.28.tgz", - "integrity": "sha512-p1gfYpi91CHcs5cBq982UlGlDrxoYUX6XdHSo91cQ2KFuz6QloHosO7Jc60pJiVmkWrKOV8kFYlGFFbQ2WUKKQ==", + "version": "4.4.29", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.29.tgz", + "integrity": "sha512-R9Q/58U+qBiSARGWbAbFLczECg/RmysRksX6Q8BaQEpt75I7LI6WGDZnjuC9GXSGKljEbA7N118LhGaMbfrTXw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.23.13", - "@smithy/middleware-serde": "^4.2.16", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", - "@smithy/util-middleware": "^4.2.12", + "@smithy/core": "^3.23.14", + "@smithy/middleware-serde": "^4.2.17", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", + "@smithy/url-parser": "^4.2.13", + "@smithy/util-middleware": "^4.2.13", "tslib": "^2.6.2" }, "engines": { @@ -3790,18 +3810,19 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.4.46", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.46.tgz", - "integrity": "sha512-SpvWNNOPOrKQGUqZbEPO+es+FRXMWvIyzUKUOYdDgdlA6BdZj/R58p4umoQ76c2oJC44PiM7mKizyyex1IJzow==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.5.1.tgz", + "integrity": "sha512-/zY+Gp7Qj2D2hVm3irkCyONER7E9MiX3cUUm/k2ZmhkzZkrPgwVS4aJ5NriZUEN/M0D1hhjrgjUmX04HhRwdWA==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/service-error-classification": "^4.2.12", - "@smithy/smithy-client": "^4.12.8", - "@smithy/types": "^4.13.1", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-retry": "^4.2.13", + "@smithy/core": "^3.23.14", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/protocol-http": "^5.3.13", + "@smithy/service-error-classification": "^4.2.13", + "@smithy/smithy-client": "^4.12.9", + "@smithy/types": "^4.14.0", + "@smithy/util-middleware": "^4.2.13", + "@smithy/util-retry": "^4.3.1", "@smithy/uuid": "^1.1.2", "tslib": "^2.6.2" }, @@ -3810,14 +3831,14 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "4.2.16", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.16.tgz", - "integrity": "sha512-beqfV+RZ9RSv+sQqor3xroUUYgRFCGRw6niGstPG8zO9LgTl0B0MCucxjmrH/2WwksQN7UUgI7KNANoZv+KALA==", + "version": "4.2.17", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.17.tgz", + "integrity": "sha512-0T2mcaM6v9W1xku86Dk0bEW7aEseG6KenFkPK98XNw0ZhOqOiD1MrMsdnQw9QsL3/Oa85T53iSMlm0SZdSuIEQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.23.13", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", + "@smithy/core": "^3.23.14", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3825,12 +3846,12 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.12.tgz", - "integrity": "sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.13.tgz", + "integrity": "sha512-g72jN/sGDLyTanrCLH9fhg3oysO3f7tQa6eWWsMyn2BiYNCgjF24n4/I9wff/5XidFvjj9ilipAoQrurTUrLvw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3838,14 +3859,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "4.3.12", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.12.tgz", - "integrity": "sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==", + "version": "4.3.13", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.13.tgz", + "integrity": "sha512-iGxQ04DsKXLckbgnX4ipElrOTk+IHgTyu0q0WssZfYhDm9CQWHmu6cOeI5wmWRxpXbBDhIIfXMWz5tPEtcVqbw==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.12", - "@smithy/shared-ini-file-loader": "^4.4.7", - "@smithy/types": "^4.13.1", + "@smithy/property-provider": "^4.2.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3853,14 +3874,14 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.1.tgz", - "integrity": "sha512-ejjxdAXjkPIs9lyYyVutOGNOraqUE9v/NjGMKwwFrfOM354wfSD8lmlj8hVwUzQmlLLF4+udhfCX9Exnbmvfzw==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.2.tgz", + "integrity": "sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.12", - "@smithy/querystring-builder": "^4.2.12", - "@smithy/types": "^4.13.1", + "@smithy/protocol-http": "^5.3.13", + "@smithy/querystring-builder": "^4.2.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3868,12 +3889,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.12.tgz", - "integrity": "sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.13.tgz", + "integrity": "sha512-bGzUCthxRmezuxkbu9wD33wWg9KX3hJpCXpQ93vVkPrHn9ZW6KNNdY5xAUWNuRCwQ+VyboFuWirG1lZhhkcyRQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3881,12 +3902,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "5.3.12", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.12.tgz", - "integrity": "sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3894,12 +3915,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.12.tgz", - "integrity": "sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.13.tgz", + "integrity": "sha512-tG4aOYFCZdPMjbgfhnIQ322H//ojujldp1SrHPHpBSb3NqgUp3dwiUGRJzie87hS1DYwWGqDuPaowoDF+rYCbQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "@smithy/util-uri-escape": "^4.2.2", "tslib": "^2.6.2" }, @@ -3908,12 +3929,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.12.tgz", - "integrity": "sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.13.tgz", + "integrity": "sha512-hqW3Q4P+CDzUyQ87GrboGMeD7XYNMOF+CuTwu936UQRB/zeYn3jys8C3w+wMkDfY7CyyyVwZQ5cNFoG0x1pYmA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3921,24 +3942,24 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.12.tgz", - "integrity": "sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.13.tgz", + "integrity": "sha512-a0s8XZMfOC/qpqq7RCPvJlk93rWFrElH6O++8WJKz0FqnA4Y7fkNi/0mnGgSH1C4x6MFsuBA8VKu4zxFrMe5Vw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.1" + "@smithy/types": "^4.14.0" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.7.tgz", - "integrity": "sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.8.tgz", + "integrity": "sha512-VZCZx2bZasxdqxVgEAhREvDSlkatTPnkdWy1+Kiy8w7kYPBosW0V5IeDwzDUMvWBt56zpK658rx1cOBFOYaPaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -3946,16 +3967,16 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.3.12", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.12.tgz", - "integrity": "sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw==", + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.13.tgz", + "integrity": "sha512-YpYSyM0vMDwKbHD/JA7bVOF6kToVRpa+FM5ateEVRpsTNu564g1muBlkTubXhSKKYXInhpADF46FPyrZcTLpXg==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^4.2.2", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", "@smithy/util-hex-encoding": "^4.2.2", - "@smithy/util-middleware": "^4.2.12", + "@smithy/util-middleware": "^4.2.13", "@smithy/util-uri-escape": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" @@ -3965,17 +3986,17 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.12.8", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.8.tgz", - "integrity": "sha512-aJaAX7vHe5i66smoSSID7t4rKY08PbD8EBU7DOloixvhOozfYWdcSYE4l6/tjkZ0vBZhGjheWzB2mh31sLgCMA==", + "version": "4.12.9", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.9.tgz", + "integrity": "sha512-ovaLEcTU5olSeHcRXcxV6viaKtpkHZumn6Ps0yn7dRf2rRSfy794vpjOtrWDO0d1auDSvAqxO+lyhERSXQ03EQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.23.13", - "@smithy/middleware-endpoint": "^4.4.28", - "@smithy/middleware-stack": "^4.2.12", - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-stream": "^4.5.21", + "@smithy/core": "^3.23.14", + "@smithy/middleware-endpoint": "^4.4.29", + "@smithy/middleware-stack": "^4.2.13", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", + "@smithy/util-stream": "^4.5.22", "tslib": "^2.6.2" }, "engines": { @@ -3983,9 +4004,9 @@ } }, "node_modules/@smithy/types": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.13.1.tgz", - "integrity": "sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.0.tgz", + "integrity": "sha512-OWgntFLW88kx2qvf/c/67Vno1yuXm/f9M7QFAtVkkO29IJXGBIg0ycEaBTH0kvCtwmvZxRujrgP5a86RvsXJAQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -3995,13 +4016,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.12.tgz", - "integrity": "sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.13.tgz", + "integrity": "sha512-2G03yoboIRZlZze2+PT4GZEjgwQsJjUgn6iTsvxA02bVceHR6vp4Cuk7TUnPFWKF+ffNUk3kj4COwkENS2K3vw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.2.12", - "@smithy/types": "^4.13.1", + "@smithy/querystring-parser": "^4.2.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -4072,14 +4093,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.44", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.44.tgz", - "integrity": "sha512-eZg6XzaCbVr2S5cAErU5eGBDaOVTuTo1I65i4tQcHENRcZ8rMWhQy1DaIYUSLyZjsfXvmCqZrstSMYyGFocvHA==", + "version": "4.3.45", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.45.tgz", + "integrity": "sha512-ag9sWc6/nWZAuK3Wm9KlFJUnRkXLrXn33RFjIAmCTFThqLHY+7wCst10BGq56FxslsDrjhSie46c8OULS+BiIw==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.12", - "@smithy/smithy-client": "^4.12.8", - "@smithy/types": "^4.13.1", + "@smithy/property-provider": "^4.2.13", + "@smithy/smithy-client": "^4.12.9", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -4087,17 +4108,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.48", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.48.tgz", - "integrity": "sha512-FqOKTlqSaoV3nzO55pMs5NBnZX8EhoI0DGmn9kbYeXWppgHD6dchyuj2HLqp4INJDJbSrj6OFYJkAh/WhSzZPg==", + "version": "4.2.49", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.49.tgz", + "integrity": "sha512-jlN6vHwE8gY5AfiFBavtD3QtCX2f7lM3BKkz7nFKSNfFR5nXLXLg6sqXTJEEyDwtxbztIDBQCfjsGVXlIru2lQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.4.13", - "@smithy/credential-provider-imds": "^4.2.12", - "@smithy/node-config-provider": "^4.3.12", - "@smithy/property-provider": "^4.2.12", - "@smithy/smithy-client": "^4.12.8", - "@smithy/types": "^4.13.1", + "@smithy/config-resolver": "^4.4.14", + "@smithy/credential-provider-imds": "^4.2.13", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/property-provider": "^4.2.13", + "@smithy/smithy-client": "^4.12.9", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -4105,13 +4126,13 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.3.3.tgz", - "integrity": "sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.3.4.tgz", + "integrity": "sha512-BKoR/ubPp9KNKFxPpg1J28N1+bgu8NGAtJblBP7yHy8yQPBWhIAv9+l92SlQLpolGm71CVO+btB60gTgzT0wog==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.12", - "@smithy/types": "^4.13.1", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -4131,12 +4152,12 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.12.tgz", - "integrity": "sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==", + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.13.tgz", + "integrity": "sha512-GTooyrlmRTqvUen4eK7/K1p6kryF7bnDfq6XsAbIsf2mo51B/utaH+XThY6dKgNCWzMAaH/+OLmqaBuLhLWRow==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.1", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -4144,13 +4165,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.2.13", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.13.tgz", - "integrity": "sha512-qQQsIvL0MGIbUjeSrg0/VlQ3jGNKyM3/2iU3FPNgy01z+Sp4OvcaxbgIoFOTvB61ZoohtutuOvOcgmhbD0katQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.3.1.tgz", + "integrity": "sha512-FwmicpgWOkP5kZUjN3y+3JIom8NLGqSAJBeoIgK0rIToI817TEBHCrd0A2qGeKQlgDeP+Jzn4i0H/NLAXGy9uQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.2.12", - "@smithy/types": "^4.13.1", + "@smithy/service-error-classification": "^4.2.13", + "@smithy/types": "^4.14.0", "tslib": "^2.6.2" }, "engines": { @@ -4158,14 +4179,14 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.5.21", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.21.tgz", - "integrity": "sha512-KzSg+7KKywLnkoKejRtIBXDmwBfjGvg1U1i/etkC7XSWUyFCoLno1IohV2c74IzQqdhX5y3uE44r/8/wuK+A7Q==", + "version": "4.5.22", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.22.tgz", + "integrity": "sha512-3H8iq/0BfQjUs2/4fbHZ9aG9yNzcuZs24LPkcX1Q7Z+qpqaGM8+qbGmE8zo9m2nCRgamyvS98cHdcWvR6YUsew==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.3.15", - "@smithy/node-http-handler": "^4.5.1", - "@smithy/types": "^4.13.1", + "@smithy/fetch-http-handler": "^5.3.16", + "@smithy/node-http-handler": "^4.5.2", + "@smithy/types": "^4.14.0", "@smithy/util-base64": "^4.3.2", "@smithy/util-buffer-from": "^4.2.2", "@smithy/util-hex-encoding": "^4.2.2", @@ -4778,9 +4799,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.19.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz", - "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", + "version": "22.19.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.17.tgz", + "integrity": "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4825,20 +4846,20 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.1.tgz", - "integrity": "sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.1.tgz", + "integrity": "sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.57.1", - "@typescript-eslint/type-utils": "8.57.1", - "@typescript-eslint/utils": "8.57.1", - "@typescript-eslint/visitor-keys": "8.57.1", + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/type-utils": "8.58.1", + "@typescript-eslint/utils": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4848,22 +4869,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.57.1", + "@typescript-eslint/parser": "^8.58.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.1.tgz", - "integrity": "sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.1.tgz", + "integrity": "sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.57.1", - "@typescript-eslint/types": "8.57.1", - "@typescript-eslint/typescript-estree": "8.57.1", - "@typescript-eslint/visitor-keys": "8.57.1", + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", "debug": "^4.4.3" }, "engines": { @@ -4875,18 +4896,18 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.1.tgz", - "integrity": "sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.1.tgz", + "integrity": "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.57.1", - "@typescript-eslint/types": "^8.57.1", + "@typescript-eslint/tsconfig-utils": "^8.58.1", + "@typescript-eslint/types": "^8.58.1", "debug": "^4.4.3" }, "engines": { @@ -4897,18 +4918,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.1.tgz", - "integrity": "sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.1.tgz", + "integrity": "sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.57.1", - "@typescript-eslint/visitor-keys": "8.57.1" + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4919,9 +4940,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.1.tgz", - "integrity": "sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.1.tgz", + "integrity": "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==", "dev": true, "license": "MIT", "engines": { @@ -4932,21 +4953,21 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.1.tgz", - "integrity": "sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.1.tgz", + "integrity": "sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.57.1", - "@typescript-eslint/typescript-estree": "8.57.1", - "@typescript-eslint/utils": "8.57.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/utils": "8.58.1", "debug": "^4.4.3", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4957,13 +4978,13 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.1.tgz", - "integrity": "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.1.tgz", + "integrity": "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==", "dev": true, "license": "MIT", "engines": { @@ -4975,21 +4996,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.1.tgz", - "integrity": "sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.1.tgz", + "integrity": "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.57.1", - "@typescript-eslint/tsconfig-utils": "8.57.1", - "@typescript-eslint/types": "8.57.1", - "@typescript-eslint/visitor-keys": "8.57.1", + "@typescript-eslint/project-service": "8.58.1", + "@typescript-eslint/tsconfig-utils": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/visitor-keys": "8.58.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4999,20 +5020,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.1.tgz", - "integrity": "sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.1.tgz", + "integrity": "sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.57.1", - "@typescript-eslint/types": "8.57.1", - "@typescript-eslint/typescript-estree": "8.57.1" + "@typescript-eslint/scope-manager": "8.58.1", + "@typescript-eslint/types": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5023,17 +5044,17 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.1.tgz", - "integrity": "sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.1.tgz", + "integrity": "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/types": "8.58.1", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -5871,9 +5892,9 @@ } }, "node_modules/axe-core": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", - "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.2.tgz", + "integrity": "sha512-byD6KPdvo72y/wj2T/4zGEvvlis+PsZsn/yPS3pEO+sFpcrqRpX/TJCxvVaEsNeMrfQbCr7w163YqoD9IYwHXw==", "dev": true, "license": "MPL-2.0", "engines": { @@ -5881,14 +5902,14 @@ } }, "node_modules/axios": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", - "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", + "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", - "proxy-from-env": "^1.1.0" + "proxy-from-env": "^2.1.0" } }, "node_modules/axobject-query": { @@ -5922,9 +5943,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.10.10", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.10.tgz", - "integrity": "sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==", + "version": "2.10.17", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.17.tgz", + "integrity": "sha512-HdrkN8eVG2CXxeifv/VdJ4A4RSra1DTW8dc/hdxzhGHN8QePs6gKaWM9pHPcpCoxYZJuOZ8drHmbdpLHjCYjLA==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -5976,9 +5997,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "dev": true, "funding": [ { @@ -5996,11 +6017,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -6026,15 +6047,15 @@ } }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" }, "engines": { @@ -6085,9 +6106,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001780", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz", - "integrity": "sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==", + "version": "1.0.30001787", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001787.tgz", + "integrity": "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==", "funding": [ { "type": "opencollective", @@ -6733,9 +6754,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.321", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz", - "integrity": "sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==", + "version": "1.5.335", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.335.tgz", + "integrity": "sha512-q9n5T4BR4Xwa2cwbrwcsDJtHD/enpQ5S1xF1IAtdqf5AAgqDFmR/aakqH3ChFdqd/QXJhS3rnnXFtexU7rax6Q==", "dev": true, "license": "ISC" }, @@ -6780,9 +6801,9 @@ } }, "node_modules/es-abstract": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", - "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", "dev": true, "license": "MIT", "dependencies": { @@ -6867,16 +6888,16 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.1.tgz", - "integrity": "sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz", + "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", + "call-bind": "^1.0.9", "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.24.1", + "es-abstract": "^1.24.2", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", @@ -6888,8 +6909,7 @@ "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", - "math-intrinsics": "^1.1.0", - "safe-array-concat": "^1.1.3" + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6961,9 +6981,9 @@ } }, "node_modules/esbuild": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", - "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -6974,32 +6994,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.4", - "@esbuild/android-arm": "0.27.4", - "@esbuild/android-arm64": "0.27.4", - "@esbuild/android-x64": "0.27.4", - "@esbuild/darwin-arm64": "0.27.4", - "@esbuild/darwin-x64": "0.27.4", - "@esbuild/freebsd-arm64": "0.27.4", - "@esbuild/freebsd-x64": "0.27.4", - "@esbuild/linux-arm": "0.27.4", - "@esbuild/linux-arm64": "0.27.4", - "@esbuild/linux-ia32": "0.27.4", - "@esbuild/linux-loong64": "0.27.4", - "@esbuild/linux-mips64el": "0.27.4", - "@esbuild/linux-ppc64": "0.27.4", - "@esbuild/linux-riscv64": "0.27.4", - "@esbuild/linux-s390x": "0.27.4", - "@esbuild/linux-x64": "0.27.4", - "@esbuild/netbsd-arm64": "0.27.4", - "@esbuild/netbsd-x64": "0.27.4", - "@esbuild/openbsd-arm64": "0.27.4", - "@esbuild/openbsd-x64": "0.27.4", - "@esbuild/openharmony-arm64": "0.27.4", - "@esbuild/sunos-x64": "0.27.4", - "@esbuild/win32-arm64": "0.27.4", - "@esbuild/win32-ia32": "0.27.4", - "@esbuild/win32-x64": "0.27.4" + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" } }, "node_modules/escalade": { @@ -7086,13 +7106,13 @@ } }, "node_modules/eslint-config-next": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.2.2.tgz", - "integrity": "sha512-6VlvEhwoug2JpVgjZDhyXrJXUEuPY++TddzIpTaIRvlvlXXFgvQUtm3+Zr84IjFm0lXtJt73w19JA08tOaZVwg==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.2.3.tgz", + "integrity": "sha512-Dnkrylzjof/Az7iNoIQJqD18zTxQZcngir19KJaiRsMnnjpQSVoa6aEg/1Q4hQC+cW90uTlgQYadwL1CYNwFWA==", "dev": true, "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "16.2.2", + "@next/eslint-plugin-next": "16.2.3", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.32.0", @@ -7162,15 +7182,15 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", "dev": true, "license": "MIT", "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -7510,30 +7530,6 @@ "node": "*" } }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", - "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "node-exports-info": "^1.6.0", - "object-keys": "^1.1.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/eslint-plugin-react/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -8222,9 +8218,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.13.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz", - "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==", + "version": "4.13.7", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.7.tgz", + "integrity": "sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==", "dev": true, "license": "MIT", "dependencies": { @@ -8604,9 +8600,9 @@ } }, "node_modules/intuit-oauth": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/intuit-oauth/-/intuit-oauth-4.2.2.tgz", - "integrity": "sha512-8H0O1sZlq7tsyarD+wpwcwNY4Ku30lc4b5aXKAGCQt64DvHLnMZvHQxjWFO1rRw91dDgUvTxP2och+9gfcKKhw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/intuit-oauth/-/intuit-oauth-4.2.3.tgz", + "integrity": "sha512-VxVBTIY5O/wsx8E97q0QsZEeysbrN0Q4iCi6jWz+jQjmM1mHpPnpw6l7ho4dFLm1dLkvinbL4i+78nZlmnAlrw==", "license": "Apache-2.0", "dependencies": { "atob": "2.1.2", @@ -9245,14 +9241,14 @@ } }, "node_modules/jsdom": { - "version": "29.0.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.0.1.tgz", - "integrity": "sha512-z6JOK5gRO7aMybVq/y/MlIpKh8JIi68FBKMUtKkK2KH/wMSRlCxQ682d08LB9fYXplyY/UXG8P4XXTScmdjApg==", + "version": "29.0.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.0.2.tgz", + "integrity": "sha512-9VnGEBosc/ZpwyOsJBCQ/3I5p7Q5ngOY14a9bf5btenAORmZfDse1ZEheMiWcJ3h81+Fv7HmJFdS0szo/waF2w==", "dev": true, "license": "MIT", "dependencies": { - "@asamuzakjp/css-color": "^5.0.1", - "@asamuzakjp/dom-selector": "^7.0.3", + "@asamuzakjp/css-color": "^5.1.5", + "@asamuzakjp/dom-selector": "^7.0.6", "@bramus/specificity": "^2.4.2", "@csstools/css-syntax-patches-for-csstree": "^1.1.1", "@exodus/bytes": "^1.15.0", @@ -9823,9 +9819,9 @@ "license": "MIT" }, "node_modules/lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.3.tgz", + "integrity": "sha512-JvNw9Y81y33E+BEYPr0U7omo+U9AySnsMsEiXgwT6yqd31VQWTLNQqmT4ou5eqPFUrTfIDFta2wKhB1hyohtAQ==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -10575,13 +10571,13 @@ } }, "node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^5.0.5" }, "engines": { "node": "18 || 20 || >=22" @@ -10658,12 +10654,12 @@ "license": "MIT" }, "node_modules/next": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/next/-/next-16.2.1.tgz", - "integrity": "sha512-VaChzNL7o9rbfdt60HUj8tev4m6d7iC1igAy157526+cJlXOQu5LzsBXNT+xaJnTP/k+utSX5vMv7m0G+zKH+Q==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/next/-/next-16.2.3.tgz", + "integrity": "sha512-9V3zV4oZFza3PVev5/poB9g0dEafVcgNyQ8eTRop8GvxZjV2G15FC5ARuG1eFD42QgeYkzJBJzHghNP8Ad9xtA==", "license": "MIT", "dependencies": { - "@next/env": "16.2.1", + "@next/env": "16.2.3", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", @@ -10677,14 +10673,14 @@ "node": ">=20.9.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "16.2.1", - "@next/swc-darwin-x64": "16.2.1", - "@next/swc-linux-arm64-gnu": "16.2.1", - "@next/swc-linux-arm64-musl": "16.2.1", - "@next/swc-linux-x64-gnu": "16.2.1", - "@next/swc-linux-x64-musl": "16.2.1", - "@next/swc-win32-arm64-msvc": "16.2.1", - "@next/swc-win32-x64-msvc": "16.2.1", + "@next/swc-darwin-arm64": "16.2.3", + "@next/swc-darwin-x64": "16.2.3", + "@next/swc-linux-arm64-gnu": "16.2.3", + "@next/swc-linux-arm64-musl": "16.2.3", + "@next/swc-linux-x64-gnu": "16.2.3", + "@next/swc-linux-x64-musl": "16.2.3", + "@next/swc-win32-arm64-msvc": "16.2.3", + "@next/swc-win32-x64-msvc": "16.2.3", "sharp": "^0.34.5" }, "peerDependencies": { @@ -10768,9 +10764,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.36", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", - "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "version": "2.0.37", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", + "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", "dev": true, "license": "MIT" }, @@ -11085,9 +11081,9 @@ } }, "node_modules/path-expression-matcher": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.2.0.tgz", - "integrity": "sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", + "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", "funding": [ { "type": "github", @@ -11197,9 +11193,9 @@ } }, "node_modules/postcss": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", - "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.9.tgz", + "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==", "funding": [ { "type": "opencollective", @@ -11249,9 +11245,9 @@ } }, "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.2.tgz", + "integrity": "sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q==", "dev": true, "license": "MIT", "bin": { @@ -11431,10 +11427,13 @@ } }, "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } }, "node_modules/punycode": { "version": "2.3.1", @@ -11495,24 +11494,24 @@ } }, "node_modules/react": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", + "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.4" + "react": "^19.2.5" } }, "node_modules/react-icons": { @@ -11711,12 +11710,16 @@ } }, "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "version": "2.0.0-next.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", + "dev": true, "license": "MIT", "dependencies": { + "es-errors": "^1.3.0", "is-core-module": "^2.16.1", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -11768,9 +11771,9 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.59.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.1.tgz", - "integrity": "sha512-iZKH8BeoCwTCBTZBZWQQMreekd4mdomwdjIQ40GC1oZm6o+8PnNMIxFOiCsGMWeS8iDJ7KZcl7KwmKk/0HOQpA==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", "devOptional": true, "license": "MIT", "dependencies": { @@ -11784,31 +11787,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.59.1", - "@rollup/rollup-android-arm64": "4.59.1", - "@rollup/rollup-darwin-arm64": "4.59.1", - "@rollup/rollup-darwin-x64": "4.59.1", - "@rollup/rollup-freebsd-arm64": "4.59.1", - "@rollup/rollup-freebsd-x64": "4.59.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.59.1", - "@rollup/rollup-linux-arm-musleabihf": "4.59.1", - "@rollup/rollup-linux-arm64-gnu": "4.59.1", - "@rollup/rollup-linux-arm64-musl": "4.59.1", - "@rollup/rollup-linux-loong64-gnu": "4.59.1", - "@rollup/rollup-linux-loong64-musl": "4.59.1", - "@rollup/rollup-linux-ppc64-gnu": "4.59.1", - "@rollup/rollup-linux-ppc64-musl": "4.59.1", - "@rollup/rollup-linux-riscv64-gnu": "4.59.1", - "@rollup/rollup-linux-riscv64-musl": "4.59.1", - "@rollup/rollup-linux-s390x-gnu": "4.59.1", - "@rollup/rollup-linux-x64-gnu": "4.59.1", - "@rollup/rollup-linux-x64-musl": "4.59.1", - "@rollup/rollup-openbsd-x64": "4.59.1", - "@rollup/rollup-openharmony-arm64": "4.59.1", - "@rollup/rollup-win32-arm64-msvc": "4.59.1", - "@rollup/rollup-win32-ia32-msvc": "4.59.1", - "@rollup/rollup-win32-x64-gnu": "4.59.1", - "@rollup/rollup-win32-x64-msvc": "4.59.1", + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", "fsevents": "~2.3.2" } }, @@ -12095,14 +12098,14 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -12541,9 +12544,9 @@ "license": "MIT" }, "node_modules/strnum": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.2.tgz", - "integrity": "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.3.tgz", + "integrity": "sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==", "funding": [ { "type": "github", @@ -12686,9 +12689,9 @@ "license": "MIT" }, "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", + "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", "dev": true, "license": "MIT", "engines": { @@ -12735,14 +12738,14 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -12782,22 +12785,22 @@ } }, "node_modules/tldts": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.27.tgz", - "integrity": "sha512-I4FZcVFcqCRuT0ph6dCDpPuO4Xgzvh+spkcTr1gK7peIvxWauoloVO0vuy1FQnijT63ss6AsHB6+OIM4aXHbPg==", + "version": "7.0.28", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.28.tgz", + "integrity": "sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^7.0.27" + "tldts-core": "^7.0.28" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.27.tgz", - "integrity": "sha512-YQ7uPjgWUibIK6DW5lrKujGwUKhLevU4hcGbP5O6TcIUb+oTjJYJVWPS4nZsIHrEEEG6myk/oqAJUEQmpZrHsg==", + "version": "7.0.28", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.28.tgz", + "integrity": "sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==", "dev": true, "license": "MIT" }, @@ -13073,16 +13076,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.57.1.tgz", - "integrity": "sha512-fLvZWf+cAGw3tqMCYzGIU6yR8K+Y9NT2z23RwOjlNFF2HwSB3KhdEFI5lSBv8tNmFkkBShSjsCjzx1vahZfISA==", + "version": "8.58.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.1.tgz", + "integrity": "sha512-gf6/oHChByg9HJvhMO1iBexJh12AqqTfnuxscMDOVqfJW3htsdRJI/GfPpHTTcyeB8cSTUY2JcZmVgoyPqcrDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.57.1", - "@typescript-eslint/parser": "8.57.1", - "@typescript-eslint/typescript-estree": "8.57.1", - "@typescript-eslint/utils": "8.57.1" + "@typescript-eslint/eslint-plugin": "8.58.1", + "@typescript-eslint/parser": "8.58.1", + "@typescript-eslint/typescript-estree": "8.58.1", + "@typescript-eslint/utils": "8.58.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -13093,7 +13096,7 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/uid-safe": { @@ -13128,9 +13131,9 @@ } }, "node_modules/undici": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.5.tgz", - "integrity": "sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.7.tgz", + "integrity": "sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ==", "dev": true, "license": "MIT", "engines": { @@ -13349,9 +13352,9 @@ } }, "node_modules/vite": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", - "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", + "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 5740f4b..24d5854 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ }, "dependencies": { "@aws-sdk/client-sns": "^3.1021.0", - "@robosystems/client": "0.2.44", + "@robosystems/client": "0.2.48", "flowbite": "^3.1", "flowbite-react": "^0.12.5", "intuit-oauth": "^4.1.0", diff --git a/src/app/(app)/ledger/close/__tests__/AccountRollupsPanel.test.tsx b/src/app/(app)/ledger/close/__tests__/AccountRollupsPanel.test.tsx new file mode 100644 index 0000000..26eaee1 --- /dev/null +++ b/src/app/(app)/ledger/close/__tests__/AccountRollupsPanel.test.tsx @@ -0,0 +1,335 @@ +import { render, screen, waitFor } from '@testing-library/react' +import { describe, expect, it, vi } from 'vitest' + +const mockGetAccountRollups = vi.fn() + +vi.mock('@/lib/core', () => ({ + customTheme: { table: {} }, + extensions: { + ledger: { + getAccountRollups: (...args: any[]) => mockGetAccountRollups(...args), + }, + }, +})) + +vi.mock('flowbite-react', () => ({ + Badge: ({ children }: any) => {children}, + Spinner: () =>
, + Table: ({ children }: any) => {children}
, + TableBody: ({ children }: any) => {children}, + TableCell: ({ children, className, style }: any) => ( + + {children} + + ), + TableHead: ({ children }: any) => {children}, + TableHeadCell: ({ children }: any) => {children}, + TableRow: ({ children, className }: any) => ( + {children} + ), +})) + +vi.mock('react-icons/hi', () => ({ + HiExclamationCircle: () => , +})) + +vi.mock('../components/FactsTable', () => ({ + default: ({ facts }: any) => ( +
+ {facts.map((f: any, i: number) => ( + {f.elementName} + ))} +
+ ), +})) + +import type { AccountRollupsResponse } from '@robosystems/client' +import AccountRollupsPanel from '../components/AccountRollupsPanel' + +const makeResponse = ( + overrides?: Partial +): AccountRollupsResponse => ({ + mapping_id: 'struct_map_01', + mapping_name: 'GAAP Mapping', + groups: [ + { + reporting_element_id: 'elem_cash', + reporting_name: 'Cash and Cash Equivalents', + reporting_qname: 'us-gaap:CashAndCashEquivalents', + classification: 'asset', + balance_type: 'debit', + total: 15250.0, + accounts: [ + { + element_id: 'coa_checking', + account_name: 'BofA Checking', + account_code: '1010', + total_debits: 100000.0, + total_credits: 90000.0, + net_balance: 10000.0, + }, + { + element_id: 'coa_savings', + account_name: 'Savings Account', + account_code: '1020', + total_debits: 5250.0, + total_credits: 0, + net_balance: 5250.0, + }, + ], + }, + { + reporting_element_id: 'elem_rev', + reporting_name: 'Revenue', + reporting_qname: 'us-gaap:Revenues', + classification: 'revenue', + balance_type: 'credit', + total: 8000.0, + accounts: [ + { + element_id: 'coa_sales', + account_name: 'Sales Revenue', + account_code: '4000', + total_debits: 0, + total_credits: 8000.0, + net_balance: 8000.0, + }, + ], + }, + ], + total_mapped: 3, + total_unmapped: 2, + ...overrides, +}) + +describe('AccountRollupsPanel', () => { + it('shows spinner while loading', () => { + mockGetAccountRollups.mockReturnValue(new Promise(() => {})) // never resolves + render( + + ) + expect(screen.getByTestId('spinner')).toBeInTheDocument() + }) + + it('renders reporting element group headers', async () => { + mockGetAccountRollups.mockResolvedValue(makeResponse()) + render( + + ) + await waitFor(() => { + expect(screen.getByText('Cash and Cash Equivalents')).toBeInTheDocument() + expect(screen.getByText('Revenue')).toBeInTheDocument() + }) + }) + + it('renders CoA account detail rows', async () => { + mockGetAccountRollups.mockResolvedValue(makeResponse()) + render( + + ) + await waitFor(() => { + expect(screen.getByText('BofA Checking')).toBeInTheDocument() + expect(screen.getByText('Savings Account')).toBeInTheDocument() + expect(screen.getByText('Sales Revenue')).toBeInTheDocument() + }) + }) + + it('renders account codes', async () => { + mockGetAccountRollups.mockResolvedValue(makeResponse()) + render( + + ) + await waitFor(() => { + expect(screen.getByText('1010')).toBeInTheDocument() + expect(screen.getByText('1020')).toBeInTheDocument() + expect(screen.getByText('4000')).toBeInTheDocument() + }) + }) + + it('renders group totals formatted as currency', async () => { + mockGetAccountRollups.mockResolvedValue(makeResponse()) + render( + + ) + await waitFor(() => { + expect(screen.getByText('15,250.00')).toBeInTheDocument() + // 8,000.00 appears twice — group total and account balance (same value) + expect(screen.getAllByText('8,000.00')).toHaveLength(2) + }) + }) + + it('renders individual account balances', async () => { + mockGetAccountRollups.mockResolvedValue(makeResponse()) + render( + + ) + await waitFor(() => { + expect(screen.getByText('10,000.00')).toBeInTheDocument() + expect(screen.getByText('5,250.00')).toBeInTheDocument() + }) + }) + + it('renders classification badges', async () => { + mockGetAccountRollups.mockResolvedValue(makeResponse()) + render( + + ) + await waitFor(() => { + expect(screen.getByText('asset')).toBeInTheDocument() + expect(screen.getByText('revenue')).toBeInTheDocument() + }) + }) + + it('renders mapping summary with mapped and unmapped counts', async () => { + mockGetAccountRollups.mockResolvedValue(makeResponse()) + render( + + ) + await waitFor(() => { + expect(screen.getByText(/GAAP Mapping/)).toBeInTheDocument() + expect(screen.getByText(/3 mapped/)).toBeInTheDocument() + expect(screen.getByText(/2 unmapped/)).toBeInTheDocument() + }) + }) + + it('shows empty state when no groups', async () => { + mockGetAccountRollups.mockResolvedValue( + makeResponse({ groups: [], total_mapped: 0, total_unmapped: 0 }) + ) + render( + + ) + await waitFor(() => { + expect( + screen.getByText('No account rollups available.') + ).toBeInTheDocument() + }) + }) + + it('shows error state on API failure', async () => { + mockGetAccountRollups.mockRejectedValue(new Error('Network error')) + render( + + ) + await waitFor(() => { + expect( + screen.getByText('Failed to load account rollups.') + ).toBeInTheDocument() + }) + }) + + it('renders FactsTable in facts view mode', async () => { + mockGetAccountRollups.mockResolvedValue(makeResponse()) + render( + + ) + await waitFor(() => { + const factsTable = screen.getByTestId('facts-table') + expect(factsTable).toBeInTheDocument() + // Flattened: 3 accounts across 2 groups + expect(screen.getByText('BofA Checking')).toBeInTheDocument() + expect(screen.getByText('Savings Account')).toBeInTheDocument() + expect(screen.getByText('Sales Revenue')).toBeInTheDocument() + }) + }) + + it('calls getAccountRollups with correct params', async () => { + mockGetAccountRollups.mockResolvedValue( + makeResponse({ groups: [], total_mapped: 0, total_unmapped: 0 }) + ) + render( + + ) + await waitFor(() => { + expect(mockGetAccountRollups).toHaveBeenCalledWith('kg_mygraph', { + mappingId: 'struct_map_99', + }) + }) + }) + + it('formats negative balances with parentheses', async () => { + mockGetAccountRollups.mockResolvedValue( + makeResponse({ + groups: [ + { + reporting_element_id: 'elem_loss', + reporting_name: 'Net Loss', + reporting_qname: 'us-gaap:NetLoss', + classification: 'expense', + balance_type: 'debit', + total: -500.0, + accounts: [ + { + element_id: 'coa_loss', + account_name: 'Operating Loss', + account_code: '9000', + total_debits: 0, + total_credits: 500.0, + net_balance: -500.0, + }, + ], + }, + ], + }) + ) + render( + + ) + await waitFor(() => { + const cells = screen.getAllByText('(500.00)') + expect(cells.length).toBeGreaterThanOrEqual(1) + }) + }) +}) diff --git a/src/app/(app)/ledger/close/__tests__/FactsTable.test.tsx b/src/app/(app)/ledger/close/__tests__/FactsTable.test.tsx new file mode 100644 index 0000000..c346d9c --- /dev/null +++ b/src/app/(app)/ledger/close/__tests__/FactsTable.test.tsx @@ -0,0 +1,155 @@ +import { render, screen } from '@testing-library/react' +import { describe, expect, it, vi } from 'vitest' + +vi.mock('@/lib/core', () => ({ + customTheme: { table: {} }, +})) + +vi.mock('flowbite-react', () => ({ + Table: ({ children }: any) => {children}
, + TableBody: ({ children }: any) => {children}, + TableCell: ({ children, className }: any) => ( + {children} + ), + TableHead: ({ children }: any) => {children}, + TableHeadCell: ({ children }: any) => {children}, + TableRow: ({ children }: any) => {children}, +})) + +import type { FactRow } from '../components/FactsTable' +import FactsTable from '../components/FactsTable' + +describe('FactsTable', () => { + it('renders fact rows with element names', () => { + const facts: FactRow[] = [ + { + elementName: 'Revenue', + elementQname: 'us-gaap:Revenues', + periodStart: '2026-01-01', + periodEnd: '2026-03-31', + value: 8500.0, + unit: 'USD', + }, + { + elementName: 'Cost of Goods Sold', + elementQname: 'us-gaap:CostOfGoodsSold', + periodStart: '2026-01-01', + periodEnd: '2026-03-31', + value: 3400.0, + unit: 'USD', + }, + ] + render() + + expect(screen.getByText('Revenue')).toBeInTheDocument() + expect(screen.getByText('Cost of Goods Sold')).toBeInTheDocument() + }) + + it('renders element qnames', () => { + const facts: FactRow[] = [ + { + elementName: 'Revenue', + elementQname: 'us-gaap:Revenues', + periodStart: '2026-01-01', + periodEnd: null, + value: 8500.0, + }, + ] + render() + expect(screen.getByText('us-gaap:Revenues')).toBeInTheDocument() + }) + + it('formats period range', () => { + const facts: FactRow[] = [ + { + elementName: 'Revenue', + elementQname: 'us-gaap:Revenues', + periodStart: '2026-01-01', + periodEnd: '2026-03-31', + value: 8500.0, + }, + ] + render() + expect(screen.getByText(/Jan 1, 2026/)).toBeInTheDocument() + expect(screen.getByText(/Mar 31, 2026/)).toBeInTheDocument() + }) + + it('formats single-date period', () => { + const facts: FactRow[] = [ + { + elementName: 'Cash', + elementQname: 'us-gaap:Cash', + periodStart: '2026-03-31', + periodEnd: null, + value: 15000.0, + }, + ] + render() + expect(screen.getByText('Mar 31, 2026')).toBeInTheDocument() + }) + + it('formats numeric values with commas and decimals', () => { + const facts: FactRow[] = [ + { + elementName: 'Revenue', + elementQname: 'us-gaap:Revenues', + periodStart: '2026-01-01', + periodEnd: null, + value: 1234567.89, + }, + ] + render() + expect(screen.getByText('1,234,567.89')).toBeInTheDocument() + }) + + it('renders string values as-is', () => { + const facts: FactRow[] = [ + { + elementName: 'Note', + elementQname: 'us-gaap:Note', + periodStart: '2026-01-01', + periodEnd: null, + value: 'Some text block', + }, + ] + render() + expect(screen.getByText('Some text block')).toBeInTheDocument() + }) + + it('shows empty state when no facts', () => { + render() + expect(screen.getByText('No facts available.')).toBeInTheDocument() + }) + + it('defaults unit to USD when not provided', () => { + const facts: FactRow[] = [ + { + elementName: 'Revenue', + elementQname: 'us-gaap:Revenues', + periodStart: '2026-01-01', + periodEnd: null, + value: 100.0, + }, + ] + render() + expect(screen.getByText('USD')).toBeInTheDocument() + }) + + it('renders table headers', () => { + const facts: FactRow[] = [ + { + elementName: 'Revenue', + elementQname: 'us-gaap:Revenues', + periodStart: '2026-01-01', + periodEnd: null, + value: 100.0, + }, + ] + render() + expect(screen.getByText('Element')).toBeInTheDocument() + expect(screen.getByText('QName')).toBeInTheDocument() + expect(screen.getByText('Period')).toBeInTheDocument() + expect(screen.getByText('Value')).toBeInTheDocument() + expect(screen.getByText('Unit')).toBeInTheDocument() + }) +}) diff --git a/src/app/(app)/ledger/close/__tests__/StatementTable.test.tsx b/src/app/(app)/ledger/close/__tests__/StatementTable.test.tsx new file mode 100644 index 0000000..0f01e4a --- /dev/null +++ b/src/app/(app)/ledger/close/__tests__/StatementTable.test.tsx @@ -0,0 +1,226 @@ +import { render, screen } from '@testing-library/react' +import { describe, expect, it, vi } from 'vitest' + +vi.mock('@/lib/core', () => ({ + customTheme: { table: {} }, +})) + +vi.mock('flowbite-react', () => ({ + Table: ({ children }: any) => {children}
, + TableBody: ({ children }: any) => {children}, + TableCell: ({ children, className, style }: any) => ( + + {children} + + ), + TableHead: ({ children }: any) => {children}, + TableHeadCell: ({ children, className }: any) => ( + {children} + ), + TableRow: ({ children, className }: any) => ( + {children} + ), +})) + +import type { StatementData } from '@robosystems/client/extensions' +import StatementTable from '../components/StatementTable' + +const makeStatement = (overrides?: Partial): StatementData => ({ + reportId: 'rpt_01', + structureId: 'struct_01', + structureName: 'Income Statement', + structureType: 'income_statement', + periods: [{ start: '2026-01-01', end: '2026-03-31', label: 'Q1 2026' }], + rows: [ + { + elementId: 'elem_rev', + elementQname: 'us-gaap:Revenues', + elementName: 'Revenue', + values: [8500.0], + isSubtotal: false, + depth: 0, + }, + { + elementId: 'elem_cogs', + elementQname: 'us-gaap:CostOfGoodsSold', + elementName: 'Cost of Goods Sold', + values: [-3400.0], + isSubtotal: false, + depth: 0, + }, + { + elementId: 'elem_gp', + elementQname: 'us-gaap:GrossProfit', + elementName: 'Gross Profit', + values: [5100.0], + isSubtotal: true, + depth: 0, + }, + ], + validation: null, + unmappedCount: 0, + ...overrides, +}) + +describe('StatementTable', () => { + it('renders entity name when provided', () => { + render( + + ) + expect(screen.getByText('Harbinger Consultants LLC')).toBeInTheDocument() + }) + + it('renders structure name', () => { + render() + expect(screen.getByText('Income Statement')).toBeInTheDocument() + }) + + it('renders period headers', () => { + render() + expect(screen.getByText('Q1 2026')).toBeInTheDocument() + }) + + it('renders element names', () => { + render() + expect(screen.getByText('Revenue')).toBeInTheDocument() + expect(screen.getByText('Cost of Goods Sold')).toBeInTheDocument() + expect(screen.getByText('Gross Profit')).toBeInTheDocument() + }) + + it('formats positive values without parentheses', () => { + render() + expect(screen.getByText('8,500.00')).toBeInTheDocument() + }) + + it('formats negative values with parentheses', () => { + render() + expect(screen.getByText('(3,400.00)')).toBeInTheDocument() + }) + + it('applies bold styling to subtotal rows', () => { + render() + const grossProfitRow = screen.getByText('Gross Profit').closest('tr') + expect(grossProfitRow?.className).toContain('bg-gray-50') + }) + + it('applies depth-based indentation', () => { + const data = makeStatement({ + rows: [ + { + elementId: 'elem_parent', + elementQname: 'us-gaap:OpEx', + elementName: 'Operating Expenses', + values: [1000.0], + isSubtotal: false, + depth: 0, + }, + { + elementId: 'elem_child', + elementQname: 'us-gaap:SGA', + elementName: 'SG&A', + values: [500.0], + isSubtotal: false, + depth: 1, + }, + { + elementId: 'elem_grandchild', + elementQname: 'us-gaap:Rent', + elementName: 'Rent Expense', + values: [250.0], + isSubtotal: false, + depth: 2, + }, + ], + }) + render() + + const parent = screen.getByText('Operating Expenses').closest('td') + const child = screen.getByText('SG&A').closest('td') + const grandchild = screen.getByText('Rent Expense').closest('td') + + // depth * 24 + 16 + expect(parent?.style.paddingLeft).toBe('16px') + expect(child?.style.paddingLeft).toBe('40px') + expect(grandchild?.style.paddingLeft).toBe('64px') + }) + + it('renders multi-period columns', () => { + const data = makeStatement({ + periods: [ + { start: '2026-01-01', end: '2026-01-31', label: 'Jan 2026' }, + { start: '2026-02-01', end: '2026-02-28', label: 'Feb 2026' }, + { start: '2026-03-01', end: '2026-03-31', label: 'Mar 2026' }, + ], + rows: [ + { + elementId: 'elem_rev', + elementQname: 'us-gaap:Revenues', + elementName: 'Revenue', + values: [8000.0, 8200.0, 8500.0], + isSubtotal: false, + depth: 0, + }, + ], + }) + render() + + expect(screen.getByText('Jan 2026')).toBeInTheDocument() + expect(screen.getByText('Feb 2026')).toBeInTheDocument() + expect(screen.getByText('Mar 2026')).toBeInTheDocument() + expect(screen.getByText('8,000.00')).toBeInTheDocument() + expect(screen.getByText('8,200.00')).toBeInTheDocument() + expect(screen.getByText('8,500.00')).toBeInTheDocument() + }) + + it('renders dash for null values', () => { + const data = makeStatement({ + rows: [ + { + elementId: 'elem_rev', + elementQname: 'us-gaap:Revenues', + elementName: 'Revenue', + values: [null], + isSubtotal: false, + depth: 0, + }, + ], + }) + render() + expect(screen.getByText('—')).toBeInTheDocument() + }) + + it('applies muted styling to all-zero non-subtotal rows', () => { + const data = makeStatement({ + rows: [ + { + elementId: 'elem_zero', + elementQname: 'us-gaap:Zero', + elementName: 'Zero Line', + values: [0], + isSubtotal: false, + depth: 0, + }, + ], + }) + render() + const cell = screen.getByText('Zero Line').closest('td') + expect(cell?.className).toContain('text-gray-400') + }) + + it('does not show entity name header when not provided', () => { + render() + expect( + screen.queryByText('Harbinger Consultants LLC') + ).not.toBeInTheDocument() + }) + + it('applies double underline to top-level subtotals', () => { + render() + // Gross Profit is depth 0, isSubtotal true → gets border-double + const gpValueCell = screen.getByText('5,100.00').closest('td') + expect(gpValueCell?.className).toContain('border-double') + }) +}) diff --git a/src/app/(app)/ledger/close/__tests__/StructureSidebar.test.tsx b/src/app/(app)/ledger/close/__tests__/StructureSidebar.test.tsx new file mode 100644 index 0000000..d1d6f79 --- /dev/null +++ b/src/app/(app)/ledger/close/__tests__/StructureSidebar.test.tsx @@ -0,0 +1,282 @@ +import { fireEvent, render, screen } from '@testing-library/react' +import { describe, expect, it, vi } from 'vitest' + +vi.mock('flowbite-react', () => ({ + Button: ({ children, onClick }: any) => ( + + ), + Spinner: () =>
, +})) + +vi.mock('react-icons/hi', () => ({ + HiChevronLeft: () => , + HiChevronRight: () => , +})) + +import type { ClosingBookCategory } from '@robosystems/client' +import type { SelectedItem } from '../components/StructureSidebar' +import StructureSidebar from '../components/StructureSidebar' + +const makeCategories = (): ClosingBookCategory[] => [ + { + label: 'Statements', + items: [ + { + id: 'struct_is', + name: 'Income Statement', + item_type: 'statement', + structure_type: 'income_statement', + report_id: 'rpt_01', + }, + { + id: 'struct_bs', + name: 'Balance Sheet', + item_type: 'statement', + structure_type: 'balance_sheet', + report_id: 'rpt_01', + }, + ], + }, + { + label: 'Account Rollups', + items: [ + { + id: 'struct_map_01', + name: 'GAAP Mapping', + item_type: 'account_rollups', + }, + ], + }, + { + label: 'Schedules', + items: [ + { + id: 'struct_depr', + name: 'Office Furniture Depreciation', + item_type: 'schedule', + structure_type: 'schedule', + }, + ], + }, + { + label: 'Period Close', + items: [ + { + id: 'period_close', + name: 'Current Period Status', + item_type: 'period_close', + }, + ], + }, +] + +describe('StructureSidebar', () => { + it('renders all category labels', () => { + render( + + ) + expect(screen.getByText('Statements')).toBeInTheDocument() + expect(screen.getByText('Account Rollups')).toBeInTheDocument() + expect(screen.getByText('Schedules')).toBeInTheDocument() + expect(screen.getByText('Period Close')).toBeInTheDocument() + }) + + it('renders all item names', () => { + render( + + ) + expect(screen.getByText('Income Statement')).toBeInTheDocument() + expect(screen.getByText('Balance Sheet')).toBeInTheDocument() + expect(screen.getByText('GAAP Mapping')).toBeInTheDocument() + expect( + screen.getByText('Office Furniture Depreciation') + ).toBeInTheDocument() + expect(screen.getByText('Current Period Status')).toBeInTheDocument() + }) + + it('shows spinner when loading', () => { + render( + + ) + expect(screen.getByTestId('spinner')).toBeInTheDocument() + }) + + it('highlights active statement item', () => { + const selected: SelectedItem = { + type: 'statement', + reportId: 'rpt_01', + structureType: 'income_statement', + label: 'Income Statement', + } + render( + + ) + const isButton = screen.getByText('Income Statement').closest('button') + expect(isButton?.className).toContain('border-blue-500') + // Balance Sheet should NOT be highlighted + const bsButton = screen.getByText('Balance Sheet').closest('button') + expect(bsButton?.className).toContain('border-transparent') + }) + + it('highlights active schedule item', () => { + const selected: SelectedItem = { + type: 'schedule', + structureId: 'struct_depr', + name: 'Office Furniture Depreciation', + } + render( + + ) + const btn = screen + .getByText('Office Furniture Depreciation') + .closest('button') + expect(btn?.className).toContain('border-blue-500') + }) + + it('highlights active account rollups item', () => { + const selected: SelectedItem = { + type: 'account_rollups', + mappingId: 'struct_map_01', + name: 'GAAP Mapping', + } + render( + + ) + const btn = screen.getByText('GAAP Mapping').closest('button') + expect(btn?.className).toContain('border-blue-500') + }) + + it('calls onSelect with correct SelectedItem when clicking a statement', () => { + const onSelect = vi.fn() + render( + + ) + fireEvent.click(screen.getByText('Balance Sheet')) + expect(onSelect).toHaveBeenCalledWith({ + type: 'statement', + reportId: 'rpt_01', + structureType: 'balance_sheet', + label: 'Balance Sheet', + }) + }) + + it('calls onSelect with correct SelectedItem when clicking a schedule', () => { + const onSelect = vi.fn() + render( + + ) + fireEvent.click(screen.getByText('Office Furniture Depreciation')) + expect(onSelect).toHaveBeenCalledWith({ + type: 'schedule', + structureId: 'struct_depr', + name: 'Office Furniture Depreciation', + }) + }) + + it('calls onSelect with correct SelectedItem when clicking period close', () => { + const onSelect = vi.fn() + render( + + ) + fireEvent.click(screen.getByText('Current Period Status')) + expect(onSelect).toHaveBeenCalledWith({ + type: 'period_close', + }) + }) + + it('collapses and expands the sidebar', () => { + render( + + ) + // Initially expanded — items visible + expect(screen.getByText('Income Statement')).toBeInTheDocument() + + // Click collapse + const collapseBtn = screen.getByTestId('icon-collapse').closest('button') + fireEvent.click(collapseBtn!) + + // Items should be gone + expect(screen.queryByText('Income Statement')).not.toBeInTheDocument() + + // Click expand + const expandBtn = screen.getByTestId('icon-expand').closest('button') + fireEvent.click(expandBtn!) + + // Items visible again + expect(screen.getByText('Income Statement')).toBeInTheDocument() + }) + + it('renders empty categories list without crashing', () => { + render( + + ) + expect(screen.getByText('Closing Book')).toBeInTheDocument() + }) + + it('renders the Closing Book header', () => { + render( + + ) + expect(screen.getByText('Closing Book')).toBeInTheDocument() + }) +}) diff --git a/src/app/(app)/ledger/close/__tests__/ViewModeToggle.test.tsx b/src/app/(app)/ledger/close/__tests__/ViewModeToggle.test.tsx new file mode 100644 index 0000000..207e20d --- /dev/null +++ b/src/app/(app)/ledger/close/__tests__/ViewModeToggle.test.tsx @@ -0,0 +1,59 @@ +import { fireEvent, render, screen } from '@testing-library/react' +import { describe, expect, it, vi } from 'vitest' + +vi.mock('@/lib/core', () => ({ + customTheme: { button: {} }, +})) + +vi.mock('flowbite-react', () => ({ + Button: ({ children, onClick, color }: any) => ( + + ), +})) + +vi.mock('react-icons/hi', () => ({ + HiEye: () => , + HiTable: () => , +})) + +import ViewModeToggle from '../components/ViewModeToggle' + +describe('ViewModeToggle', () => { + it('renders both buttons', () => { + render() + expect(screen.getByText('Rendered')).toBeInTheDocument() + expect(screen.getByText('Facts')).toBeInTheDocument() + }) + + it('highlights rendered when active', () => { + render() + const renderedBtn = screen.getByText('Rendered').closest('button') + const factsBtn = screen.getByText('Facts').closest('button') + expect(renderedBtn?.dataset.color).toBe('primary') + expect(factsBtn?.dataset.color).toBe('light') + }) + + it('highlights facts when active', () => { + render() + const renderedBtn = screen.getByText('Rendered').closest('button') + const factsBtn = screen.getByText('Facts').closest('button') + expect(renderedBtn?.dataset.color).toBe('light') + expect(factsBtn?.dataset.color).toBe('primary') + }) + + it('calls onChange with "rendered" when clicking Rendered', () => { + const onChange = vi.fn() + render() + fireEvent.click(screen.getByText('Rendered')) + expect(onChange).toHaveBeenCalledWith('rendered') + }) + + it('calls onChange with "facts" when clicking Facts', () => { + const onChange = vi.fn() + render() + fireEvent.click(screen.getByText('Facts')) + expect(onChange).toHaveBeenCalledWith('facts') + }) +}) diff --git a/src/app/(app)/ledger/close/__tests__/content.test.tsx b/src/app/(app)/ledger/close/__tests__/content.test.tsx new file mode 100644 index 0000000..3c4aa17 --- /dev/null +++ b/src/app/(app)/ledger/close/__tests__/content.test.tsx @@ -0,0 +1,302 @@ +import { render, screen, waitFor } from '@testing-library/react' +import { describe, expect, it, vi } from 'vitest' + +const mockGetClosingBookStructures = vi.fn() +const mockGetEntity = vi.fn() +const mockUseGraphContext = vi.fn() + +vi.mock('@/lib/core', () => ({ + customTheme: { card: {} }, + extensions: { + ledger: { + getClosingBookStructures: (...args: any[]) => + mockGetClosingBookStructures(...args), + getEntity: (...args: any[]) => mockGetEntity(...args), + }, + }, + GraphFilters: { + roboledger: (graph: any) => + graph.graphType === 'entity' && + graph.schemaExtensions?.includes('roboledger'), + }, + PageLayout: ({ children }: { children: React.ReactNode }) => ( +
{children}
+ ), + useGraphContext: () => mockUseGraphContext(), +})) + +vi.mock('@/components/PageHeader', () => ({ + PageHeader: ({ title, actions }: any) => ( +
+ {title} + {actions} +
+ ), +})) + +vi.mock('flowbite-react', () => ({ + Card: ({ children }: any) =>
{children}
, + Spinner: () =>
, +})) + +vi.mock('react-icons/hi', () => ({ + HiExclamationCircle: () => , +})) + +vi.mock('react-icons/tb', () => ({ + TbBook2: () => , +})) + +// Mock all child panels to isolate orchestrator logic +vi.mock('../components/StructureSidebar', () => ({ + default: ({ categories, selectedItem }: any) => ( +
+ {categories?.map((c: any) => ( +
+ {c.label}: {c.items.length} items +
+ ))} + {selectedItem &&
{selectedItem.type}
} +
+ ), + itemToSelected: (item: any) => { + switch (item.item_type) { + case 'statement': + return { + type: 'statement', + reportId: item.report_id || '', + structureType: item.structure_type || '', + label: item.name, + } + case 'schedule': + return { type: 'schedule', structureId: item.id, name: item.name } + case 'account_rollups': + return { + type: 'account_rollups', + mappingId: item.id, + name: item.name, + } + case 'period_close': + return { type: 'period_close' } + default: + return { type: 'period_close' } + } + }, +})) + +vi.mock('../components/StatementPanel', () => ({ + default: ({ structureType }: any) => ( +
{structureType}
+ ), +})) + +vi.mock('../components/SchedulePanel', () => ({ + default: ({ scheduleName }: any) => ( +
{scheduleName}
+ ), +})) + +vi.mock('../components/AccountRollupsPanel', () => ({ + default: ({ mappingId }: any) => ( +
{mappingId}
+ ), +})) + +vi.mock('../components/PeriodClosePanel', () => ({ + default: () =>
, +})) + +vi.mock('../components/ViewModeToggle', () => ({ + default: () =>
, +})) + +import CloseContent from '../content' + +const makeGraph = (id: string) => ({ + graphId: id, + graphName: 'Test Graph', + graphType: 'entity' as const, + schemaExtensions: ['roboledger'], + isSubgraph: false, + isRepository: false, + createdAt: '2025-01-01T00:00:00Z', +}) + +const makeGraphState = ( + graphs: any[] = [], + currentId: string | null = null +) => ({ + state: { + graphs, + currentGraphId: currentId, + isLoading: false, + error: null, + }, +}) + +describe('CloseContent', () => { + it('shows "No Ledger Found" when no qualifying graph', () => { + mockUseGraphContext.mockReturnValue(makeGraphState()) + render() + expect(screen.getByText('No Ledger Found')).toBeInTheDocument() + }) + + it('shows spinner while loading sidebar data', () => { + const graph = makeGraph('kg_test') + mockUseGraphContext.mockReturnValue(makeGraphState([graph], 'kg_test')) + mockGetClosingBookStructures.mockReturnValue(new Promise(() => {})) + mockGetEntity.mockReturnValue(new Promise(() => {})) + + render() + expect(screen.getByTestId('spinner')).toBeInTheDocument() + }) + + it('renders sidebar with categories after loading', async () => { + const graph = makeGraph('kg_test') + mockUseGraphContext.mockReturnValue(makeGraphState([graph], 'kg_test')) + mockGetClosingBookStructures.mockResolvedValue({ + categories: [ + { + label: 'Statements', + items: [ + { + id: 'struct_is', + name: 'Income Statement', + item_type: 'statement', + structure_type: 'income_statement', + report_id: 'rpt_01', + }, + ], + }, + { + label: 'Period Close', + items: [ + { id: 'pc', name: 'Current Period', item_type: 'period_close' }, + ], + }, + ], + has_data: true, + }) + mockGetEntity.mockResolvedValue({ name: 'Harbinger LLC' }) + + render() + + await waitFor(() => { + expect(screen.getByTestId('sidebar')).toBeInTheDocument() + expect(screen.getByTestId('category-Statements')).toBeInTheDocument() + expect(screen.getByText('Statements: 1 items')).toBeInTheDocument() + }) + }) + + it('auto-selects first statement item', async () => { + const graph = makeGraph('kg_test') + mockUseGraphContext.mockReturnValue(makeGraphState([graph], 'kg_test')) + mockGetClosingBookStructures.mockResolvedValue({ + categories: [ + { + label: 'Statements', + items: [ + { + id: 'struct_is', + name: 'Income Statement', + item_type: 'statement', + structure_type: 'income_statement', + report_id: 'rpt_01', + }, + ], + }, + ], + has_data: true, + }) + mockGetEntity.mockResolvedValue(null) + + render() + + await waitFor(() => { + expect(screen.getByTestId('statement-panel')).toBeInTheDocument() + expect(screen.getByText('income_statement')).toBeInTheDocument() + }) + }) + + it('falls back to period_close when no categories have items', async () => { + const graph = makeGraph('kg_test') + mockUseGraphContext.mockReturnValue(makeGraphState([graph], 'kg_test')) + mockGetClosingBookStructures.mockResolvedValue({ + categories: [], + has_data: false, + }) + mockGetEntity.mockResolvedValue(null) + + render() + + await waitFor(() => { + expect(screen.getByTestId('period-close-panel')).toBeInTheDocument() + }) + }) + + it('shows error message on API failure', async () => { + const graph = makeGraph('kg_test') + mockUseGraphContext.mockReturnValue(makeGraphState([graph], 'kg_test')) + mockGetClosingBookStructures.mockRejectedValue(new Error('Server error')) + mockGetEntity.mockRejectedValue(new Error('Server error')) + + render() + + await waitFor(() => { + expect( + screen.getByText('Failed to load closing book data.') + ).toBeInTheDocument() + }) + }) + + it('renders page header with Closing Book title', async () => { + const graph = makeGraph('kg_test') + mockUseGraphContext.mockReturnValue(makeGraphState([graph], 'kg_test')) + mockGetClosingBookStructures.mockResolvedValue({ + categories: [], + has_data: false, + }) + mockGetEntity.mockResolvedValue(null) + + render() + + await waitFor(() => { + expect(screen.getByText('Closing Book')).toBeInTheDocument() + }) + }) + + it('renders view mode toggle', async () => { + const graph = makeGraph('kg_test') + mockUseGraphContext.mockReturnValue(makeGraphState([graph], 'kg_test')) + mockGetClosingBookStructures.mockResolvedValue({ + categories: [], + has_data: false, + }) + mockGetEntity.mockResolvedValue(null) + + render() + + await waitFor(() => { + expect(screen.getByTestId('view-mode-toggle')).toBeInTheDocument() + }) + }) + + it('calls API with correct graph ID', async () => { + const graph = makeGraph('kg_mygraph123') + mockUseGraphContext.mockReturnValue( + makeGraphState([graph], 'kg_mygraph123') + ) + mockGetClosingBookStructures.mockResolvedValue({ + categories: [], + has_data: false, + }) + mockGetEntity.mockResolvedValue(null) + + render() + + await waitFor(() => { + expect(mockGetClosingBookStructures).toHaveBeenCalledWith('kg_mygraph123') + expect(mockGetEntity).toHaveBeenCalledWith('kg_mygraph123') + }) + }) +}) diff --git a/src/app/(app)/ledger/close/components/AccountRollupsPanel.tsx b/src/app/(app)/ledger/close/components/AccountRollupsPanel.tsx new file mode 100644 index 0000000..7fd3f87 --- /dev/null +++ b/src/app/(app)/ledger/close/components/AccountRollupsPanel.tsx @@ -0,0 +1,183 @@ +'use client' + +import { customTheme, extensions } from '@/lib/core' +import type { AccountRollupsResponse } from '@robosystems/client' +import { + Badge, + Spinner, + Table, + TableBody, + TableCell, + TableHead, + TableHeadCell, + TableRow, +} from 'flowbite-react' +import { Fragment, useCallback, useEffect, useState, type FC } from 'react' +import { HiExclamationCircle } from 'react-icons/hi' +import type { FactRow } from './FactsTable' +import FactsTable from './FactsTable' +import type { ViewMode } from './ViewModeToggle' + +const formatCurrency = (value: number): string => { + const abs = Math.abs(value) + const formatted = abs.toLocaleString('en-US', { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }) + return value < 0 ? `(${formatted})` : formatted +} + +interface AccountRollupsPanelProps { + graphId: string + mappingId: string + viewMode: ViewMode +} + +const AccountRollupsPanel: FC = ({ + graphId, + mappingId, + viewMode, +}) => { + const [data, setData] = useState(null) + const [isLoading, setIsLoading] = useState(true) + const [error, setError] = useState(null) + + const loadData = useCallback(async () => { + try { + setIsLoading(true) + setError(null) + const response = await extensions.ledger.getAccountRollups(graphId, { + mappingId, + }) + setData(response) + } catch (err) { + console.error('Error loading account rollups:', err) + setError('Failed to load account rollups.') + } finally { + setIsLoading(false) + } + }, [graphId, mappingId]) + + useEffect(() => { + loadData() + }, [loadData]) + + if (isLoading) { + return ( +
+ +
+ ) + } + + if (error) { + return ( +
+ + {error} +
+ ) + } + + if (!data || data.groups.length === 0) { + return ( +
+

No account rollups available.

+

+ Map your Chart of Accounts to US GAAP elements to see rollups here. +

+
+ ) + } + + // Facts view — flat table of all mapped balances + if (viewMode === 'facts') { + const facts: FactRow[] = [] + for (const group of data.groups) { + for (const account of group.accounts) { + facts.push({ + elementName: account.account_name, + elementQname: `→ ${group.reporting_qname}`, + periodStart: 'Current', + periodEnd: null, + value: account.net_balance, + unit: 'USD', + }) + } + } + return + } + + // Rendered view — rollup hierarchy + return ( +
+
+

+ Account Rollups +

+

+ {data.mapping_name} — {data.total_mapped} mapped + {data.total_unmapped > 0 && `, ${data.total_unmapped} unmapped`} +

+
+ +
+ + + Account + Balance + + + {data.groups.map((group) => ( + + {/* Reporting element header */} + + + {group.reporting_name} + + {group.classification} + + + + {formatCurrency(group.total)} + + + + {/* CoA account detail rows */} + {group.accounts.map((account) => ( + + + {account.account_code && ( + + {account.account_code} + + )} + {account.account_name} + + + {formatCurrency(account.net_balance)} + + + ))} + + ))} + +
+
+
+ ) +} + +export default AccountRollupsPanel diff --git a/src/app/(app)/ledger/close/components/FactsTable.tsx b/src/app/(app)/ledger/close/components/FactsTable.tsx new file mode 100644 index 0000000..90afa1c --- /dev/null +++ b/src/app/(app)/ledger/close/components/FactsTable.tsx @@ -0,0 +1,93 @@ +'use client' + +import { customTheme } from '@/lib/core' +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeadCell, + TableRow, +} from 'flowbite-react' +import type { FC } from 'react' + +export interface FactRow { + elementName: string + elementQname: string + periodStart: string + periodEnd: string | null + value: number | string + unit?: string | null +} + +const formatPeriod = (start: string, end: string | null): string => { + const fmt = (d: string) => { + const date = new Date(d + 'T00:00:00') + return date.toLocaleDateString('en-US', { + year: 'numeric', + month: 'short', + day: 'numeric', + }) + } + if (!end || start === end) return fmt(start) + return `${fmt(start)} — ${fmt(end)}` +} + +const formatValue = (value: number | string): string => { + if (typeof value === 'string') return value + return value.toLocaleString('en-US', { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }) +} + +interface FactsTableProps { + facts: FactRow[] +} + +const FactsTable: FC = ({ facts }) => { + if (facts.length === 0) { + return ( +
+ No facts available. +
+ ) + } + + return ( +
+ + + Element + QName + Period + Value + Unit + + + {facts.map((fact, idx) => ( + + + {fact.elementName} + + + {fact.elementQname} + + + {formatPeriod(fact.periodStart, fact.periodEnd)} + + + {formatValue(fact.value)} + + + {fact.unit || 'USD'} + + + ))} + +
+
+ ) +} + +export default FactsTable diff --git a/src/app/(app)/ledger/close/components/PeriodClosePanel.tsx b/src/app/(app)/ledger/close/components/PeriodClosePanel.tsx new file mode 100644 index 0000000..febd49f --- /dev/null +++ b/src/app/(app)/ledger/close/components/PeriodClosePanel.tsx @@ -0,0 +1,232 @@ +'use client' + +import { customTheme, extensions } from '@/lib/core' +import type { PeriodCloseStatus } from '@robosystems/client/extensions' +import { + Badge, + Button, + Spinner, + Table, + TableBody, + TableCell, + TableHead, + TableHeadCell, + TableRow, +} from 'flowbite-react' +import type { FC } from 'react' +import { useCallback, useEffect, useState } from 'react' +import { HiCheck, HiClock, HiExclamationCircle } from 'react-icons/hi' +import { TbFileInvoice } from 'react-icons/tb' + +const STATUS_COLORS: Record = { + posted: 'success', + draft: 'warning', + pending: 'gray', + reversed: 'failure', +} + +const formatCurrencyDollars = (amount: number): string => { + return new Intl.NumberFormat('en-US', { + style: 'currency', + currency: 'USD', + }).format(amount) +} + +interface PeriodClosePanelProps { + graphId: string + onEntryCreated?: () => void +} + +const PeriodClosePanel: FC = ({ + graphId, + onEntryCreated, +}) => { + const [closeStatus, setCloseStatus] = useState(null) + const [isLoading, setIsLoading] = useState(false) + const [error, setError] = useState(null) + const [creatingEntry, setCreatingEntry] = useState(null) + + // Default to current month + const now = new Date() + const defaultStart = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-01` + const lastDay = new Date(now.getFullYear(), now.getMonth() + 1, 0).getDate() + const defaultEnd = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${lastDay}` + + const [periodStart, setPeriodStart] = useState(defaultStart) + const [periodEnd, setPeriodEnd] = useState(defaultEnd) + + const loadCloseStatus = useCallback(async () => { + try { + setIsLoading(true) + setError(null) + const status = await extensions.ledger.getPeriodCloseStatus( + graphId, + periodStart, + periodEnd + ) + setCloseStatus(status) + } catch (err) { + console.error('Error loading close status:', err) + setError('Failed to load period close status.') + } finally { + setIsLoading(false) + } + }, [graphId, periodStart, periodEnd]) + + useEffect(() => { + if (graphId) { + loadCloseStatus() + } + }, [graphId, loadCloseStatus]) + + const handleCreateEntry = async (structureId: string) => { + try { + setCreatingEntry(structureId) + await extensions.ledger.createClosingEntry( + graphId, + structureId, + periodEnd, + periodStart, + periodEnd + ) + onEntryCreated?.() + await loadCloseStatus() + } catch (err) { + console.error('Error creating closing entry:', err) + setError('Failed to create closing entry.') + } finally { + setCreatingEntry(null) + } + } + + if (isLoading) { + return ( +
+ +
+ ) + } + + if (error) { + return ( +
+ + {error} +
+ ) + } + + return ( +
+ {/* Period selector */} +
+
+
+ + setPeriodStart(e.target.value)} + className="rounded-lg border border-gray-300 bg-gray-50 px-3 py-1.5 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-white" + /> + to + setPeriodEnd(e.target.value)} + className="rounded-lg border border-gray-300 bg-gray-50 px-3 py-1.5 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-white" + /> +
+ {closeStatus && ( + + {closeStatus.periodStatus} + + )} +
+
+ + {/* Schedule status table */} + {!closeStatus || closeStatus.schedules.length === 0 ? ( +
+ No schedules found for this period. +
+ ) : ( + <> + + + Schedule + Amount + Status + + + + {closeStatus.schedules.map((item) => ( + + + {item.structureName} + + {formatCurrencyDollars(item.amount)} + + + {item.status} + + + + {item.status === 'pending' && ( + + )} + {item.status === 'draft' && ( + + + Draft created + + )} + {item.status === 'posted' && ( + + + Posted + + )} + + + ))} + +
+ +
+ Draft: {closeStatus.totalDraft} + Posted: {closeStatus.totalPosted} +
+ + )} +
+ ) +} + +export default PeriodClosePanel diff --git a/src/app/(app)/ledger/close/components/SchedulePanel.tsx b/src/app/(app)/ledger/close/components/SchedulePanel.tsx new file mode 100644 index 0000000..199a4d1 --- /dev/null +++ b/src/app/(app)/ledger/close/components/SchedulePanel.tsx @@ -0,0 +1,216 @@ +'use client' + +import { customTheme, extensions } from '@/lib/core' +import type { ScheduleFact } from '@robosystems/client/extensions' +import { + Button, + Spinner, + Table, + TableBody, + TableCell, + TableHead, + TableHeadCell, + TableRow, +} from 'flowbite-react' +import type { FC } from 'react' +import { useCallback, useEffect, useMemo, useState } from 'react' +import { HiExclamationCircle } from 'react-icons/hi' +import { TbFileInvoice } from 'react-icons/tb' +import type { FactRow } from './FactsTable' +import FactsTable from './FactsTable' +import type { ViewMode } from './ViewModeToggle' + +const formatCurrency = (amount: number): string => { + return new Intl.NumberFormat('en-US', { + style: 'currency', + currency: 'USD', + }).format(amount) +} + +const formatMonth = (dateString: string): string => { + const date = new Date(dateString + 'T00:00:00') + return date.toLocaleDateString('en-US', { + year: 'numeric', + month: 'short', + }) +} + +interface SchedulePanelProps { + graphId: string + structureId: string + scheduleName: string + viewMode: ViewMode +} + +const SchedulePanel: FC = ({ + graphId, + structureId, + scheduleName, + viewMode, +}) => { + const [facts, setFacts] = useState([]) + const [isLoading, setIsLoading] = useState(true) + const [error, setError] = useState(null) + const [creatingEntry, setCreatingEntry] = useState(false) + + const loadFacts = useCallback(async () => { + try { + setIsLoading(true) + setError(null) + const result = await extensions.ledger.getScheduleFacts( + graphId, + structureId + ) + setFacts(result) + } catch (err) { + console.error('Error loading schedule facts:', err) + setError('Failed to load schedule facts.') + } finally { + setIsLoading(false) + } + }, [graphId, structureId]) + + useEffect(() => { + loadFacts() + }, [loadFacts]) + + // Group facts by period + const groupedFacts = useMemo(() => { + const groups: Record = {} + for (const fact of facts) { + const key = `${fact.periodStart}_${fact.periodEnd}` + if (!groups[key]) groups[key] = [] + groups[key].push(fact) + } + return Object.entries(groups).sort(([a], [b]) => a.localeCompare(b)) + }, [facts]) + + const handleCreateEntry = async (periodEnd: string, periodStart: string) => { + try { + setCreatingEntry(true) + await extensions.ledger.createClosingEntry( + graphId, + structureId, + periodEnd, + periodStart, + periodEnd + ) + await loadFacts() + } catch (err) { + console.error('Error creating closing entry:', err) + setError('Failed to create closing entry.') + } finally { + setCreatingEntry(false) + } + } + + if (isLoading) { + return ( +
+ +
+ ) + } + + if (error) { + return ( +
+ + {error} +
+ ) + } + + if (facts.length === 0) { + return ( +
+ No facts found for this schedule. +
+ ) + } + + // Facts view + if (viewMode === 'facts') { + const factRows: FactRow[] = facts.map((f) => ({ + elementName: f.elementName, + elementQname: f.elementId, + periodStart: f.periodStart, + periodEnd: f.periodEnd, + value: f.value, + unit: 'USD', + })) + return + } + + // Rendered view — facts grouped by period + return ( +
+
+

+ {scheduleName} +

+

+ {groupedFacts.length} periods +

+
+ +
+ + + Period + Element + Amount + + + + {groupedFacts.map(([key, periodFacts]) => + periodFacts.map((fact, idx) => ( + + {idx === 0 && ( + + {formatMonth(fact.periodStart)} + + )} + + {fact.elementName} + + + {formatCurrency(fact.value)} + + {idx === 0 && ( + + + + )} + + )) + )} + +
+
+
+ ) +} + +export default SchedulePanel diff --git a/src/app/(app)/ledger/close/components/StatementPanel.tsx b/src/app/(app)/ledger/close/components/StatementPanel.tsx new file mode 100644 index 0000000..2fc75da --- /dev/null +++ b/src/app/(app)/ledger/close/components/StatementPanel.tsx @@ -0,0 +1,364 @@ +'use client' + +import { customTheme, extensions } from '@/lib/core' +import type { + PeriodSpecInput, + StatementData, +} from '@robosystems/client/extensions' +import { Badge, Button, Spinner } from 'flowbite-react' +import type { FC } from 'react' +import { useCallback, useEffect, useState } from 'react' +import { HiCheckCircle, HiExclamationCircle } from 'react-icons/hi' +import type { FactRow } from './FactsTable' +import FactsTable from './FactsTable' +import StatementTable from './StatementTable' +import type { ViewMode } from './ViewModeToggle' + +// ── Period Presets ──────────────────────────────────────────────────── + +type PresetKey = + | 'this_month' + | 'last_month' + | 'monthly_ytd' + | 'trailing_12' + | 'this_quarter' + | 'annual_yoy' + +interface PresetDef { + key: PresetKey + label: string +} + +const PRESETS: PresetDef[] = [ + { key: 'this_month', label: 'This Month' }, + { key: 'last_month', label: 'Last Month' }, + { key: 'monthly_ytd', label: 'Monthly YTD' }, + { key: 'trailing_12', label: 'Trailing 12' }, + { key: 'this_quarter', label: 'This Quarter' }, + { key: 'annual_yoy', label: 'Year / Year' }, +] + +const pad = (n: number): string => String(n).padStart(2, '0') +const lastDay = (y: number, m: number): number => + new Date(y, m + 1, 0).getDate() +const monthLabel = (y: number, m: number): string => + new Date(y, m, 1).toLocaleDateString('en-US', { + month: 'short', + year: 'numeric', + }) + +function buildPeriods(preset: PresetKey): { + periodStart: string + periodEnd: string + comparative: boolean + periods: PeriodSpecInput[] | undefined +} { + const now = new Date() + const year = now.getFullYear() + const month = now.getMonth() + + switch (preset) { + case 'this_month': { + const s = `${year}-${pad(month + 1)}-01` + const e = `${year}-${pad(month + 1)}-${lastDay(year, month)}` + return { + periodStart: s, + periodEnd: e, + comparative: false, + periods: undefined, + } + } + case 'last_month': { + const pm = month === 0 ? 11 : month - 1 + const py = month === 0 ? year - 1 : year + const s = `${py}-${pad(pm + 1)}-01` + const e = `${py}-${pad(pm + 1)}-${lastDay(py, pm)}` + return { + periodStart: s, + periodEnd: e, + comparative: true, + periods: undefined, + } + } + case 'monthly_ytd': { + const periods: PeriodSpecInput[] = [] + for (let m = 0; m <= month; m++) { + periods.push({ + start: `${year}-${pad(m + 1)}-01`, + end: `${year}-${pad(m + 1)}-${lastDay(year, m)}`, + label: monthLabel(year, m), + }) + } + return { + periodStart: periods[0].start, + periodEnd: periods[periods.length - 1].end, + comparative: false, + periods, + } + } + case 'trailing_12': { + const periods: PeriodSpecInput[] = [] + for (let i = 11; i >= 0; i--) { + const d = new Date(year, month - i, 1) + const y = d.getFullYear() + const m = d.getMonth() + periods.push({ + start: `${y}-${pad(m + 1)}-01`, + end: `${y}-${pad(m + 1)}-${lastDay(y, m)}`, + label: monthLabel(y, m), + }) + } + return { + periodStart: periods[0].start, + periodEnd: periods[periods.length - 1].end, + comparative: false, + periods, + } + } + case 'this_quarter': { + const q = Math.floor(month / 3) + const qs = q * 3 + const s = `${year}-${pad(qs + 1)}-01` + const e = `${year}-${pad(qs + 3)}-${lastDay(year, qs + 2)}` + return { + periodStart: s, + periodEnd: e, + comparative: false, + periods: undefined, + } + } + case 'annual_yoy': { + const periods: PeriodSpecInput[] = [ + { start: `${year}-01-01`, end: `${year}-12-31`, label: `FY ${year}` }, + { + start: `${year - 1}-01-01`, + end: `${year - 1}-12-31`, + label: `FY ${year - 1}`, + }, + ] + return { + periodStart: periods[0].start, + periodEnd: periods[0].end, + comparative: false, + periods, + } + } + } +} + +// ── Component ──────────────────────────────────────────────────────── + +interface StatementPanelProps { + graphId: string + reportId: string + structureType: string + viewMode: ViewMode + entityName: string | null + mappingId?: string | null +} + +const StatementPanel: FC = ({ + graphId, + reportId, + structureType, + viewMode, + entityName, + mappingId, +}) => { + const [statement, setStatement] = useState(null) + const [isLoading, setIsLoading] = useState(true) + const [isRegenerating, setIsRegenerating] = useState(false) + const [error, setError] = useState(null) + const [activeReportId, setActiveReportId] = useState(reportId) + const [selectedPreset, setSelectedPreset] = useState(null) + + const loadStatement = useCallback(async () => { + try { + setIsLoading(true) + setError(null) + const data = await extensions.reports.statement( + graphId, + activeReportId, + structureType + ) + setStatement(data) + } catch (err) { + console.error('Error loading statement:', err) + setError('Failed to load statement.') + } finally { + setIsLoading(false) + } + }, [graphId, activeReportId, structureType]) + + useEffect(() => { + setActiveReportId(reportId) + }, [reportId]) + + useEffect(() => { + loadStatement() + }, [loadStatement]) + + // Regenerate report with a different period preset + const handlePresetClick = useCallback( + async (preset: PresetKey) => { + if (!mappingId) return + + try { + setIsRegenerating(true) + setSelectedPreset(preset) + setError(null) + + const { periodStart, periodEnd, comparative, periods } = + buildPeriods(preset) + + const report = await extensions.reports.create(graphId, { + name: `${structureType === 'income_statement' ? 'Income Statement' : 'Balance Sheet'} — ${preset.replace(/_/g, ' ')}`, + mappingId, + periodStart, + periodEnd, + comparative, + periods, + }) + + setActiveReportId(report.id) + } catch (err) { + console.error('Error regenerating report:', err) + setError('Failed to regenerate report with new period.') + } finally { + setIsRegenerating(false) + } + }, + [graphId, mappingId, structureType] + ) + + if (isLoading && !isRegenerating) { + return ( +
+ +
+ ) + } + + if (error && !statement) { + return ( +
+ + {error} +
+ ) + } + + if (!statement || statement.rows.length === 0) { + return ( +
+ No data available for this structure. +
+ ) + } + + // Facts view — project statement rows as flat fact rows + if (viewMode === 'facts') { + const facts: FactRow[] = [] + for (const row of statement.rows) { + for (let i = 0; i < statement.periods.length; i++) { + const period = statement.periods[i] + const value = row.values[i] + if (value !== null && value !== undefined) { + facts.push({ + elementName: row.elementName, + elementQname: row.elementQname, + periodStart: period.start || '', + periodEnd: period.end || null, + value, + unit: 'USD', + }) + } + } + } + return + } + + // Rendered view + return ( + <> + {/* Period preset bar */} + {mappingId && ( +
+ + Period: + + {PRESETS.map((p) => ( + + ))} +
+ )} + + {isRegenerating ? ( +
+ + + Generating report... + +
+ ) : ( + <> + + + {/* Validation */} + {statement.validation && ( +
+
+ {statement.validation.passed ? ( + + + Validation Passed + + ) : ( + + + Validation Failed + + )} + {statement.validation.warnings.length > 0 && ( + + {statement.validation.warnings.length} warning + {statement.validation.warnings.length !== 1 ? 's' : ''} + + )} +
+ {statement.validation.failures.length > 0 && ( +
    + {statement.validation.failures.map((f, i) => ( +
  • {f}
  • + ))} +
+ )} +
+ )} + + {/* Unmapped count */} + {statement.unmappedCount > 0 && ( +
+ {statement.unmappedCount} unmapped CoA element + {statement.unmappedCount !== 1 ? 's' : ''} not included in report +
+ )} + + )} + + ) +} + +export default StatementPanel diff --git a/src/app/(app)/ledger/close/components/StatementTable.tsx b/src/app/(app)/ledger/close/components/StatementTable.tsx new file mode 100644 index 0000000..84cdafa --- /dev/null +++ b/src/app/(app)/ledger/close/components/StatementTable.tsx @@ -0,0 +1,123 @@ +'use client' + +import { customTheme } from '@/lib/core' +import type { + StatementData, + StatementRow, +} from '@robosystems/client/extensions' +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeadCell, + TableRow, +} from 'flowbite-react' +import type { FC } from 'react' + +const formatCurrency = (value: number): string => { + const abs = Math.abs(value) + const formatted = abs.toLocaleString('en-US', { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }) + return value < 0 ? `(${formatted})` : formatted +} + +const formatDate = (dateString: string | null): string => { + if (!dateString) return 'N/A' + const date = new Date(dateString + 'T00:00:00') + return date.toLocaleDateString('en-US', { + year: 'numeric', + month: 'short', + day: 'numeric', + }) +} + +interface StatementTableProps { + data: StatementData + entityName?: string | null +} + +const StatementTable: FC = ({ data, entityName }) => { + const periods = data.periods + + return ( +
+ {/* Formal financial statement header */} +
+ {entityName && ( +

+ {entityName} +

+ )} +

+ {data.structureName} +

+ {periods.length > 0 && periods[0].start && ( +

+ {periods.length === 1 + ? `For the Period Ended ${formatDate(periods[0].end)}` + : `${formatDate(periods[0].start)} — ${formatDate(periods[periods.length - 1].end)}`} +

+ )} +
+ + + + + {periods.map((period, i) => ( + + {period.label || + `${formatDate(period.start)} — ${formatDate(period.end)}`} + + ))} + + + {data.rows.map((row: StatementRow, idx: number) => { + const indent = row.depth * 24 + const isBold = row.isSubtotal + const isTopLevel = row.isSubtotal && row.depth === 0 + const allZero = row.values.every((v) => (v ?? 0) === 0) + + return ( + + + {row.elementName} + + {row.values.map((value, i) => ( + + {value !== null ? formatCurrency(value) : '—'} + + ))} + + ) + })} + +
+
+ ) +} + +export default StatementTable diff --git a/src/app/(app)/ledger/close/components/StructureSidebar.tsx b/src/app/(app)/ledger/close/components/StructureSidebar.tsx new file mode 100644 index 0000000..5117cc5 --- /dev/null +++ b/src/app/(app)/ledger/close/components/StructureSidebar.tsx @@ -0,0 +1,175 @@ +'use client' + +import type { ClosingBookCategory, ClosingBookItem } from '@robosystems/client' +import { Button, Spinner } from 'flowbite-react' +import type { FC } from 'react' +import { useState } from 'react' +import { HiChevronLeft, HiChevronRight } from 'react-icons/hi' + +// ── Types ────────────────────────────────────────────────────────────── + +export type SelectedItem = + | { + type: 'statement' + reportId: string + structureType: string + label: string + } + | { type: 'schedule'; structureId: string; name: string } + | { type: 'account_rollups'; mappingId: string; name: string } + | { type: 'trial_balance' } + | { type: 'period_close' } + +// ── Helpers ──────────────────────────────────────────────────────────── + +function itemToSelected(item: ClosingBookItem): SelectedItem { + switch (item.item_type) { + case 'statement': + return { + type: 'statement', + reportId: item.report_id || '', + structureType: item.structure_type || '', + label: item.name, + } + case 'schedule': + return { + type: 'schedule', + structureId: item.id, + name: item.name, + } + case 'account_rollups': + return { + type: 'account_rollups', + mappingId: item.id, + name: item.name, + } + case 'trial_balance': + return { type: 'trial_balance' } + case 'period_close': + return { type: 'period_close' } + default: + return { type: 'period_close' } + } +} + +function isActive( + selected: SelectedItem | null, + item: ClosingBookItem +): boolean { + if (!selected) return false + switch (selected.type) { + case 'statement': + return ( + item.item_type === 'statement' && + item.structure_type === selected.structureType + ) + case 'schedule': + return item.item_type === 'schedule' && item.id === selected.structureId + case 'account_rollups': + return ( + item.item_type === 'account_rollups' && item.id === selected.mappingId + ) + case 'trial_balance': + return item.item_type === 'trial_balance' + case 'period_close': + return item.item_type === 'period_close' + } +} + +// ── Component ────────────────────────────────────────────────────────── + +interface StructureSidebarProps { + categories: ClosingBookCategory[] + selectedItem: SelectedItem | null + onSelect: (item: SelectedItem) => void + isLoading: boolean +} + +const StructureSidebar: FC = ({ + categories, + selectedItem, + onSelect, + isLoading, +}) => { + const [collapsed, setCollapsed] = useState(false) + + if (collapsed) { + return ( +
+ +
+ ) + } + + return ( +
+ {/* Header */} +
+ + Closing Book + + +
+ + {/* Content */} +
+ {isLoading ? ( +
+ +
+ ) : ( + categories.map((cat) => ( +
+
+ + {cat.label} + +
+ {cat.items.map((item) => { + const active = isActive(selectedItem, item) + return ( + + ) + })} +
+ )) + )} +
+
+ ) +} + +export default StructureSidebar +export { itemToSelected } +export type { StructureSidebarProps } diff --git a/src/app/(app)/ledger/close/components/ViewModeToggle.tsx b/src/app/(app)/ledger/close/components/ViewModeToggle.tsx new file mode 100644 index 0000000..12a0200 --- /dev/null +++ b/src/app/(app)/ledger/close/components/ViewModeToggle.tsx @@ -0,0 +1,42 @@ +'use client' + +import { customTheme } from '@/lib/core' +import { Button } from 'flowbite-react' +import type { FC } from 'react' +import { HiEye, HiTable } from 'react-icons/hi' + +export type ViewMode = 'rendered' | 'facts' + +interface ViewModeToggleProps { + viewMode: ViewMode + onChange: (mode: ViewMode) => void +} + +const ViewModeToggle: FC = ({ viewMode, onChange }) => { + return ( +
+ + +
+ ) +} + +export default ViewModeToggle diff --git a/src/app/(app)/ledger/close/content.tsx b/src/app/(app)/ledger/close/content.tsx new file mode 100644 index 0000000..bfe0277 --- /dev/null +++ b/src/app/(app)/ledger/close/content.tsx @@ -0,0 +1,221 @@ +'use client' + +import { PageHeader } from '@/components/PageHeader' +import { + customTheme, + extensions, + GraphFilters, + PageLayout, + useGraphContext, +} from '@/lib/core' +import type { ClosingBookCategory } from '@robosystems/client' +import { Card, Spinner } from 'flowbite-react' +import type { FC } from 'react' +import { useCallback, useEffect, useMemo, useState } from 'react' +import { HiExclamationCircle } from 'react-icons/hi' +import { TbBook2 } from 'react-icons/tb' +import AccountRollupsPanel from './components/AccountRollupsPanel' +import PeriodClosePanel from './components/PeriodClosePanel' +import SchedulePanel from './components/SchedulePanel' +import StatementPanel from './components/StatementPanel' +import StructureSidebar, { + itemToSelected, + type SelectedItem, +} from './components/StructureSidebar' +import type { ViewMode } from './components/ViewModeToggle' +import ViewModeToggle from './components/ViewModeToggle' + +const CloseContent: FC = function () { + const { state: graphState } = useGraphContext() + + // Sidebar data — single API call returns all categories + const [categories, setCategories] = useState([]) + const [hasData, setHasData] = useState(false) + const [entityName, setEntityName] = useState(null) + const [mappingId, setMappingId] = useState(null) + const [isSidebarLoading, setIsSidebarLoading] = useState(true) + const [error, setError] = useState(null) + + // Selection state + const [selectedItem, setSelectedItem] = useState(null) + const [viewMode, setViewMode] = useState('rendered') + + // Current graph + const currentGraph = useMemo(() => { + const roboledgerGraphs = graphState.graphs.filter(GraphFilters.roboledger) + return ( + roboledgerGraphs.find((g) => g.graphId === graphState.currentGraphId) ?? + roboledgerGraphs[0] + ) + }, [graphState.graphs, graphState.currentGraphId]) + + // Load sidebar data — single call to closing book structures endpoint + const loadSidebarData = useCallback(async () => { + if (!currentGraph) { + setIsSidebarLoading(false) + return + } + + try { + setIsSidebarLoading(true) + setError(null) + + const [response, entity] = await Promise.all([ + extensions.ledger.getClosingBookStructures(currentGraph.graphId), + extensions.ledger.getEntity(currentGraph.graphId).catch(() => null), + ]) + + setCategories(response.categories) + setHasData(response.has_data) + setEntityName(entity?.name ?? null) + + // Extract mapping ID from account rollups category for report regeneration + const rollupsCategory = response.categories.find( + (c) => c.label === 'Account Rollups' + ) + if (rollupsCategory?.items?.[0]) { + setMappingId(rollupsCategory.items[0].id) + } + + // Auto-select first item from first category + const firstCategory = response.categories[0] + if (firstCategory?.items?.length > 0) { + setSelectedItem(itemToSelected(firstCategory.items[0])) + } else { + setSelectedItem({ type: 'period_close' }) + } + } catch (err) { + console.error('Error loading closing book data:', err) + setError('Failed to load closing book data.') + } finally { + setIsSidebarLoading(false) + } + }, [currentGraph]) + + useEffect(() => { + loadSidebarData() + }, [loadSidebarData]) + + // Refresh sidebar data after entry creation + const handleEntryCreated = useCallback(() => { + loadSidebarData() + }, [loadSidebarData]) + + // No qualifying graph + if (!currentGraph && !graphState.isLoading) { + return ( + + + +
+ +

+ No Ledger Found +

+

+ Connect a QuickBooks account to get started with your closing + book. +

+
+
+
+ ) + } + + return ( + + } + /> + + {error && ( + +
+ + {error} +
+
+ )} + +
+ {/* Structure Sidebar */} + + + {/* Content Area */} +
+ + {isSidebarLoading ? ( +
+ +
+ ) : !selectedItem ? ( +
+ Select a section from the sidebar to view. +
+ ) : selectedItem.type === 'statement' && currentGraph ? ( + + ) : selectedItem.type === 'schedule' && currentGraph ? ( + + ) : selectedItem.type === 'account_rollups' && currentGraph ? ( + + ) : selectedItem.type === 'trial_balance' && currentGraph ? ( +
+

Trial Balance

+

+ View the full trial balance on the{' '} + + Trial Balance page + + . +

+
+ ) : selectedItem.type === 'period_close' && currentGraph ? ( + + ) : null} +
+
+
+
+ ) +} + +export default CloseContent diff --git a/src/app/(app)/ledger/close/page.tsx b/src/app/(app)/ledger/close/page.tsx new file mode 100644 index 0000000..c0fe665 --- /dev/null +++ b/src/app/(app)/ledger/close/page.tsx @@ -0,0 +1,15 @@ +'use client' + +import { useUser } from '@/lib/core' +import { Spinner } from '@/lib/core/ui-components' +import CloseContent from './content' + +export default function ClosePage() { + const { user, isLoading } = useUser() + + if (isLoading || !user) { + return + } + + return +} diff --git a/src/app/(app)/sidebar-config.tsx b/src/app/(app)/sidebar-config.tsx index 41e6190..76c1e79 100644 --- a/src/app/(app)/sidebar-config.tsx +++ b/src/app/(app)/sidebar-config.tsx @@ -43,7 +43,7 @@ export const getNavigationItems = ( { href: '/ledger/chart-of-accounts', label: 'Chart of Accounts' }, { href: '/ledger/transactions', label: 'Transactions' }, { href: '/ledger/trial-balance', label: 'Trial Balance' }, - { href: '/ledger/schedules', label: 'Schedules' }, + { href: '/ledger/close', label: 'Close' }, ], }, { diff --git a/src/lib/core/task-monitoring/operationHooks.ts b/src/lib/core/task-monitoring/operationHooks.ts index 884d456..6888d6b 100644 --- a/src/lib/core/task-monitoring/operationHooks.ts +++ b/src/lib/core/task-monitoring/operationHooks.ts @@ -1,7 +1,7 @@ 'use client' import { - changeRepositoryPlan, + changeSubscriptionPlan, client, createCheckoutSession, createGraph as createGraphAPI, @@ -535,7 +535,7 @@ export function useRepositorySubscription() { setIsSubscribing(true) try { - const response = await changeRepositoryPlan({ + const response = await changeSubscriptionPlan({ client, path: { graph_id: data.repository_name }, body: { new_plan_name: data.new_plan_name }, From e965b6be4ff46086e29c5e4492fdd27688909d86 Mon Sep 17 00:00:00 2001 From: "Joseph T. French" Date: Fri, 10 Apr 2026 21:04:53 -0500 Subject: [PATCH 2/3] Refactor currency formatting and streamline component logic - Removed redundant local currency formatting functions from multiple components, centralizing the logic in a utility file. - Updated CloseContent to simplify mapping ID extraction for report regeneration. - Enhanced SchedulePanel to manage entry creation state more effectively. - Improved the integration of currency formatting in StatementTable for consistency. --- .../close/components/AccountRollupsPanel.tsx | 10 +--- .../close/components/PeriodClosePanel.tsx | 8 +-- .../ledger/close/components/SchedulePanel.tsx | 33 +++++------- .../close/components/StatementTable.tsx | 20 +------- src/app/(app)/ledger/close/content.tsx | 15 +++--- src/app/(app)/ledger/close/utils.ts | 50 +++++++++++++++++++ 6 files changed, 72 insertions(+), 64 deletions(-) create mode 100644 src/app/(app)/ledger/close/utils.ts diff --git a/src/app/(app)/ledger/close/components/AccountRollupsPanel.tsx b/src/app/(app)/ledger/close/components/AccountRollupsPanel.tsx index 7fd3f87..8e4fe4e 100644 --- a/src/app/(app)/ledger/close/components/AccountRollupsPanel.tsx +++ b/src/app/(app)/ledger/close/components/AccountRollupsPanel.tsx @@ -14,19 +14,11 @@ import { } from 'flowbite-react' import { Fragment, useCallback, useEffect, useState, type FC } from 'react' import { HiExclamationCircle } from 'react-icons/hi' +import { formatCurrency } from '../utils' import type { FactRow } from './FactsTable' import FactsTable from './FactsTable' import type { ViewMode } from './ViewModeToggle' -const formatCurrency = (value: number): string => { - const abs = Math.abs(value) - const formatted = abs.toLocaleString('en-US', { - minimumFractionDigits: 2, - maximumFractionDigits: 2, - }) - return value < 0 ? `(${formatted})` : formatted -} - interface AccountRollupsPanelProps { graphId: string mappingId: string diff --git a/src/app/(app)/ledger/close/components/PeriodClosePanel.tsx b/src/app/(app)/ledger/close/components/PeriodClosePanel.tsx index febd49f..bfb52a9 100644 --- a/src/app/(app)/ledger/close/components/PeriodClosePanel.tsx +++ b/src/app/(app)/ledger/close/components/PeriodClosePanel.tsx @@ -17,6 +17,7 @@ import type { FC } from 'react' import { useCallback, useEffect, useState } from 'react' import { HiCheck, HiClock, HiExclamationCircle } from 'react-icons/hi' import { TbFileInvoice } from 'react-icons/tb' +import { formatCurrencyDollars } from '../utils' const STATUS_COLORS: Record = { posted: 'success', @@ -25,13 +26,6 @@ const STATUS_COLORS: Record = { reversed: 'failure', } -const formatCurrencyDollars = (amount: number): string => { - return new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD', - }).format(amount) -} - interface PeriodClosePanelProps { graphId: string onEntryCreated?: () => void diff --git a/src/app/(app)/ledger/close/components/SchedulePanel.tsx b/src/app/(app)/ledger/close/components/SchedulePanel.tsx index 199a4d1..4fb3605 100644 --- a/src/app/(app)/ledger/close/components/SchedulePanel.tsx +++ b/src/app/(app)/ledger/close/components/SchedulePanel.tsx @@ -16,25 +16,11 @@ import type { FC } from 'react' import { useCallback, useEffect, useMemo, useState } from 'react' import { HiExclamationCircle } from 'react-icons/hi' import { TbFileInvoice } from 'react-icons/tb' +import { formatCurrencyDollars, formatMonth } from '../utils' import type { FactRow } from './FactsTable' import FactsTable from './FactsTable' import type { ViewMode } from './ViewModeToggle' -const formatCurrency = (amount: number): string => { - return new Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD', - }).format(amount) -} - -const formatMonth = (dateString: string): string => { - const date = new Date(dateString + 'T00:00:00') - return date.toLocaleDateString('en-US', { - year: 'numeric', - month: 'short', - }) -} - interface SchedulePanelProps { graphId: string structureId: string @@ -51,7 +37,7 @@ const SchedulePanel: FC = ({ const [facts, setFacts] = useState([]) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) - const [creatingEntry, setCreatingEntry] = useState(false) + const [creatingEntry, setCreatingEntry] = useState(null) const loadFacts = useCallback(async () => { try { @@ -86,8 +72,9 @@ const SchedulePanel: FC = ({ }, [facts]) const handleCreateEntry = async (periodEnd: string, periodStart: string) => { + const periodKey = `${periodStart}_${periodEnd}` try { - setCreatingEntry(true) + setCreatingEntry(periodKey) await extensions.ledger.createClosingEntry( graphId, structureId, @@ -100,7 +87,7 @@ const SchedulePanel: FC = ({ console.error('Error creating closing entry:', err) setError('Failed to create closing entry.') } finally { - setCreatingEntry(false) + setCreatingEntry(null) } } @@ -178,7 +165,7 @@ const SchedulePanel: FC = ({ {fact.elementName} - {formatCurrency(fact.value)} + {formatCurrencyDollars(fact.value)} {idx === 0 && ( = ({ theme={customTheme.button} size="xs" color="primary" - disabled={creatingEntry} + disabled={ + creatingEntry === + `${fact.periodStart}_${fact.periodEnd}` + } onClick={() => handleCreateEntry(fact.periodEnd, fact.periodStart) } > - {creatingEntry ? ( + {creatingEntry === + `${fact.periodStart}_${fact.periodEnd}` ? ( ) : ( diff --git a/src/app/(app)/ledger/close/components/StatementTable.tsx b/src/app/(app)/ledger/close/components/StatementTable.tsx index 84cdafa..4c99c05 100644 --- a/src/app/(app)/ledger/close/components/StatementTable.tsx +++ b/src/app/(app)/ledger/close/components/StatementTable.tsx @@ -14,25 +14,7 @@ import { TableRow, } from 'flowbite-react' import type { FC } from 'react' - -const formatCurrency = (value: number): string => { - const abs = Math.abs(value) - const formatted = abs.toLocaleString('en-US', { - minimumFractionDigits: 2, - maximumFractionDigits: 2, - }) - return value < 0 ? `(${formatted})` : formatted -} - -const formatDate = (dateString: string | null): string => { - if (!dateString) return 'N/A' - const date = new Date(dateString + 'T00:00:00') - return date.toLocaleDateString('en-US', { - year: 'numeric', - month: 'short', - day: 'numeric', - }) -} +import { formatCurrency, formatDate } from '../utils' interface StatementTableProps { data: StatementData diff --git a/src/app/(app)/ledger/close/content.tsx b/src/app/(app)/ledger/close/content.tsx index bfe0277..7ef72d9 100644 --- a/src/app/(app)/ledger/close/content.tsx +++ b/src/app/(app)/ledger/close/content.tsx @@ -30,7 +30,6 @@ const CloseContent: FC = function () { // Sidebar data — single API call returns all categories const [categories, setCategories] = useState([]) - const [hasData, setHasData] = useState(false) const [entityName, setEntityName] = useState(null) const [mappingId, setMappingId] = useState(null) const [isSidebarLoading, setIsSidebarLoading] = useState(true) @@ -66,15 +65,14 @@ const CloseContent: FC = function () { ]) setCategories(response.categories) - setHasData(response.has_data) setEntityName(entity?.name ?? null) - // Extract mapping ID from account rollups category for report regeneration - const rollupsCategory = response.categories.find( - (c) => c.label === 'Account Rollups' - ) - if (rollupsCategory?.items?.[0]) { - setMappingId(rollupsCategory.items[0].id) + // Extract mapping ID for report regeneration (find first account_rollups item across all categories) + const rollupItem = response.categories + .flatMap((c) => c.items) + .find((i) => i.item_type === 'account_rollups') + if (rollupItem) { + setMappingId(rollupItem.id) } // Auto-select first item from first category @@ -192,6 +190,7 @@ const CloseContent: FC = function () { viewMode={viewMode} /> ) : selectedItem.type === 'trial_balance' && currentGraph ? ( + // TODO: Replace with inline TrialBalancePanel (data exists at /ledger/trial-balance)

Trial Balance

diff --git a/src/app/(app)/ledger/close/utils.ts b/src/app/(app)/ledger/close/utils.ts new file mode 100644 index 0000000..e0bbc04 --- /dev/null +++ b/src/app/(app)/ledger/close/utils.ts @@ -0,0 +1,50 @@ +/** + * Format a number as currency using accounting notation. + * Negative values are displayed in parentheses: (1,234.56) + * Positive values are displayed as-is: 1,234.56 + */ +export const formatCurrency = (value: number): string => { + const abs = Math.abs(value) + const formatted = abs.toLocaleString('en-US', { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }) + return value < 0 ? `(${formatted})` : formatted +} + +/** + * Format a number as USD currency with $ prefix. + * Uses accounting notation: ($1,234.56) for negatives. + */ +export const formatCurrencyDollars = (value: number): string => { + const abs = Math.abs(value) + const formatted = abs.toLocaleString('en-US', { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }) + return value < 0 ? `($${formatted})` : `$${formatted}` +} + +/** + * Format a date string as a readable date. + */ +export const formatDate = (dateString: string | null): string => { + if (!dateString) return 'N/A' + const date = new Date(dateString + 'T00:00:00') + return date.toLocaleDateString('en-US', { + year: 'numeric', + month: 'short', + day: 'numeric', + }) +} + +/** + * Format a date string as month + year. + */ +export const formatMonth = (dateString: string): string => { + const date = new Date(dateString + 'T00:00:00') + return date.toLocaleDateString('en-US', { + year: 'numeric', + month: 'short', + }) +} From 50554d0223fbb57ffa26b2ec403fc46859ca0b18 Mon Sep 17 00:00:00 2001 From: "Joseph T. French" Date: Fri, 10 Apr 2026 21:18:01 -0500 Subject: [PATCH 3/3] Update sidebar label and clean up unused properties in StructureSidebar tests - Changed the sidebar navigation label from "Close" to "Closing Book" for clarity. - Removed unused label properties from test cases in StructureSidebar and content tests to streamline the code. - Added comments in StatementPanel to clarify assumptions regarding fiscal year handling. --- .../ledger/close/__tests__/StructureSidebar.test.tsx | 2 -- src/app/(app)/ledger/close/__tests__/content.test.tsx | 1 - src/app/(app)/ledger/close/components/StatementPanel.tsx | 2 ++ .../(app)/ledger/close/components/StructureSidebar.tsx | 8 +------- src/app/(app)/sidebar-config.tsx | 2 +- 5 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/app/(app)/ledger/close/__tests__/StructureSidebar.test.tsx b/src/app/(app)/ledger/close/__tests__/StructureSidebar.test.tsx index d1d6f79..4e4c5b6 100644 --- a/src/app/(app)/ledger/close/__tests__/StructureSidebar.test.tsx +++ b/src/app/(app)/ledger/close/__tests__/StructureSidebar.test.tsx @@ -121,7 +121,6 @@ describe('StructureSidebar', () => { type: 'statement', reportId: 'rpt_01', structureType: 'income_statement', - label: 'Income Statement', } render( { type: 'statement', reportId: 'rpt_01', structureType: 'balance_sheet', - label: 'Balance Sheet', }) }) diff --git a/src/app/(app)/ledger/close/__tests__/content.test.tsx b/src/app/(app)/ledger/close/__tests__/content.test.tsx index 3c4aa17..8bfe373 100644 --- a/src/app/(app)/ledger/close/__tests__/content.test.tsx +++ b/src/app/(app)/ledger/close/__tests__/content.test.tsx @@ -66,7 +66,6 @@ vi.mock('../components/StructureSidebar', () => ({ type: 'statement', reportId: item.report_id || '', structureType: item.structure_type || '', - label: item.name, } case 'schedule': return { type: 'schedule', structureId: item.id, name: item.name } diff --git a/src/app/(app)/ledger/close/components/StatementPanel.tsx b/src/app/(app)/ledger/close/components/StatementPanel.tsx index 2fc75da..20c2f24 100644 --- a/src/app/(app)/ledger/close/components/StatementPanel.tsx +++ b/src/app/(app)/ledger/close/components/StatementPanel.tsx @@ -128,6 +128,8 @@ function buildPeriods(preset: PresetKey): { } } case 'annual_yoy': { + // Assumes Jan–Dec fiscal year. Non-standard fiscal years will need + // a user-configurable fiscal year end setting in the future. const periods: PeriodSpecInput[] = [ { start: `${year}-01-01`, end: `${year}-12-31`, label: `FY ${year}` }, { diff --git a/src/app/(app)/ledger/close/components/StructureSidebar.tsx b/src/app/(app)/ledger/close/components/StructureSidebar.tsx index 5117cc5..5fafa05 100644 --- a/src/app/(app)/ledger/close/components/StructureSidebar.tsx +++ b/src/app/(app)/ledger/close/components/StructureSidebar.tsx @@ -9,12 +9,7 @@ import { HiChevronLeft, HiChevronRight } from 'react-icons/hi' // ── Types ────────────────────────────────────────────────────────────── export type SelectedItem = - | { - type: 'statement' - reportId: string - structureType: string - label: string - } + | { type: 'statement'; reportId: string; structureType: string } | { type: 'schedule'; structureId: string; name: string } | { type: 'account_rollups'; mappingId: string; name: string } | { type: 'trial_balance' } @@ -29,7 +24,6 @@ function itemToSelected(item: ClosingBookItem): SelectedItem { type: 'statement', reportId: item.report_id || '', structureType: item.structure_type || '', - label: item.name, } case 'schedule': return { diff --git a/src/app/(app)/sidebar-config.tsx b/src/app/(app)/sidebar-config.tsx index 76c1e79..1c9acbc 100644 --- a/src/app/(app)/sidebar-config.tsx +++ b/src/app/(app)/sidebar-config.tsx @@ -43,7 +43,7 @@ export const getNavigationItems = ( { href: '/ledger/chart-of-accounts', label: 'Chart of Accounts' }, { href: '/ledger/transactions', label: 'Transactions' }, { href: '/ledger/trial-balance', label: 'Trial Balance' }, - { href: '/ledger/close', label: 'Close' }, + { href: '/ledger/close', label: 'Closing Book' }, ], }, {