diff --git a/package-lock.json b/package-lock.json index 0350b47e6ed..737f31bb840 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14744,12 +14744,13 @@ } }, "node_modules/@aws/language-server-runtimes": { - "version": "0.2.119", - "resolved": "https://registry.npmjs.org/@aws/language-server-runtimes/-/language-server-runtimes-0.2.119.tgz", - "integrity": "sha512-zHonaOBuZ9K81/EQ1hg6ieu45YK7J5M6kiFD/dpdwJwsU36Ia4rbnN2W5ZIDPryZ9Hx9WYpw72YBl+q8+6BdGQ==", + "version": "0.2.125", + "resolved": "https://registry.npmjs.org/@aws/language-server-runtimes/-/language-server-runtimes-0.2.125.tgz", + "integrity": "sha512-tjXJEagZ6rm09fcgJGu1zbFNzi0+7R1mdNFa6zCIv68c76xq5JHjc++Hne9aOgp61O6BM9uNnX3KR57v9/0E1g==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@aws/language-server-runtimes-types": "^0.1.51", + "@aws/language-server-runtimes-types": "^0.1.56", "@opentelemetry/api": "^1.9.0", "@opentelemetry/api-logs": "^0.200.0", "@opentelemetry/core": "^2.0.0", @@ -14764,7 +14765,7 @@ "hpagent": "^1.2.0", "jose": "^5.9.6", "mac-ca": "^3.1.1", - "os-proxy-config": "^1.1.2", + "registry-js": "^1.16.1", "rxjs": "^7.8.2", "vscode-languageserver": "^9.0.1", "vscode-languageserver-protocol": "^3.17.5", @@ -14776,10 +14777,11 @@ } }, "node_modules/@aws/language-server-runtimes-types": { - "version": "0.1.51", - "resolved": "https://registry.npmjs.org/@aws/language-server-runtimes-types/-/language-server-runtimes-types-0.1.51.tgz", - "integrity": "sha512-TuCA821MSRCpO/1thhHaBRpKzU/CiHM/Bvd6quJRUKwvSb8/gTG1mSBp2YoHYx4p7FUZYBko2DKDmpaB1WfvUw==", + "version": "0.1.56", + "resolved": "https://registry.npmjs.org/@aws/language-server-runtimes-types/-/language-server-runtimes-types-0.1.56.tgz", + "integrity": "sha512-Md/L750JShCHUsCQUJva51Ofkn/GDBEX8PpZnWUIVqkpddDR00SLQS2smNf4UHtKNJ2fefsfks/Kqfuatjkjvg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "^3.17.5" @@ -16007,32 +16009,22 @@ }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.1", @@ -16041,32 +16033,22 @@ }, "node_modules/@protobufjs/float": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "license": "BSD-3-Clause" }, "node_modules/@redhat-developer/locators": { @@ -19176,11 +19158,16 @@ }, "node_modules/aproba": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "license": "ISC" }, "node_modules/are-we-there-yet": { "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "deprecated": "This package is no longer supported.", "dev": true, "license": "ISC", "dependencies": { @@ -19190,6 +19177,8 @@ }, "node_modules/are-we-there-yet/node_modules/readable-stream": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "license": "MIT", "dependencies": { @@ -19204,11 +19193,15 @@ }, "node_modules/are-we-there-yet/node_modules/safe-buffer": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "license": "MIT" }, "node_modules/are-we-there-yet/node_modules/string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "license": "MIT", "dependencies": { @@ -20618,6 +20611,8 @@ }, "node_modules/code-point-at": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", "dev": true, "license": "MIT", "engines": { @@ -20777,6 +20772,8 @@ }, "node_modules/console-control-strings": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true, "license": "ISC" }, @@ -22863,6 +22860,9 @@ }, "node_modules/gauge": { "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", + "deprecated": "This package is no longer supported.", "dev": true, "license": "ISC", "dependencies": { @@ -22878,6 +22878,8 @@ }, "node_modules/gauge/node_modules/ansi-regex": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "license": "MIT", "engines": { @@ -22886,6 +22888,8 @@ }, "node_modules/gauge/node_modules/is-fullwidth-code-point": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dev": true, "license": "MIT", "dependencies": { @@ -22897,6 +22901,8 @@ }, "node_modules/gauge/node_modules/string-width": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dev": true, "license": "MIT", "dependencies": { @@ -22910,6 +22916,8 @@ }, "node_modules/gauge/node_modules/strip-ansi": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "license": "MIT", "dependencies": { @@ -23207,6 +23215,8 @@ }, "node_modules/has-unicode": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true, "license": "ISC" }, @@ -24848,9 +24858,7 @@ "license": "MIT" }, "node_modules/long": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz", - "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==", + "version": "5.3.2", "license": "Apache-2.0" }, "node_modules/lowercase-keys": { @@ -24888,11 +24896,6 @@ "undici": "^6.16.1" } }, - "node_modules/mac-system-proxy": { - "version": "1.0.4", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/magic-string": { "version": "0.30.0", "license": "MIT", @@ -25706,6 +25709,8 @@ }, "node_modules/noop-logger": { "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ==", "dev": true, "license": "MIT" }, @@ -25754,6 +25759,9 @@ }, "node_modules/npmlog": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "deprecated": "This package is no longer supported.", "dev": true, "license": "ISC", "dependencies": { @@ -25776,6 +25784,8 @@ }, "node_modules/number-is-nan": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", "dev": true, "license": "MIT", "engines": { @@ -25970,15 +25980,6 @@ "version": "0.3.0", "license": "MIT" }, - "node_modules/os-proxy-config": { - "version": "1.1.2", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "mac-system-proxy": "^1.0.0", - "windows-system-proxy": "^1.0.0" - } - }, "node_modules/p-cancelable": { "version": "2.1.1", "license": "MIT", @@ -26653,9 +26654,7 @@ "license": "MIT" }, "node_modules/protobufjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", - "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "version": "7.5.1", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { @@ -27122,6 +27121,8 @@ }, "node_modules/registry-js": { "version": "1.16.1", + "resolved": "https://registry.npmjs.org/registry-js/-/registry-js-1.16.1.tgz", + "integrity": "sha512-pQ2kD36lh+YNtpaXm6HCCb0QZtV/zQEeKnkfEIj5FDSpF/oFts7pwizEUkWSvP8IbGb4A4a5iBhhS9eUearMmQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -27132,6 +27133,8 @@ }, "node_modules/registry-js/node_modules/decompress-response": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", "dev": true, "license": "MIT", "dependencies": { @@ -27143,6 +27146,8 @@ }, "node_modules/registry-js/node_modules/detect-libc": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -27154,6 +27159,8 @@ }, "node_modules/registry-js/node_modules/mimic-response": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", "dev": true, "license": "MIT", "engines": { @@ -27165,6 +27172,8 @@ }, "node_modules/registry-js/node_modules/node-abi": { "version": "2.30.1", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", + "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==", "dev": true, "license": "MIT", "dependencies": { @@ -27173,11 +27182,15 @@ }, "node_modules/registry-js/node_modules/node-addon-api": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", "dev": true, "license": "MIT" }, "node_modules/registry-js/node_modules/prebuild-install": { "version": "5.3.6", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz", + "integrity": "sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==", "dev": true, "license": "MIT", "dependencies": { @@ -27206,6 +27219,8 @@ }, "node_modules/registry-js/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "license": "ISC", "bin": { @@ -27214,6 +27229,8 @@ }, "node_modules/registry-js/node_modules/simple-get": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", "dev": true, "license": "MIT", "dependencies": { @@ -28034,6 +28051,8 @@ }, "node_modules/set-blocking": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true, "license": "ISC" }, @@ -31110,6 +31129,8 @@ }, "node_modules/which-pm-runs": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", "dev": true, "license": "MIT", "engines": { @@ -31137,6 +31158,8 @@ }, "node_modules/wide-align": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, "license": "ISC", "dependencies": { @@ -31171,14 +31194,6 @@ "node": ">=4" } }, - "node_modules/windows-system-proxy": { - "version": "1.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "registry-js": "^1.15.1" - } - }, "node_modules/winston": { "version": "3.11.0", "license": "MIT", @@ -31292,9 +31307,8 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "version": "8.18.2", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -31629,7 +31643,7 @@ }, "packages/amazonq": { "name": "amazon-q-vscode", - "version": "1.68.0-SNAPSHOT", + "version": "1.89.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/packages/amazonq/test/e2e_new/amazonq/helpers/rulesHelper.ts b/packages/amazonq/test/e2e_new/amazonq/helpers/rulesHelper.ts new file mode 100644 index 00000000000..4fcd7fcd54f --- /dev/null +++ b/packages/amazonq/test/e2e_new/amazonq/helpers/rulesHelper.ts @@ -0,0 +1,106 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +import { WebviewView, By } from 'vscode-extension-tester' +import { sleep, waitForElement } from '../utils/generalUtils' + +/** + * Clicks the Rules button in the top bar + * @param webview The WebviewView instance + */ +export async function clickRulesButton(webview: WebviewView): Promise { + const chatPromptWrapper = await waitForElement(webview, By.css('.mynah-chat-prompt-wrapper')) + const topBar = await chatPromptWrapper.findElement(By.css('[data-testid="prompt-input-top-bar"]')) + const buttons = await topBar.findElements(By.css('.mynah-button.mynah-button-secondary')) + + for (const button of buttons) { + const labelElement = await button.findElement(By.css('.mynah-button-label')) + const text = await labelElement.getText() + if (text.trim() === 'Rules') { + await button.click() + return + } + } + throw new Error('Rules button not found') +} + +/** + * Clicks on "Create a new rule" option from the rules menu + * @param webview The WebviewView instance + */ +export async function clickCreateNewRuleOption(webview: WebviewView): Promise { + // needs a bit of time because the overlay has to load + await sleep(1000) + const overlayContainer = await waitForElement(webview, By.css('.mynah-overlay-container')) + const quickPickItems = await overlayContainer.findElements(By.css('[data-testid="prompt-input-quick-pick-item"]')) + + if (quickPickItems.length === 0) { + throw new Error('No quick pick items found') + } + const lastItem = quickPickItems[quickPickItems.length - 1] + const bdiElement = await lastItem.findElement(By.css('.mynah-detailed-list-item-description.ltr bdi')) + const text = await bdiElement.getText() + + if (text.trim() !== 'Create a new rule') { + throw new Error(`Expected "Create a new rule" but found "${text}"`) + } + await lastItem.click() +} + +/** + * Enters a rule name in the rule creation form + * @param webview The WebviewView instance + * @param ruleName The name of the rule + */ +export async function enterRuleName(webview: WebviewView, ruleName: string): Promise { + // needs a bit of time because the overlay has to load + await sleep(1000) + const sheetWrapper = await waitForElement(webview, By.css('[data-testid="sheet-wrapper"]')) + const ruleNameInput = await sheetWrapper.findElement(By.css('[data-testid="chat-item-form-item-text-input"]')) + + await ruleNameInput.clear() + await ruleNameInput.sendKeys(ruleName) +} + +/** + * Clicks the Create button in the rule creation form + * @param webview The WebviewView instance + */ +export async function clickCreateButton(webview: WebviewView): Promise { + const sheetWrapper = await waitForElement(webview, By.css('[data-testid="sheet-wrapper"]')) + const createButton = await sheetWrapper.findElement(By.xpath('.//button[@action-id="submit-create-rule"]')) + + await webview.getDriver().wait( + async () => { + const isDisabled = await createButton.getAttribute('disabled') + return isDisabled === null + }, + 5000, + 'Create button did not become enabled' + ) + + await createButton.click() +} + +/** + * Clicks the Cancel button in the rule creation form + * @param webview The WebviewView instance + */ +export async function clickCancelButton(webview: WebviewView): Promise { + const sheetWrapper = await waitForElement(webview, By.css('[data-testid="sheet-wrapper"]')) + const cancelButton = await sheetWrapper.findElement(By.xpath('.//button[@action-id="cancel-create-rule"]')) + await cancelButton.click() +} + +/** + * Creates a new rule with the specified name (complete workflow) + * @param webview The WebviewView instance + * @param ruleName The name of the rule to create + */ +export async function createNewRule(webview: WebviewView, ruleName: string): Promise { + await clickRulesButton(webview) + await clickCreateNewRuleOption(webview) + await enterRuleName(webview, ruleName) + await clickCreateButton(webview) +} diff --git a/packages/amazonq/test/e2e_new/amazonq/tests/rules.test.ts b/packages/amazonq/test/e2e_new/amazonq/tests/rules.test.ts new file mode 100644 index 00000000000..6b0042d9458 --- /dev/null +++ b/packages/amazonq/test/e2e_new/amazonq/tests/rules.test.ts @@ -0,0 +1,51 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +import '../utils/setup' +import { WebviewView, ActivityBar, DefaultTreeSection, SideBarView, VSBrowser } from 'vscode-extension-tester' +import { testContext } from '../utils/testContext' +import { createNewRule } from '../helpers/rulesHelper' +import path from 'path' +import { sleep } from '../utils/generalUtils' + +describe('Amazon Q Rules Functionality', function () { + // this timeout is the general timeout for the entire test suite + this.timeout(150000) + let webviewView: WebviewView + + before(async function () { + // we assume that we've left off on a webview from a previous test + webviewView = testContext.webviewView + await webviewView.switchBack() + + // the "rules" menu won't show unless we have a folder open + await VSBrowser.instance.openResources(path.join('..', 'utils', 'resources', 'testFolder')) + const explorerControl = await new ActivityBar().getViewControl('Explorer') + await explorerControl?.openView() + const view = new SideBarView() + const content = view.getContent() + const tree = (await content.getSection('testFolder')) as DefaultTreeSection + await tree.openItem('test-folder') + const workbench = testContext.workbench + await workbench.executeCommand('Amazon Q: Open Chat') + + // sleep is needed because the workbench needs some time to load + await sleep(5000) + const activityBar = new ActivityBar() + const amazonQControl = await activityBar.getViewControl('Amazon Q') + await amazonQControl?.openView() + + // sleep is needed because it takes time to switch to the AmazonQ webview + await sleep(5000) + webviewView = new WebviewView() + await webviewView.switchToFrame() + testContext.webviewView = webviewView + }) + + after(async function () {}) + + it('Rules Option Test', async () => { + await createNewRule(webviewView, 'testRule') + }) +}) diff --git a/packages/amazonq/test/e2e_new/amazonq/utils/generalUtils.ts b/packages/amazonq/test/e2e_new/amazonq/utils/generalUtils.ts index d4bfc20c702..86cb66acace 100644 --- a/packages/amazonq/test/e2e_new/amazonq/utils/generalUtils.ts +++ b/packages/amazonq/test/e2e_new/amazonq/utils/generalUtils.ts @@ -20,7 +20,7 @@ export async function sleep(timeout: number) { * @param timeout The timeout in milliseconds (Optional) * @returns Promise Returns the element found */ -export async function waitForElement(webview: WebviewView, locator: By, timeout?: number): Promise { +export async function waitForElement(webview: WebviewView, locator: By, timeout: number = 8000): Promise { const driver = webview.getDriver() await driver.wait(until.elementsLocated(locator), timeout) return await webview.findWebElement(locator) @@ -33,7 +33,11 @@ export async function waitForElement(webview: WebviewView, locator: By, timeout? * @param timeout The timeout in milliseconds (Optional) * @returns Promise Returns an array of elements found */ -export async function waitForElements(webview: WebviewView, locator: By, timeout?: number): Promise { +export async function waitForElements( + webview: WebviewView, + locator: By, + timeout: number = 8000 +): Promise { const driver = webview.getDriver() await driver.wait(until.elementsLocated(locator), timeout) return await webview.findWebElements(locator) @@ -91,7 +95,7 @@ export async function writeToChat(prompt: string, webview: WebviewView, send = t * @param timeout The timeout in milliseconds * @returns Promise True if a response was detected, false if timeout occurred */ -export async function waitForChatResponse(webview: WebviewView, timeout = 15000): Promise { +export async function waitForChatResponse(webview: WebviewView, timeout = 8000): Promise { const startTime = Date.now() while (Date.now() - startTime < timeout) { @@ -183,3 +187,23 @@ export async function findItemByText(items: WebElement[], text: string) { } throw new Error(`Item with text "${text}" not found`) } + +/** + * Prints the HTML content of a web element for debugging purposes + * @param element The WebElement to print HTML for + */ +export async function printElementHTML(element: WebElement): Promise { + const htmlContent = await element.getAttribute('outerHTML') + + const formattedHTML = htmlContent + .replace(/>\n<') + .replace(/\s+/g, ' ') + .split('\n') + .map((line) => line.trim()) + .filter((line) => line.length > 0) + .join('\n') + + console.log(`=== HTML CONTENT ===`) + console.log(formattedHTML) + console.log('=== END HTML ===') +} diff --git a/packages/amazonq/test/e2e_new/amazonq/utils/resources/testFolder/testFile b/packages/amazonq/test/e2e_new/amazonq/utils/resources/testFolder/testFile new file mode 100644 index 00000000000..e69de29bb2d