diff --git a/package-lock.json b/package-lock.json index a6fb3adf..20f3e599 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,31 +9,31 @@ "version": "2.1.2", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-lambda": "^3.1102.0", + "@aws-sdk/client-lambda": "^3.1110.0", "@inquirer/prompts": "^8.5.2", "@smartthings/core-sdk": "^8.5.3", "axios": "1.19.0", "chalk": "^6.0.0", - "env-paths": "^3.0.0", - "eventsource": "^4.1.0", + "env-paths": "^4.0.0", + "eventsource": "^5.1.0", "express": "^5.2.1", "get-port-please": "^3.2.0", - "js-yaml": "^4.2.0", + "js-yaml": "^5.3.0", "jszip": "^3.10.1", "lodash.at": "^4.6.0", "log4js": "^6.9.1", - "open": "^11.0.0", - "ora": "^8.2.0", + "open": "^11.0.1", + "ora": "^9.4.1", "os-locale": "^8.0.0", "picomatch": "^4.0.5", "qs": "^6.15.3", "table": "^6.9.0", "ts-node": "^10.9.2", "tslib": "^2.8.1", - "tsx": "^4.23.5", + "tsx": "^4.23.12", "undici": "^8.10.0", "uuid": "^14.0.1", - "yargs": "^18.0.0" + "yargs": "^18.1.0" }, "bin": { "smartthings": "dist/src/run.js" @@ -56,13 +56,13 @@ "@types/picomatch": "^4.0.3", "@types/qs": "^6.15.1", "@types/yargs": "^17.0.35", - "@vercel/ncc": "^0.44.1", + "@vercel/ncc": "^0.45.0", "archiver": "^8.0.0", "cz-conventional-changelog": "^3.3.0", "eslint": "^10.8.0", "eslint-plugin-import-x": "^4.17.1", "eslint-plugin-jest": "^29.16.0", - "globals": "^17.9.0", + "globals": "^17.11.0", "jest": "^30.4.2", "jest-environment-jsdom": "^30.4.1", "jest-extended": "^7.0.0", @@ -111,14 +111,14 @@ "license": "ISC" }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.1102.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.1102.0.tgz", - "integrity": "sha512-8RogHSIb5CKz+8oIhA3scL1Cx4wt2tpEIt0MfpUMn391dEXlBPux7MKkTdU66F77tCn9hQ/Xn6D1Szge3ZzwLg==", + "version": "3.1110.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.1110.0.tgz", + "integrity": "sha512-1YI5iNhtJmTV0KAXAsUylPS1958o04a7sBlryMqJsdJUyRL6viot3aKRUMNbRgLdRReSiD5Cl5uVlT8dnpJe7g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.977.5", - "@aws-sdk/credential-provider-node": "^3.972.77", - "@aws-sdk/types": "^3.974.2", + "@aws-sdk/core": "^3.977.7", + "@aws-sdk/credential-provider-node": "^3.972.79", + "@aws-sdk/types": "^3.974.3", "@smithy/core": "^3.31.1", "@smithy/fetch-http-handler": "^5.6.13", "@smithy/node-http-handler": "^4.9.13", @@ -130,13 +130,13 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.977.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.977.5.tgz", - "integrity": "sha512-O5otOc1c6UZh5HsHAaPdYBcUUR9HL6mtnKqvc8nxN/CKDGUBUpsdh0q8K04Uz/dd1i0TaGyIQuQNqoO7+ad2TQ==", + "version": "3.977.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.977.7.tgz", + "integrity": "sha512-I88Iov89NVmjSmJLKSv7Cn9M2J+a2942OkA8nZCbz+sl4ZeY4zEOcoLOrbt1GRfQ8zEQKnjAJdXixA3J/p1fDQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.974.2", - "@aws-sdk/xml-builder": "^3.972.37", + "@aws-sdk/types": "^3.974.3", + "@aws-sdk/xml-builder": "^3.972.38", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.31.1", "@smithy/signature-v4": "^5.6.12", @@ -149,13 +149,13 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.972.66", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.66.tgz", - "integrity": "sha512-bOzP2+zdJ0XrghywB4FaJXtGZCx9yS0AGps+VJ5yEgg30wVyHNmVDBwVDXcRypzQY5iLGCS3NSn0nsuISqjFCQ==", + "version": "3.972.68", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.68.tgz", + "integrity": "sha512-2a20A/IdNOwUvaDq91iqqS7BA0XlNMfW3iLGZGZLJv0EbUqhSxB0PIx4rQQqssvWj1uXImb3/UCCdHz/+1dOiA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.977.5", - "@aws-sdk/types": "^3.974.2", + "@aws-sdk/core": "^3.977.7", + "@aws-sdk/types": "^3.974.3", "@smithy/core": "^3.31.1", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" @@ -165,13 +165,13 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.68", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.68.tgz", - "integrity": "sha512-lkunS8X+H6V76WE+t/uGQm/U8v0JXK5mLfNFTUAMlE1kqaCjwlmqKJrgCVtqjK/vqnlrSWsLK4Lr4NANBWlfTQ==", + "version": "3.972.70", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.70.tgz", + "integrity": "sha512-0yRem2Fs52r/Nn6UAqIlpjexfaYj8ziEozOe9tamtAVT/5bzFLKx8O2r7MaRqgS3hGKHIa1Jij9nKHSsNnb04A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.977.5", - "@aws-sdk/types": "^3.974.2", + "@aws-sdk/core": "^3.977.7", + "@aws-sdk/types": "^3.974.3", "@smithy/core": "^3.31.1", "@smithy/fetch-http-handler": "^5.6.13", "@smithy/node-http-handler": "^4.9.13", @@ -183,20 +183,20 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.973.11", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.973.11.tgz", - "integrity": "sha512-KoDEolYtLHG/8C+IiZpXbJWyBOMkrHV+j66Kb9PBXmLv5euGb7aELvuCmLenoGAV6gBW2wM7TsG/1e5iulH4kA==", + "version": "3.973.13", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.973.13.tgz", + "integrity": "sha512-2M39DE02XpYYaSWYk/4AsImXYUU/1L2xmTMLUpMMWq7DfLv191/vCRy3baKtdr45AkJQyVgSjmuVOLm15SwrRQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.977.5", - "@aws-sdk/credential-provider-env": "^3.972.66", - "@aws-sdk/credential-provider-http": "^3.972.68", - "@aws-sdk/credential-provider-login": "^3.972.73", - "@aws-sdk/credential-provider-process": "^3.972.66", - "@aws-sdk/credential-provider-sso": "^3.973.10", - "@aws-sdk/credential-provider-web-identity": "^3.972.72", - "@aws-sdk/nested-clients": "^3.997.40", - "@aws-sdk/types": "^3.974.2", + "@aws-sdk/core": "^3.977.7", + "@aws-sdk/credential-provider-env": "^3.972.68", + "@aws-sdk/credential-provider-http": "^3.972.70", + "@aws-sdk/credential-provider-login": "^3.972.75", + "@aws-sdk/credential-provider-process": "^3.972.68", + "@aws-sdk/credential-provider-sso": "^3.973.12", + "@aws-sdk/credential-provider-web-identity": "^3.972.74", + "@aws-sdk/nested-clients": "^3.997.42", + "@aws-sdk/types": "^3.974.3", "@smithy/core": "^3.31.1", "@smithy/credential-provider-imds": "^4.4.16", "@smithy/types": "^4.16.1", @@ -207,14 +207,14 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.972.73", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.73.tgz", - "integrity": "sha512-tjsxMkTAFkmiV9ycmymapb9nLECWVOwFs0bZMQ9gB9bnbY8/HwfukHZlWbXZZp7qkPU6EXAfOcMm3DioFFEywA==", + "version": "3.972.75", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.75.tgz", + "integrity": "sha512-jaTESuJlQsoUZ44f/i2puyPt8VlF/dMMJ9HM3cStYtk7eKX4N9UWi83OLixUkoOJH3BwWlPLCq9YIK9nfWhVBg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.977.5", - "@aws-sdk/nested-clients": "^3.997.40", - "@aws-sdk/types": "^3.974.2", + "@aws-sdk/core": "^3.977.7", + "@aws-sdk/nested-clients": "^3.997.42", + "@aws-sdk/types": "^3.974.3", "@smithy/core": "^3.31.1", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" @@ -224,18 +224,18 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.972.77", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.77.tgz", - "integrity": "sha512-l4nitYCN/Ls57vtUfdextCjTjW41JD7lQiAnuR0RTbdByFc/6OmEAzwGd+lrp6CUtiXGQL1FCaYiamfHASrwBw==", + "version": "3.972.79", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.79.tgz", + "integrity": "sha512-RIw5dof1EHkWubrZzPC941CDtnFG1iAXsxbFgLkhdYZXHc4icU13c/uxSMI0J5eUx9bxa7LjfpdjfClBB1QsDA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "^3.972.66", - "@aws-sdk/credential-provider-http": "^3.972.68", - "@aws-sdk/credential-provider-ini": "^3.973.11", - "@aws-sdk/credential-provider-process": "^3.972.66", - "@aws-sdk/credential-provider-sso": "^3.973.10", - "@aws-sdk/credential-provider-web-identity": "^3.972.72", - "@aws-sdk/types": "^3.974.2", + "@aws-sdk/credential-provider-env": "^3.972.68", + "@aws-sdk/credential-provider-http": "^3.972.70", + "@aws-sdk/credential-provider-ini": "^3.973.13", + "@aws-sdk/credential-provider-process": "^3.972.68", + "@aws-sdk/credential-provider-sso": "^3.973.12", + "@aws-sdk/credential-provider-web-identity": "^3.972.74", + "@aws-sdk/types": "^3.974.3", "@smithy/core": "^3.31.1", "@smithy/credential-provider-imds": "^4.4.16", "@smithy/types": "^4.16.1", @@ -246,13 +246,13 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.972.66", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.66.tgz", - "integrity": "sha512-YOnX6bIhdjx0QfaENu2PB0eFm5MEc9ft8XNGQ+NxMfeLSq9aE+XjWCwDupEnV4UWv5ZFpBLJbTREIx7KNOoqpQ==", + "version": "3.972.68", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.68.tgz", + "integrity": "sha512-nLP3Pda2MQTFJ25hKBMmUuB9Uv+bTZQNlufbeCwklP549Vwnkd8bRLJoCKp5k6xjmdyptrPrOfGOhN0mKuca8A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.977.5", - "@aws-sdk/types": "^3.974.2", + "@aws-sdk/core": "^3.977.7", + "@aws-sdk/types": "^3.974.3", "@smithy/core": "^3.31.1", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" @@ -262,15 +262,15 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.973.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.973.10.tgz", - "integrity": "sha512-IsXnQ35j5VE+3ZK6aIhT5ypB+Jim3zRwVz0nYuVwyBKZyu/SYx+O2/LQpng8c2EiuwyqceabsDlYrICHDlJPsA==", + "version": "3.973.12", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.973.12.tgz", + "integrity": "sha512-EmgyyHn+f9WCcelp3L/vci+LGbX8GigWaVphRArjVo5Pktkr9YnLy/mQ6VDkDyBD72dtfRNTgHmD2ts4rTDXKQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.977.5", - "@aws-sdk/nested-clients": "^3.997.40", - "@aws-sdk/token-providers": "3.1102.0", - "@aws-sdk/types": "^3.974.2", + "@aws-sdk/core": "^3.977.7", + "@aws-sdk/nested-clients": "^3.997.42", + "@aws-sdk/token-providers": "3.1108.0", + "@aws-sdk/types": "^3.974.3", "@smithy/core": "^3.31.1", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" @@ -280,14 +280,14 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.972.72", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.72.tgz", - "integrity": "sha512-nj9Zlsy7ya+fy+jhWTJwgfr7YdtDM4xHyZvgKuftuny0UgROVx9lxwvsWJSLvpKk4lig0m0tHng3k1fEnt0LeA==", + "version": "3.972.74", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.74.tgz", + "integrity": "sha512-0YfczxGXF3RjGj8z7QG/Ho2HnLGKDHfPSHiTs47UU1U/+mmwISDN+rvGKt2zh+3FX8NdT4xd95LGBGyhQw2dgQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.977.5", - "@aws-sdk/nested-clients": "^3.997.40", - "@aws-sdk/types": "^3.974.2", + "@aws-sdk/core": "^3.977.7", + "@aws-sdk/nested-clients": "^3.997.42", + "@aws-sdk/types": "^3.974.3", "@smithy/core": "^3.31.1", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" @@ -297,14 +297,14 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.997.40", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.40.tgz", - "integrity": "sha512-hEdHT0PBR4fkGxWhwKG5EtEYKnAM7HKkp0vD10ufk4YcXejH4r4q6G/XhPzjUc6Yxo5kBS2vHg7llj4ViR9VTQ==", + "version": "3.997.42", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.42.tgz", + "integrity": "sha512-XWRyon2MTHXD/zMoo0Mbge6Vwf+iE0qQaM/RyGO6NfZ9WukCFiQL27nQVZjYy2JwSIg+iXZxKOX95OBXqlSM4w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.977.5", - "@aws-sdk/signature-v4-multi-region": "^3.996.43", - "@aws-sdk/types": "^3.974.2", + "@aws-sdk/core": "^3.977.7", + "@aws-sdk/signature-v4-multi-region": "^3.996.44", + "@aws-sdk/types": "^3.974.3", "@smithy/core": "^3.31.1", "@smithy/fetch-http-handler": "^5.6.13", "@smithy/node-http-handler": "^4.9.13", @@ -316,12 +316,12 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.996.43", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.43.tgz", - "integrity": "sha512-lKekx8bLBXSv4O+cslk9Zfnw2XKSkWBs3uWL5QGhH2ZAQfNS7FE0vcSSN2vD/AhxX54ZTywWxR4STThoeOXlBA==", + "version": "3.996.44", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.44.tgz", + "integrity": "sha512-ZSfQ35Qn4MhSY+A0Whyr+KBx+wJKZUyBsOrjB2pSHOafRzbFe47T8XcXM8hZqUAC69qnqIy0C9ArxTuud0CC2w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.974.2", + "@aws-sdk/types": "^3.974.3", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" @@ -331,14 +331,14 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.1102.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1102.0.tgz", - "integrity": "sha512-Ua700vVvM1q105yABSUQWkCK6FeTrNfU6ORGetJe5BzkZWY7QhkF7SVTOlmDGWRDNd6jbyY0Dv5e+E4bMBEmLg==", + "version": "3.1108.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1108.0.tgz", + "integrity": "sha512-rI80zxDxGJ6904eC/YbjkdjY6JdaZvQ01kOmrMvw7cFQGIHo27fhnIVbMSVDS4T6foQImjxYSRoOu/uSJscXDw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.977.5", - "@aws-sdk/nested-clients": "^3.997.40", - "@aws-sdk/types": "^3.974.2", + "@aws-sdk/core": "^3.977.7", + "@aws-sdk/nested-clients": "^3.997.42", + "@aws-sdk/types": "^3.974.3", "@smithy/core": "^3.31.1", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" @@ -348,9 +348,9 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.974.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.2.tgz", - "integrity": "sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA==", + "version": "3.974.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.3.tgz", + "integrity": "sha512-ECAqfpNsef+7MO8qtR0h9KcFIBAygaE7Cm6UOiQl+ft+uVap+1G7bNEjs4mdJE2OnA4m6k7i8peH8uGIAsOMGw==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.16.1", @@ -361,9 +361,9 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.972.37", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.37.tgz", - "integrity": "sha512-zKq4HQum8JwDyEuyfuI4bbiAcU0KxP6qy+9PR/IsR92IyE/DaBAikzAS50tjxip4bqIIANpCcG+Yyj6CVhXupg==", + "version": "3.972.38", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.38.tgz", + "integrity": "sha512-grf7mzfVxBS5AlsuTvBN7uDpzqohFww9fRPCO+EBSUdvtsYMcPSKdz54h/7XiscqNcUM1Ae1MF7JLHmiYYuzbQ==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.16.1", @@ -1119,6 +1119,29 @@ "js-yaml": "^4.1.1" } }, + "node_modules/@changesets/parse/node_modules/js-yaml": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@changesets/pre": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.2.tgz", @@ -3974,12 +3997,12 @@ } }, "node_modules/@smithy/core": { - "version": "3.31.1", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.31.1.tgz", - "integrity": "sha512-CyogUINxvi7C7LDsh8Syo6hVJOT9ckz4rG8dRZfTJ8r91HkMY59PnNooaj7WcHyxEkxPfBAmbgztZU+xTo76lg==", + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.33.0.tgz", + "integrity": "sha512-uKbkxgqLyepQDZoq8aRSdUqD1ID//rOqG96ixBhp++O7vBtmwYM6fwldGhr9HJP0iYrdc7GP/AlgzPWEZIrNRg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.16.1", + "@smithy/types": "^4.17.0", "tslib": "^2.6.2" }, "engines": { @@ -3987,13 +4010,13 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.4.16", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.4.16.tgz", - "integrity": "sha512-QfuLWAkLzptffFW980AFeHZFdqds2B64rpEd3uJ6lgs3xVn9QegGMUgUcj+4d7dRrAsya3r58ZKpku97WcFb4w==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.5.0.tgz", + "integrity": "sha512-2jsPi+7Zv2hSzD9IXR9D7DTqSn7mv4XalzRm+bESh53jiaUS3NKEUbpQFTJP0HhQy9qzZvluxQ3yS24zdRrqsA==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.31.1", - "@smithy/types": "^4.16.1", + "@smithy/core": "^3.32.0", + "@smithy/types": "^4.17.0", "tslib": "^2.6.2" }, "engines": { @@ -4001,13 +4024,13 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.6.13", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.6.13.tgz", - "integrity": "sha512-4fW86pEUOMbrD5nkbyl/tTvPHHWJFbuB2odl6ps9lWfHoXf9HWh3Q/Smh59qH1g7+c/BSZghX6bbUk4gsiMs8A==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.7.0.tgz", + "integrity": "sha512-W/exA8T0LEzCQtJ02w4IzaEQPIspgarqZprb7W8FwnYiDowgCrjl2fTQ6FvuSSUnJORuepBF81abmBJwqh+0XQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.31.1", - "@smithy/types": "^4.16.1", + "@smithy/core": "^3.32.0", + "@smithy/types": "^4.17.0", "tslib": "^2.6.2" }, "engines": { @@ -4015,13 +4038,13 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.9.13", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.9.13.tgz", - "integrity": "sha512-Nmd/Nl35zfYrd+a6OO2cDJb3GPh9bgTjIUhcM+JFfjpp8/osCgboDV5nCT1I01Pv6R13eSKDKLSoVa5ZB6Zsfw==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.11.0.tgz", + "integrity": "sha512-ssHIZsadPUA3lGdnoByxfnjtb9xPYQLvdfJRLKIwxOoa6tO1suG4sLFSsgd7D/CsvYd8QbBIuKTImuJha5l6aQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.31.1", - "@smithy/types": "^4.16.1", + "@smithy/core": "^3.33.0", + "@smithy/types": "^4.17.0", "tslib": "^2.6.2" }, "engines": { @@ -4029,13 +4052,13 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.6.12", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.6.12.tgz", - "integrity": "sha512-I6KLtq3H0qqSuV9vLglfi8puHqzygzWHOnI4z/Rdoo+q50vvo18vBRdPAvvEtcaKROz7Zn6qnPa14kRfPH6PcQ==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.7.0.tgz", + "integrity": "sha512-hCynhm22wMJ8wTF9crcwu8mxggtUrSLLJgDcGUvYFBqpofxycYJCGKOMYg4xtPPFtgNiDJSYmhsWLTrcU/g59Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.31.1", - "@smithy/types": "^4.16.1", + "@smithy/core": "^3.32.0", + "@smithy/types": "^4.17.0", "tslib": "^2.6.2" }, "engines": { @@ -4043,9 +4066,9 @@ } }, "node_modules/@smithy/types": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.16.1.tgz", - "integrity": "sha512-0JFs3V2y2M9tKW5na/qxe69Zv+uxLMO7QBbhxF/FHu/Gp2NFZAAL9tWl9PU02xxo07pb3G9FTyjNc6D5uZrJIg==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.17.0.tgz", + "integrity": "sha512-Aw4joiM0ZdErpo39lCj8phT2lxoiKZV+KZzBxnnQhWVtU2Is/WffQSL04uUWRcXUse9Ln8vXZK6V/FwqRVnQpg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -5136,9 +5159,9 @@ ] }, "node_modules/@vercel/ncc": { - "version": "0.44.1", - "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.44.1.tgz", - "integrity": "sha512-cUjIE5P2YY1n+Kt9rFIazMMpGoPn1Fic04rOmTkElMkiDP5oszGfERMpo2shVkFKDL7rVppdM2pqJKC59shQWQ==", + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.45.0.tgz", + "integrity": "sha512-8zPi1yO2mHpoKTD+e+Bf0ZT3e+sWHSOyGapm9s7b5R0gxJi3CiFTqmeQiMEyu6ejrz2s09M8JkEoUaTWjBJPQQ==", "dev": true, "license": "MIT", "bin": { @@ -6646,6 +6669,7 @@ "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, "engines": { "node": ">=6" }, @@ -7189,6 +7213,29 @@ "node": ">=6" } }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", @@ -8328,12 +8375,15 @@ } }, "node_modules/env-paths": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", - "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-4.0.0.tgz", + "integrity": "sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw==", "license": "MIT", + "dependencies": { + "is-safe-filename": "^0.1.0" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8884,24 +8934,24 @@ } }, "node_modules/eventsource": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.1.0.tgz", - "integrity": "sha512-2GuF51iuHX6A9xdTccMTsNb7VO0lHZihApxhvQzJB5A03DvHDd2FQepodbMaztPBmBcE/ox7o2gqaxGhYB9LhQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-5.1.0.tgz", + "integrity": "sha512-+errgX9LYbcpibagHh7CEjEZJvQbIDZB2yY7SbUAhHGv4Ircri3T9LH33TUtcXHDy/pFYel1xCi4VOcBnr3wmw==", "license": "MIT", "dependencies": { - "eventsource-parser": "^3.0.1" + "eventsource-parser": "^4.0.0" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.12.0" } }, "node_modules/eventsource-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.3.tgz", - "integrity": "sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-4.0.0.tgz", + "integrity": "sha512-aIpvYxbqTx4KYWw73KpCt1Rh22tEAJ144F1qR76CT3Ex+LNMEPKf5HFrK5Yz9fMP1EVT0GrfA35VZvWQhMPuSQ==", "license": "MIT", "engines": { - "node": ">=20.0.0" + "node": ">=22.12" } }, "node_modules/execa": { @@ -9904,9 +9954,9 @@ } }, "node_modules/globals": { - "version": "17.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.9.0.tgz", - "integrity": "sha512-m/MvAW61QVU5VDNF1Vj8axt016h8w7L5TU1e9zlab7XIttAT2YAlCwl75K1fOqvMM9apmD7lbCIRhpfkhmxhCg==", + "version": "17.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.11.0.tgz", + "integrity": "sha512-Z2I8hM+PbJDXQDq3Icgpzv+mPdwr68iZUU9d5WW4FuXfDUQfkZaZuvjMv42/5crNyw154+9+VWXbYrUgDXbxNw==", "dev": true, "license": "MIT", "engines": { @@ -10830,6 +10880,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-safe-filename": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-safe-filename/-/is-safe-filename-0.1.1.tgz", + "integrity": "sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -12692,9 +12754,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.3.0.tgz", + "integrity": "sha512-muutsYr+e2+d3rTgUGslq5rxbBlUy3cJ61IsHag2QNDQV+7zXWjkUpmALIajhrlLlrgRUiymj6U3zUr/TMK84Q==", "funding": [ { "type": "github", @@ -12710,7 +12772,7 @@ "argparse": "^2.0.1" }, "bin": { - "js-yaml": "bin/js-yaml.js" + "js-yaml": "bin/js-yaml.mjs" } }, "node_modules/jsbn": { @@ -13087,13 +13149,13 @@ "license": "MIT" }, "node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", "license": "MIT", "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" }, "engines": { "node": ">=18" @@ -13102,30 +13164,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/log4js": { "version": "6.9.1", "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", @@ -14153,17 +14191,17 @@ } }, "node_modules/open": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", - "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.1.tgz", + "integrity": "sha512-NzwMUB6C1D0+Kd+9iMS/H4k+Ck3cTX6Ckyfr/gAGlmvSE1LUQZnEZvWBi4PYmMwH/S5SMeTXnE+9uAz8uF+pWw==", "license": "MIT", "dependencies": { "default-browser": "^5.4.0", "define-lazy-prop": "^3.0.0", "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", - "powershell-utils": "^0.1.0", - "wsl-utils": "^0.3.0" + "powershell-utils": "^0.2.0", + "wsl-utils": "^1.0.0" }, "engines": { "node": ">=20" @@ -14190,23 +14228,22 @@ } }, "node_modules/ora": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", - "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.4.1.tgz", + "integrity": "sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==", "license": "MIT", "dependencies": { - "chalk": "^5.3.0", + "chalk": "^5.6.2", "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", + "cli-spinners": "^3.2.0", "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", + "stdin-discarder": "^0.3.2", + "string-width": "^8.1.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14239,11 +14276,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" + "node_modules/ora/node_modules/cli-spinners": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/ora/node_modules/onetime": { "version": "7.0.0", @@ -14289,17 +14332,16 @@ } }, "node_modules/ora/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14757,9 +14799,9 @@ } }, "node_modules/powershell-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", - "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.0.tgz", + "integrity": "sha512-ZlsFlG7MtSFCoc5xreOvBAozCJ6Pf06opgJjh9ONEv418xpZSAzNjstD36C6+JwOnfSqOW/9uDkqKjezTdxZhw==", "license": "MIT", "engines": { "node": ">=20" @@ -16028,9 +16070,9 @@ } }, "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.2.tgz", + "integrity": "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==", "license": "MIT", "engines": { "node": ">=18" @@ -17020,9 +17062,9 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.23.5", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.5.tgz", - "integrity": "sha512-rw55FUaqOoI7RvlQwLbhO4nSDApnQ4/CykPuiQ/EPvtrX3WA9Ig55jIt9VvbBJbzJuj12ueRu4PMZ2SxPVbihg==", + "version": "4.23.12", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.12.tgz", + "integrity": "sha512-FDf4L4sYzKtzWYhU/Xm0AQFdTjdIxNo9ElTf2mxXM6k8YMHXzYUe4yODVaXP4V9uMFbVg8c0qyBccK2OOxb45Q==", "license": "MIT", "dependencies": { "esbuild": "~0.28.0" @@ -18041,9 +18083,9 @@ } }, "node_modules/wsl-utils": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", - "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-1.0.0.tgz", + "integrity": "sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==", "license": "MIT", "dependencies": { "is-wsl": "^3.1.0", @@ -18071,6 +18113,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/wsl-utils/node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/xml-name-validator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", @@ -18113,15 +18167,15 @@ "license": "ISC" }, "node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz", + "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==", "license": "MIT", "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", + "string-width": "^8.2.1", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" }, @@ -18138,24 +18192,17 @@ "node": "^20.19.0 || ^22.12.0 || >=23" } }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "license": "MIT" - }, "node_modules/yargs/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -18203,6 +18250,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yoctocolors": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", + "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zip-stream": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-7.0.5.tgz", diff --git a/package.json b/package.json index 25ce1881..e61880c2 100644 --- a/package.json +++ b/package.json @@ -44,31 +44,31 @@ }, "type": "module", "dependencies": { - "@aws-sdk/client-lambda": "^3.1102.0", + "@aws-sdk/client-lambda": "^3.1110.0", "@inquirer/prompts": "^8.5.2", "@smartthings/core-sdk": "^8.5.3", "axios": "1.19.0", "chalk": "^6.0.0", - "env-paths": "^3.0.0", - "eventsource": "^4.1.0", + "env-paths": "^4.0.0", + "eventsource": "^5.1.0", "express": "^5.2.1", "get-port-please": "^3.2.0", - "js-yaml": "^4.2.0", + "js-yaml": "^5.3.0", "jszip": "^3.10.1", "lodash.at": "^4.6.0", "log4js": "^6.9.1", - "open": "^11.0.0", - "ora": "^8.2.0", + "open": "^11.0.1", + "ora": "^9.4.1", "os-locale": "^8.0.0", "picomatch": "^4.0.5", "qs": "^6.15.3", "table": "^6.9.0", "ts-node": "^10.9.2", "tslib": "^2.8.1", - "tsx": "^4.23.5", + "tsx": "^4.23.12", "undici": "^8.10.0", "uuid": "^14.0.1", - "yargs": "^18.0.0" + "yargs": "^18.1.0" }, "devDependencies": { "@changesets/changelog-github": "^0.7.0", @@ -88,13 +88,13 @@ "@types/picomatch": "^4.0.3", "@types/qs": "^6.15.1", "@types/yargs": "^17.0.35", - "@vercel/ncc": "^0.44.1", + "@vercel/ncc": "^0.45.0", "archiver": "^8.0.0", "cz-conventional-changelog": "^3.3.0", "eslint": "^10.8.0", "eslint-plugin-import-x": "^4.17.1", "eslint-plugin-jest": "^29.16.0", - "globals": "^17.9.0", + "globals": "^17.11.0", "jest": "^30.4.2", "jest-environment-jsdom": "^30.4.1", "jest-extended": "^7.0.0", diff --git a/src/__tests__/lib/cli-config.test.ts b/src/__tests__/lib/cli-config.test.ts index b8b49a89..be1ad9d0 100644 --- a/src/__tests__/lib/cli-config.test.ts +++ b/src/__tests__/lib/cli-config.test.ts @@ -2,7 +2,7 @@ import { jest } from '@jest/globals' import type { readFile, writeFile } from 'node:fs/promises' -import type yaml from 'js-yaml' +import { type load, type dump, YAML11_SCHEMA } from 'js-yaml' import type { CLIConfig, @@ -20,15 +20,17 @@ jest.unstable_mockModule('node:fs/promises', () => ({ writeFile: writeFileMock, })) -const yamlLoadMock = jest.fn() -const yamlDumpMock = jest.fn() +const yamlLoadMock = jest.fn() +const yamlDumpMock = jest.fn() jest.unstable_mockModule('js-yaml', () => ({ - default: { - load: yamlLoadMock, - dump: yamlDumpMock, - }, + load: yamlLoadMock, + dump: yamlDumpMock, + // eslint-disable-next-line @typescript-eslint/naming-convention + YAML11_SCHEMA, })) +const yamlLoadOptions = { schema: YAML11_SCHEMA } + const { loggerMock, warnMock } = await import('../test-lib/logger-mock.js') const yamlExistsMock = jest.fn() @@ -67,9 +69,8 @@ describe('loadConfigFile', () => { expect(readFileMock).toHaveBeenCalledTimes(0) }) - it('returns empty object for empty file', async () => { - readFileMock.mockResolvedValueOnce('empty contents') - yamlLoadMock.mockReturnValueOnce('') + it.each([undefined, null, ''])('returns empty object for empty file', async (fileContents) => { + readFileMock.mockResolvedValueOnce(fileContents as string) expect(await loadConfigFile('empty file')).toEqual({}) @@ -77,8 +78,7 @@ describe('loadConfigFile', () => { expect(yamlExistsMock).toHaveBeenCalledWith('empty file') expect(readFileMock).toHaveBeenCalledTimes(1) expect(readFileMock).toHaveBeenCalledWith('empty file', 'utf-8') - expect(yamlLoadMock).toHaveBeenCalledTimes(1) - expect(yamlLoadMock).toHaveBeenCalledWith('empty contents') + expect(yamlLoadMock).not.toHaveBeenCalled() }) it.each(['string', ['array']])('throws error for non-object yaml file', async (parsedYAML) => { @@ -92,7 +92,7 @@ describe('loadConfigFile', () => { expect(readFileMock).toHaveBeenCalledTimes(1) expect(readFileMock).toHaveBeenCalledWith('configFilename.json', 'utf-8') expect(yamlLoadMock).toHaveBeenCalledTimes(1) - expect(yamlLoadMock).toHaveBeenCalledWith('file contents') + expect(yamlLoadMock).toHaveBeenCalledWith('file contents', yamlLoadOptions) expect(fatalErrorMock).toHaveBeenCalledExactlyOnceWith( 'invalid config file format\n' + seeConfigDocs, ) @@ -113,7 +113,7 @@ describe('loadConfigFile', () => { expect(readFileMock).toHaveBeenCalledTimes(1) expect(readFileMock).toHaveBeenCalledWith('file with bad configs', 'utf-8') expect(yamlLoadMock).toHaveBeenCalledTimes(1) - expect(yamlLoadMock).toHaveBeenCalledWith('config with multiple errors') + expect(yamlLoadMock).toHaveBeenCalledWith('config with multiple errors', yamlLoadOptions) expect(fatalErrorMock).toHaveBeenCalledExactlyOnceWith( 'bad profile badProfile1; profile must be an object\n' + 'bad profile badProfile2; profile must be an object\n' + @@ -141,7 +141,7 @@ describe('loadConfigFile', () => { expect(readFileMock).toHaveBeenCalledTimes(1) expect(readFileMock).toHaveBeenCalledWith('good file', 'utf-8') expect(yamlLoadMock).toHaveBeenCalledTimes(1) - expect(yamlLoadMock).toHaveBeenCalledWith('good contents') + expect(yamlLoadMock).toHaveBeenCalledWith('good contents', yamlLoadOptions) }) }) diff --git a/src/__tests__/lib/file-util.test.ts b/src/__tests__/lib/file-util.test.ts index 124b666b..ef476e33 100644 --- a/src/__tests__/lib/file-util.test.ts +++ b/src/__tests__/lib/file-util.test.ts @@ -2,7 +2,7 @@ import { jest } from '@jest/globals' import { readFileSync, promises as fsPromises, Stats } from 'node:fs' -import type yaml from 'js-yaml' +import { type load, YAML11_SCHEMA } from 'js-yaml' import { type YAMLFileData } from '../../lib/file-util.js' import type { fatalError } from '../../lib/util.js' @@ -24,13 +24,11 @@ jest.unstable_mockModule('node:fs/promises', () => ({ realpath: realpathMock, })) -const yamlLoadMock = jest.fn() -const yamlDumpMock = jest.fn() +const yamlLoadMock = jest.fn() jest.unstable_mockModule('js-yaml', () => ({ - default: { - load: yamlLoadMock, - dump: yamlDumpMock, - }, + load: yamlLoadMock, + // eslint-disable-next-line @typescript-eslint/naming-convention + YAML11_SCHEMA, })) const fatalErrorMock = jest.fn() @@ -271,7 +269,7 @@ describe('readYAMLFile', () => { expect(readYAMLFile('filename')).toBe(yamlFile) expect(readFileSyncMock).toHaveBeenCalledExactlyOnceWith('filename', 'utf-8') - expect(yamlLoadMock).toHaveBeenCalledExactlyOnceWith('file contents') + expect(yamlLoadMock).toHaveBeenCalledExactlyOnceWith('file contents', { schema: YAML11_SCHEMA }) }) it('passes error message into user-facing error', () => { @@ -285,18 +283,31 @@ describe('readYAMLFile', () => { }) it.each` - invalidYaml | errorMessage - ${{}} | ${'invalid file filename'} - ${null} | ${'empty file filename'} - ${''} | ${'invalid file filename'} - ${0} | ${'invalid file filename'} - `('throws $errorMessage when reading $invalidYaml', ({ invalidYaml, errorMessage }) => { + invalidYaml + ${{}} + ${0} + `('throws "invalid file filename" when reading $invalidYaml', ({ invalidYaml }) => { readFileSyncMock.mockReturnValueOnce('file contents') yamlLoadMock.mockReturnValueOnce(invalidYaml) fatalErrorMock.mockReturnValueOnce('never return' as never) expect(readYAMLFile('filename')).toBe('never return') - expect(fatalErrorMock).toHaveBeenCalledWith(errorMessage) + expect(fatalErrorMock).toHaveBeenCalledWith('invalid file filename') + }) + + it.each` + invalidYaml + ${null} + ${''} + ${undefined} + `('throws "empty file filename" when reading $invalidYaml', ({ invalidYaml }) => { + readFileSyncMock.mockReturnValueOnce(invalidYaml) + fatalErrorMock.mockReturnValueOnce('never return' as never) + + expect(readYAMLFile('filename')).toBe('never return') + + expect(fatalErrorMock).toHaveBeenCalledWith('empty file filename') + expect(yamlLoadMock).not.toHaveBeenCalled() }) }) diff --git a/src/__tests__/lib/log-utils.test.ts b/src/__tests__/lib/log-utils.test.ts index 30faa911..a208916c 100644 --- a/src/__tests__/lib/log-utils.test.ts +++ b/src/__tests__/lib/log-utils.test.ts @@ -3,7 +3,7 @@ import { jest } from '@jest/globals' import { type readFileSync } from 'node:fs' import log4js, { type Logger } from 'log4js' -import type yaml from 'js-yaml' +import { type load, YAML11_SCHEMA } from 'js-yaml' import type { yamlExists } from '../../lib/io-util.js' import { fatalError } from '../../lib/util.js' @@ -16,11 +16,11 @@ jest.unstable_mockModule('node:fs', () => ({ }, })) -const yamlLoadMock = jest.fn() +const yamlLoadMock = jest.fn() jest.unstable_mockModule('js-yaml', () => ({ - default: { - load: yamlLoadMock, - }, + load: yamlLoadMock, + // eslint-disable-next-line @typescript-eslint/naming-convention + YAML11_SCHEMA, })) const yamlExistsMock = jest.fn() @@ -101,7 +101,7 @@ describe('loadLog4jsConfig', () => { expect(loadLog4jsConfig('filename', defaultConfig)).toStrictEqual(loadedConfig) expect(readFileSyncMock).toHaveBeenCalledExactlyOnceWith('filename', 'utf-8') - expect(yamlLoadMock).toHaveBeenCalledExactlyOnceWith('file contents') + expect(yamlLoadMock).toHaveBeenCalledExactlyOnceWith('file contents', { schema: YAML11_SCHEMA }) }) it('ends with error if config is invalid', () => { @@ -115,7 +115,7 @@ describe('loadLog4jsConfig', () => { expect(loadLog4jsConfig('filename', defaultConfig)).toBe('never return') expect(readFileSyncMock).toHaveBeenCalledExactlyOnceWith('filename', 'utf-8') - expect(yamlLoadMock).toHaveBeenCalledExactlyOnceWith('bad file contents') + expect(yamlLoadMock).toHaveBeenCalledExactlyOnceWith('bad file contents', { schema: YAML11_SCHEMA }) expect(fatalErrorMock).toHaveBeenCalledExactlyOnceWith( expect.stringContaining('invalid or unreadable logging config file format'), diff --git a/src/build-tools/build-binaries.ts b/src/build-tools/build-binaries.ts index 0566a0ca..901a9d81 100644 --- a/src/build-tools/build-binaries.ts +++ b/src/build-tools/build-binaries.ts @@ -49,7 +49,12 @@ const buildAndZipTarget = async (target: string): Promise => { await compile({ name: 'smartthings', input: packFile, - resources: ['package.json'], + // nexe's static analysis doesn't always detect the packed entry file as a + // dependency to embed (e.g. it misses it when ncc emits require/import shims + // for ESM-only transitive dependencies), which leaves the compiled binary + // unable to find its own bundled script at runtime. Listing it explicitly + // forces nexe to embed it regardless. + resources: ['package.json', packFile], remote: 'https://github.com/SmartThingsCommunity/cli-nexe-builds/releases/download/1.0.0', output: fullBinaryFilename, python: 'python3', diff --git a/src/commands/config.ts b/src/commands/config.ts index 128d6a1f..6d6fd39d 100644 --- a/src/commands/config.ts +++ b/src/commands/config.ts @@ -1,6 +1,6 @@ import { join } from 'node:path' -import yaml from 'js-yaml' +import { dump } from 'js-yaml' import { type ArgumentsCamelCase, type Argv, type CommandModule } from 'yargs' import { type Profile } from '../lib/cli-config.js' @@ -52,7 +52,7 @@ const handler = async (argv: ArgumentsCamelCase): Promise => ] const tableFieldDefinitions: TableFieldDefinition[] = [ ...listTableFieldDefinitions, - { label: 'Definition', value: item => yaml.dump(item.profile) }, + { label: 'Definition', value: item => dump(item.profile) }, ] const outputListConfig: OutputListConfig = { diff --git a/src/lib/cli-config.ts b/src/lib/cli-config.ts index d28d44eb..c1378f1e 100644 --- a/src/lib/cli-config.ts +++ b/src/lib/cli-config.ts @@ -1,7 +1,7 @@ import { readFile, writeFile } from 'node:fs/promises' import { type Logger } from 'log4js' -import yaml from 'js-yaml' +import { dump, load, YAML11_SCHEMA } from 'js-yaml' import { yamlExists } from './io-util.js' import { fatalError } from './util.js' @@ -72,7 +72,8 @@ export const loadConfigFile = async (filename: string): Promise return {} } - const parsed = yaml.load(await readFile(filename, 'utf-8')) + const contents = await readFile(filename, 'utf-8') + const parsed = contents?.trim() ? load(contents, { schema: YAML11_SCHEMA }) : {} if (parsed) { if (typeof parsed === 'object' && !Array.isArray(parsed)) { const errors: string[] = [] @@ -178,13 +179,13 @@ export const loadConfig = async (description: CLIConfigDescription, logger: Logg /** * Generate managed config file contents. If there are no profiles to save, we skip calling - * `yaml.dump` which returns `{}` in that case. + * `dump` which returns `{}` in that case. */ export const buildManagedConfigFileContents = (config: CLIConfig): string => `# This file is used to store settings managed by the CLI. Users are not meant to edit it directly. # Any options in the main config file will override values from this one. -` + (Object.keys(config.managedProfiles).length > 0 ? yaml.dump(config.managedProfiles) : '') +` + (Object.keys(config.managedProfiles).length > 0 ? dump(config.managedProfiles) : '') /** * Save the specified configuration key into managed config so it will be picked up diff --git a/src/lib/command/output.ts b/src/lib/command/output.ts index f5632747..d2b4c874 100644 --- a/src/lib/command/output.ts +++ b/src/lib/command/output.ts @@ -1,6 +1,6 @@ import { writeFile } from 'node:fs/promises' -import yaml from 'js-yaml' +import { dump } from 'js-yaml' import { Argv } from 'yargs' import { formatFromFilename, IOFormat, stdoutIsTTY } from '../io-util.js' @@ -52,7 +52,7 @@ export const jsonFormatter = (indent: number): OutputFormatter (data: T) => JSON.stringify(data, null, indent) export const yamlFormatter = (indent: number): OutputFormatter => - (data: T) => yaml.dump(data, { indent }) + (data: T) => dump(data, { indent }) export const itemTableFormatter = (tableGenerator: TableGenerator, fieldDefinitions: TableFieldDefinition[]): OutputFormatter => diff --git a/src/lib/command/smartthings-command.ts b/src/lib/command/smartthings-command.ts index b73f6b5a..43f75450 100644 --- a/src/lib/command/smartthings-command.ts +++ b/src/lib/command/smartthings-command.ts @@ -85,7 +85,14 @@ export const getConfigDirsCheckingForOldConfig = async ( // The documentation says not to use `suffix` "unless you really have to" but the directories // get suffixed with `-nodejs` without using it. This would be fine for the data directory, // but for the config and log directories that users might use, it seems rather ugly. - const { config: configDir, data: dataDir, log: logDir } = envPaths('@smartthings/cli', { suffix: '' }) + const { config, data, log } = envPaths('@smartthings_cli', { suffix: '' }) + + // Version 4.0.0 no longer allows `/` as part of the path so we use `_` in the request + // and substitute `/` back in the results. + const backToSlash = (path: string): string => path.replace(/@smartthings_cli/, '@smartthings/cli') + const configDir = backToSlash(config) + const dataDir = backToSlash(data) + const logDir = backToSlash(log) if (options.verboseLogging) { console.error(`config dir = ${configDir}`) console.error(`data dir = ${dataDir}`) diff --git a/src/lib/file-util.ts b/src/lib/file-util.ts index 43980fb2..8c3d2975 100644 --- a/src/lib/file-util.ts +++ b/src/lib/file-util.ts @@ -1,7 +1,7 @@ import { readFileSync } from 'node:fs' import { lstat, mkdir, realpath, stat } from 'node:fs/promises' -import yaml from 'js-yaml' +import { load, YAML11_SCHEMA } from 'js-yaml' import { fatalError } from './util.js' @@ -75,13 +75,14 @@ const isYAMLFileData = (data: unknown): data is YAMLFileData => export const readYAMLFile = (filename: string): YAMLFileData => { try { - const data = yaml.load(readFileSync(filename, 'utf-8')) - if (isYAMLFileData(data)) { - return data + const contents = readFileSync(filename, 'utf-8') + if (!contents?.trim()) { + return fatalError(`empty file ${filename}`) } - if (data == null) { - return fatalError(`empty file ${filename}`) + const data = load(contents, { schema: YAML11_SCHEMA }) + if (isYAMLFileData(data)) { + return data } return fatalError(`invalid file ${filename}`) diff --git a/src/lib/io-util.ts b/src/lib/io-util.ts index bbc003ff..f7c7a9ed 100644 --- a/src/lib/io-util.ts +++ b/src/lib/io-util.ts @@ -2,7 +2,7 @@ import fs from 'node:fs' import path from 'node:path' import log4js from 'log4js' -import yaml from 'js-yaml' +import { load, YAML11_SCHEMA } from 'js-yaml' import { fatalError } from './util.js' @@ -26,7 +26,7 @@ export function formatFromFilename(filename: string): IOFormat { export function parseJSONOrYAML(rawInputData: string, source: string): T { - const data = yaml.load(rawInputData) + const data = rawInputData.trim() ? load(rawInputData, { schema: YAML11_SCHEMA }) : undefined if (!data) { return fatalError(`did not get any data from ${source}`) } diff --git a/src/lib/log-utils.ts b/src/lib/log-utils.ts index e8c0fbe9..3fc7d560 100644 --- a/src/lib/log-utils.ts +++ b/src/lib/log-utils.ts @@ -1,6 +1,6 @@ import fs from 'node:fs' -import yaml from 'js-yaml' +import { load, YAML11_SCHEMA } from 'js-yaml' import { Configuration as Log4jsConfig, Logger, FileAppender, StandardErrorAppender } from 'log4js' import { Logger as CoreSDKLogger } from '@smartthings/core-sdk' @@ -54,7 +54,8 @@ export function loadLog4jsConfig(configFilename: string, defaultConfig: Log4jsCo return defaultConfig } - const parsedConfig = yaml.load(fs.readFileSync(configFilename, 'utf-8')) + const contents = fs.readFileSync(configFilename, 'utf-8') + const parsedConfig = contents.trim() ? load(contents, { schema: YAML11_SCHEMA }) : undefined if (isLog4jsConfig(parsedConfig)) { return parsedConfig }