diff --git a/.eslintrc.yml b/.eslintrc.yml deleted file mode 100644 index f93e7df..0000000 --- a/.eslintrc.yml +++ /dev/null @@ -1,13 +0,0 @@ -env: - browser: true - es2021: true -extends: - - eslint:recommended - - plugin:@typescript-eslint/recommended -overrides: [] -parser: '@typescript-eslint/parser' -parserOptions: - ecmaVersion: latest -plugins: - - '@typescript-eslint' -rules: {} diff --git a/.gitignore b/.gitignore index 31aa9a9..66cf09d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ node_modules/ /playwright/.cache/ /screenshots/ /test-results/ -/LoginAuth.json \ No newline at end of file +/LoginAuth.json +/accessibility-results.json \ No newline at end of file diff --git a/accessibility-results.json b/accessibility-results.json index f91db8f..31bcd89 100644 --- a/accessibility-results.json +++ b/accessibility-results.json @@ -7,13 +7,13 @@ "name": "axe" }, "testEnvironment": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.6998.35 Safari/537.36", + "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.7103.25 Safari/537.36", "windowWidth": 1280, "windowHeight": 720, "orientationAngle": 0, "orientationType": "landscape-primary" }, - "timestamp": "2025-03-19T21:33:50.121Z", + "timestamp": "2025-05-15T08:33:27.334Z", "url": "https://ovcharski.com/shop/", "toolOptions": { "reporter": "v1" @@ -1525,9 +1525,9 @@ } ], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=120\"][aria-label=\"Add to cart: “Jenkins Captain”\"][data-product_id=\"120\"]" + ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=124\"][aria-label=\"Add to cart: “Jenkins Actor”\"][data-product_id=\"124\"]" ] }, { @@ -1551,9 +1551,9 @@ } ], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=75\"][data-product_id=\"75\"][data-product_sku=\"Woo-beanie-logo\"]" + ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=120\"][aria-label=\"Add to cart: “Jenkins Captain”\"][data-product_id=\"120\"]" ] }, { @@ -1577,9 +1577,9 @@ } ], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - "a[href=\"?add-to-cart=38\"]" + ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=75\"][data-product_id=\"75\"][data-product_sku=\"Woo-beanie-logo\"]" ] }, { @@ -1603,9 +1603,9 @@ } ], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - "a[href=\"?add-to-cart=22\"]" + "a[href=\"?add-to-cart=38\"]" ] }, { @@ -1629,9 +1629,9 @@ } ], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=124\"][aria-label=\"Add to cart: “Jenkins Actor”\"][data-product_id=\"124\"]" + "a[href=\"?add-to-cart=22\"]" ] }, { @@ -2358,9 +2358,9 @@ ], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=120\"][aria-label=\"Add to cart: “Jenkins Captain”\"][data-product_id=\"120\"]" + ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=124\"][aria-label=\"Add to cart: “Jenkins Actor”\"][data-product_id=\"124\"]" ] }, { @@ -2376,9 +2376,9 @@ ], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=75\"][data-product_id=\"75\"][data-product_sku=\"Woo-beanie-logo\"]" + ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=120\"][aria-label=\"Add to cart: “Jenkins Captain”\"][data-product_id=\"120\"]" ] }, { @@ -2394,9 +2394,9 @@ ], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - "a[href=\"?add-to-cart=38\"]" + ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=75\"][data-product_id=\"75\"][data-product_sku=\"Woo-beanie-logo\"]" ] }, { @@ -2412,9 +2412,9 @@ ], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - "a[href=\"?add-to-cart=22\"]" + "a[href=\"?add-to-cart=38\"]" ] }, { @@ -2430,9 +2430,9 @@ ], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=124\"][aria-label=\"Add to cart: “Jenkins Actor”\"][data-product_id=\"124\"]" + "a[href=\"?add-to-cart=22\"]" ] }, { @@ -2626,7 +2626,7 @@ "all": [], "none": [], "impact": null, - "html": "", + "html": "", "target": [ "body" ] @@ -3382,7 +3382,7 @@ "impact": null, "html": "Sale", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-link > .wc-block-grid__product-onsale > span[aria-hidden=\"true\"]" + ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-link > .wc-block-grid__product-onsale > span[aria-hidden=\"true\"]" ] }, { @@ -3414,7 +3414,7 @@ "impact": null, "html": "20,00 лв.", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > del" + ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-price.price > del" ] }, { @@ -3446,7 +3446,7 @@ "impact": null, "html": "18,00 лв.", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > ins" + ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-price.price > ins" ] }, { @@ -3478,7 +3478,7 @@ "impact": null, "html": "Sale", "target": [ - ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-link > .wc-block-grid__product-onsale > span[aria-hidden=\"true\"]" + ".wc-block-grid__product:nth-child(9) > .wc-block-grid__product-link > .wc-block-grid__product-onsale > span[aria-hidden=\"true\"]" ] }, { @@ -3510,7 +3510,7 @@ "impact": null, "html": "20,00 лв.", "target": [ - ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-price.price > del" + ".wc-block-grid__product:nth-child(9) > .wc-block-grid__product-price.price > del" ] }, { @@ -3542,7 +3542,7 @@ "impact": null, "html": "18,00 лв.", "target": [ - ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-price.price > ins" + ".wc-block-grid__product:nth-child(9) > .wc-block-grid__product-price.price > ins" ] }, { @@ -3574,7 +3574,7 @@ "impact": null, "html": "Sale", "target": [ - ".wc-block-grid__product:nth-child(9) > .wc-block-grid__product-link > .wc-block-grid__product-onsale > span[aria-hidden=\"true\"]" + ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-link > .wc-block-grid__product-onsale > span[aria-hidden=\"true\"]" ] }, { @@ -3606,7 +3606,7 @@ "impact": null, "html": "25,00 лв.", "target": [ - ".wc-block-grid__product:nth-child(9) > .wc-block-grid__product-price.price > del" + ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-price.price > del" ] }, { @@ -3638,7 +3638,7 @@ "impact": null, "html": "20,00 лв.", "target": [ - ".wc-block-grid__product:nth-child(9) > .wc-block-grid__product-price.price > ins" + ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-price.price > ins" ] } ] @@ -4174,9 +4174,9 @@ } ], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=120\"][aria-label=\"Add to cart: “Jenkins Captain”\"][data-product_id=\"120\"]" + ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=124\"][aria-label=\"Add to cart: “Jenkins Actor”\"][data-product_id=\"124\"]" ] }, { @@ -4192,9 +4192,9 @@ } ], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=75\"][data-product_id=\"75\"][data-product_sku=\"Woo-beanie-logo\"]" + ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=120\"][aria-label=\"Add to cart: “Jenkins Captain”\"][data-product_id=\"120\"]" ] }, { @@ -4210,9 +4210,9 @@ } ], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - "a[href=\"?add-to-cart=38\"]" + ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=75\"][data-product_id=\"75\"][data-product_sku=\"Woo-beanie-logo\"]" ] }, { @@ -4228,9 +4228,9 @@ } ], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - "a[href=\"?add-to-cart=22\"]" + "a[href=\"?add-to-cart=38\"]" ] }, { @@ -4246,9 +4246,9 @@ } ], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=124\"][aria-label=\"Add to cart: “Jenkins Actor”\"][data-product_id=\"124\"]" + "a[href=\"?add-to-cart=22\"]" ] }, { @@ -5558,9 +5558,9 @@ ], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=120\"][aria-label=\"Add to cart: “Jenkins Captain”\"][data-product_id=\"120\"]" + ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=124\"][aria-label=\"Add to cart: “Jenkins Actor”\"][data-product_id=\"124\"]" ] }, { @@ -5590,9 +5590,9 @@ ], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=75\"][data-product_id=\"75\"][data-product_sku=\"Woo-beanie-logo\"]" + ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=120\"][aria-label=\"Add to cart: “Jenkins Captain”\"][data-product_id=\"120\"]" ] }, { @@ -5622,9 +5622,9 @@ ], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - "a[href=\"?add-to-cart=38\"]" + ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=75\"][data-product_id=\"75\"][data-product_sku=\"Woo-beanie-logo\"]" ] }, { @@ -5654,9 +5654,9 @@ ], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - "a[href=\"?add-to-cart=22\"]" + "a[href=\"?add-to-cart=38\"]" ] }, { @@ -5686,9 +5686,9 @@ ], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=124\"][aria-label=\"Add to cart: “Jenkins Actor”\"][data-product_id=\"124\"]" + "a[href=\"?add-to-cart=22\"]" ] }, { @@ -6288,9 +6288,9 @@ "all": [], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=120\"][aria-label=\"Add to cart: “Jenkins Captain”\"][data-product_id=\"120\"]" + ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=124\"][aria-label=\"Add to cart: “Jenkins Actor”\"][data-product_id=\"124\"]" ] }, { @@ -6306,9 +6306,9 @@ "all": [], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=75\"][data-product_id=\"75\"][data-product_sku=\"Woo-beanie-logo\"]" + ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=120\"][aria-label=\"Add to cart: “Jenkins Captain”\"][data-product_id=\"120\"]" ] }, { @@ -6324,9 +6324,9 @@ "all": [], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - "a[href=\"?add-to-cart=38\"]" + ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=75\"][data-product_id=\"75\"][data-product_sku=\"Woo-beanie-logo\"]" ] }, { @@ -6342,9 +6342,9 @@ "all": [], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - "a[href=\"?add-to-cart=22\"]" + "a[href=\"?add-to-cart=38\"]" ] }, { @@ -6360,9 +6360,9 @@ "all": [], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=124\"][aria-label=\"Add to cart: “Jenkins Actor”\"][data-product_id=\"124\"]" + "a[href=\"?add-to-cart=22\"]" ] }, { @@ -6842,7 +6842,7 @@ "all": [], "none": [], "impact": null, - "html": "36,00 лв.", + "html": "12,00 лв.", "target": [ ".cart-contents > .woocommerce-Price-amount.amount" ] @@ -7819,7 +7819,7 @@ "impact": null, "html": "22,00 лв.", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > .woocommerce-Price-amount.amount" + ".wp-block-product-new > .wc-block-grid__products > .wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > .woocommerce-Price-amount.amount" ] }, { @@ -7844,7 +7844,7 @@ "impact": null, "html": "лв.", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > .woocommerce-Price-amount.amount > .woocommerce-Price-currencySymbol" + ".wp-block-product-new > .wc-block-grid__products > .wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > .woocommerce-Price-amount.amount > .woocommerce-Price-currencySymbol" ] }, { @@ -9417,7 +9417,7 @@ "all": [], "none": [], "impact": null, - "html": "
Jenkins Captain
", + "html": "
Jenkins Actor
", "target": [ ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(6) > .wc-block-grid__product-link > .wc-block-grid__product-title" ] @@ -9442,7 +9442,7 @@ "all": [], "none": [], "impact": null, - "html": "25,00 лв.", + "html": "20,00 лв.", "target": [ ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(6) > .wc-block-grid__product-price.price > .woocommerce-Price-amount.amount" ] @@ -9492,34 +9492,9 @@ "all": [], "none": [], "impact": null, - "html": "Add to cart", - "target": [ - ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=120\"][aria-label=\"Add to cart: “Jenkins Captain”\"][data-product_id=\"120\"]" - ] - }, - { - "any": [ - { - "id": "color-contrast", - "data": { - "fgColor": "#43454b", - "bgColor": "#ffffff", - "contrastRatio": 9.58, - "fontSize": "5.3pt (7px)", - "fontWeight": "normal", - "expectedContrastRatio": "4.5:1" - }, - "relatedNodes": [], - "impact": "serious", - "message": "Element has sufficient color contrast of 9.58" - } - ], - "all": [], - "none": [], - "impact": null, - "html": "Sale", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-link > .wc-block-grid__product-onsale > span[aria-hidden=\"true\"]" + ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=124\"][aria-label=\"Add to cart: “Jenkins Actor”\"][data-product_id=\"124\"]" ] }, { @@ -9542,7 +9517,7 @@ "all": [], "none": [], "impact": null, - "html": "
Beanie with Logo
", + "html": "
Jenkins Captain
", "target": [ ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(7) > .wc-block-grid__product-link > .wc-block-grid__product-title" ] @@ -9567,9 +9542,9 @@ "all": [], "none": [], "impact": null, - "html": "18,00 лв.", + "html": "25,00 лв.", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > ins > .woocommerce-Price-amount.amount" + ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > .woocommerce-Price-amount.amount" ] }, { @@ -9594,7 +9569,7 @@ "impact": null, "html": "лв.", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > ins > .woocommerce-Price-amount.amount > .woocommerce-Price-currencySymbol" + ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > .woocommerce-Price-amount.amount > .woocommerce-Price-currencySymbol" ] }, { @@ -9617,9 +9592,9 @@ "all": [], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=75\"][data-product_id=\"75\"][data-product_sku=\"Woo-beanie-logo\"]" + ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=120\"][aria-label=\"Add to cart: “Jenkins Captain”\"][data-product_id=\"120\"]" ] }, { @@ -9667,7 +9642,7 @@ "all": [], "none": [], "impact": null, - "html": "
Beanie
", + "html": "
Beanie with Logo
", "target": [ ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(8) > .wc-block-grid__product-link > .wc-block-grid__product-title" ] @@ -9742,9 +9717,9 @@ "all": [], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - "a[href=\"?add-to-cart=38\"]" + ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=75\"][data-product_id=\"75\"][data-product_sku=\"Woo-beanie-logo\"]" ] }, { @@ -9792,7 +9767,7 @@ "all": [], "none": [], "impact": null, - "html": "
Shirt – Green
", + "html": "
Beanie
", "target": [ ".wc-block-grid__product:nth-child(9) > .wc-block-grid__product-link > .wc-block-grid__product-title" ] @@ -9817,7 +9792,7 @@ "all": [], "none": [], "impact": null, - "html": "20,00 лв.", + "html": "18,00 лв.", "target": [ ".wc-block-grid__product:nth-child(9) > .wc-block-grid__product-price.price > ins > .woocommerce-Price-amount.amount" ] @@ -9867,9 +9842,34 @@ "all": [], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - "a[href=\"?add-to-cart=22\"]" + "a[href=\"?add-to-cart=38\"]" + ] + }, + { + "any": [ + { + "id": "color-contrast", + "data": { + "fgColor": "#43454b", + "bgColor": "#ffffff", + "contrastRatio": 9.58, + "fontSize": "5.3pt (7px)", + "fontWeight": "normal", + "expectedContrastRatio": "4.5:1" + }, + "relatedNodes": [], + "impact": "serious", + "message": "Element has sufficient color contrast of 9.58" + } + ], + "all": [], + "none": [], + "impact": null, + "html": "Sale", + "target": [ + ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-link > .wc-block-grid__product-onsale > span[aria-hidden=\"true\"]" ] }, { @@ -9892,7 +9892,7 @@ "all": [], "none": [], "impact": null, - "html": "
Jenkins Actor
", + "html": "
Shirt – Green
", "target": [ ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-link > .wc-block-grid__product-title" ] @@ -9919,7 +9919,7 @@ "impact": null, "html": "20,00 лв.", "target": [ - ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-price.price > .woocommerce-Price-amount.amount" + ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-price.price > ins > .woocommerce-Price-amount.amount" ] }, { @@ -9944,7 +9944,7 @@ "impact": null, "html": "лв.", "target": [ - ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-price.price > .woocommerce-Price-amount.amount > .woocommerce-Price-currencySymbol" + ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-price.price > ins > .woocommerce-Price-amount.amount > .woocommerce-Price-currencySymbol" ] }, { @@ -9967,9 +9967,9 @@ "all": [], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=124\"][aria-label=\"Add to cart: “Jenkins Actor”\"][data-product_id=\"124\"]" + "a[href=\"?add-to-cart=22\"]" ] }, { @@ -11601,9 +11601,9 @@ } ], "impact": null, - "html": "\"Jenkins", + "html": "\"Jenkins", "target": [ - ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Jenkins Captain\"]" + ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Jenkins Actor\"]" ] }, { @@ -11627,9 +11627,9 @@ } ], "impact": null, - "html": "\"Beanie", + "html": "\"Jenkins", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Beanie with Logo\"]" + ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Jenkins Captain\"]" ] }, { @@ -11653,9 +11653,9 @@ } ], "impact": null, - "html": "\"Beanie\"", + "html": "\"Beanie", "target": [ - "img[alt=\"Beanie\"]" + ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Beanie with Logo\"]" ] }, { @@ -11679,9 +11679,9 @@ } ], "impact": null, - "html": "\"Shirt", + "html": "\"Beanie\"", "target": [ - "img[alt=\"Shirt - Green\"]" + "img[alt=\"Beanie\"]" ] }, { @@ -11705,9 +11705,9 @@ } ], "impact": null, - "html": "\"Jenkins", + "html": "\"Shirt", "target": [ - ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Jenkins Actor\"]" + "img[alt=\"Shirt - Green\"]" ] }, { @@ -12024,7 +12024,7 @@ "impact": null, "html": "\"Beanie", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Beanie with Logo\"]" + ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Beanie with Logo\"]" ] }, { @@ -13131,7 +13131,7 @@ } ], "impact": null, - "html": " 36,00 лв. 3 items ", + "html": " 12,00 лв. 1 item ", "target": [ ".cart-contents" ] @@ -14495,7 +14495,7 @@ } ], "impact": null, - "html": "", + "html": "", "target": [ ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(6) > .wc-block-grid__product-link" ] @@ -14528,9 +14528,9 @@ } ], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=120\"][aria-label=\"Add to cart: “Jenkins Captain”\"][data-product_id=\"120\"]" + ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=124\"][aria-label=\"Add to cart: “Jenkins Actor”\"][data-product_id=\"124\"]" ] }, { @@ -14554,7 +14554,7 @@ } ], "impact": null, - "html": "", + "html": "", "target": [ ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(7) > .wc-block-grid__product-link" ] @@ -14587,9 +14587,9 @@ } ], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=75\"][data-product_id=\"75\"][data-product_sku=\"Woo-beanie-logo\"]" + ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=120\"][aria-label=\"Add to cart: “Jenkins Captain”\"][data-product_id=\"120\"]" ] }, { @@ -14613,7 +14613,7 @@ } ], "impact": null, - "html": "", + "html": "", "target": [ ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(8) > .wc-block-grid__product-link" ] @@ -14646,9 +14646,9 @@ } ], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - "a[href=\"?add-to-cart=38\"]" + ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=75\"][data-product_id=\"75\"][data-product_sku=\"Woo-beanie-logo\"]" ] }, { @@ -14672,7 +14672,7 @@ } ], "impact": null, - "html": "", + "html": "", "target": [ ".wc-block-grid__product:nth-child(9) > .wc-block-grid__product-link" ] @@ -14705,9 +14705,9 @@ } ], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - "a[href=\"?add-to-cart=22\"]" + "a[href=\"?add-to-cart=38\"]" ] }, { @@ -14731,7 +14731,7 @@ } ], "impact": null, - "html": "", + "html": "", "target": [ ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-link" ] @@ -14764,9 +14764,9 @@ } ], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=124\"][aria-label=\"Add to cart: “Jenkins Actor”\"][data-product_id=\"124\"]" + "a[href=\"?add-to-cart=22\"]" ] }, { @@ -15469,7 +15469,7 @@ "all": [], "none": [], "impact": null, - "html": "
  • 36,00 лв. 3 items
  • ", + "html": "
  • 12,00 лв. 1 item
  • ", "target": [ "#site-header-cart > li:nth-child(1)" ] @@ -16615,9 +16615,9 @@ "all": [], "none": [], "impact": null, - "html": "\"Jenkins", + "html": "\"Jenkins", "target": [ - ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Jenkins Captain\"]" + ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Jenkins Actor\"]" ] }, { @@ -16633,9 +16633,9 @@ "all": [], "none": [], "impact": null, - "html": "\"Beanie", + "html": "\"Jenkins", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Beanie with Logo\"]" + ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Jenkins Captain\"]" ] }, { @@ -16651,9 +16651,9 @@ "all": [], "none": [], "impact": null, - "html": "\"Beanie\"", + "html": "\"Beanie", "target": [ - "img[alt=\"Beanie\"]" + ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Beanie with Logo\"]" ] }, { @@ -16669,9 +16669,9 @@ "all": [], "none": [], "impact": null, - "html": "\"Shirt", + "html": "\"Beanie\"", "target": [ - "img[alt=\"Shirt - Green\"]" + "img[alt=\"Beanie\"]" ] }, { @@ -16687,9 +16687,9 @@ "all": [], "none": [], "impact": null, - "html": "\"Jenkins", + "html": "\"Shirt", "target": [ - ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Jenkins Actor\"]" + "img[alt=\"Shirt - Green\"]" ] }, { @@ -18035,7 +18035,7 @@ "all": [], "none": [], "impact": null, - "html": "
  • 36,00 лв. 3 items
  • ", + "html": "
  • 12,00 лв. 1 item
  • ", "target": [ "#site-header-cart > li:nth-child(1)" ] @@ -18055,7 +18055,7 @@ "all": [], "none": [], "impact": null, - "html": " 36,00 лв. 3 items ", + "html": " 12,00 лв. 1 item ", "target": [ ".cart-contents" ] @@ -18075,7 +18075,7 @@ "all": [], "none": [], "impact": null, - "html": "36,00 лв.", + "html": "12,00 лв.", "target": [ ".cart-contents > .woocommerce-Price-amount.amount" ] @@ -18115,7 +18115,7 @@ "all": [], "none": [], "impact": null, - "html": "3 items", + "html": "1 item", "target": [ ".cart-contents > .count" ] @@ -18475,7 +18475,7 @@ "all": [], "none": [], "impact": null, - "html": "
    Go shopping
    ", + "html": "
    Go shopping
    ", "target": [ ".wp-block-buttons" ] @@ -20417,7 +20417,7 @@ "impact": null, "html": "22,00 лв.", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > .woocommerce-Price-amount.amount" + ".wp-block-product-new > .wc-block-grid__products > .wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > .woocommerce-Price-amount.amount" ] }, { @@ -20437,7 +20437,7 @@ "impact": null, "html": "лв.", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > .woocommerce-Price-amount.amount > .woocommerce-Price-currencySymbol" + ".wp-block-product-new > .wc-block-grid__products > .wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > .woocommerce-Price-amount.amount > .woocommerce-Price-currencySymbol" ] }, { @@ -23535,7 +23535,7 @@ "all": [], "none": [], "impact": null, - "html": "", + "html": "", "target": [ ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(6) > .wc-block-grid__product-link" ] @@ -23575,9 +23575,9 @@ "all": [], "none": [], "impact": null, - "html": "\"Jenkins", + "html": "\"Jenkins", "target": [ - ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Jenkins Captain\"]" + ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Jenkins Actor\"]" ] }, { @@ -23595,7 +23595,7 @@ "all": [], "none": [], "impact": null, - "html": "
    Jenkins Captain
    ", + "html": "
    Jenkins Actor
    ", "target": [ ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(6) > .wc-block-grid__product-link > .wc-block-grid__product-title" ] @@ -23615,7 +23615,7 @@ "all": [], "none": [], "impact": null, - "html": "
    25,00 лв.
    ", + "html": "
    20,00 лв.
    ", "target": [ ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(6) > .wc-block-grid__product-price.price" ] @@ -23635,7 +23635,7 @@ "all": [], "none": [], "impact": null, - "html": "25,00 лв.", + "html": "20,00 лв.", "target": [ ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(6) > .wc-block-grid__product-price.price > .woocommerce-Price-amount.amount" ] @@ -23695,9 +23695,9 @@ "all": [], "none": [], "impact": null, - "html": "
    Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=120\"][aria-label=\"Add to cart: “Jenkins Captain”\"][data-product_id=\"120\"]" + ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=124\"][aria-label=\"Add to cart: “Jenkins Actor”\"][data-product_id=\"124\"]" ] }, { @@ -23735,51 +23735,11 @@ "all": [], "none": [], "impact": null, - "html": "", + "html": "", "target": [ ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(7) > .wc-block-grid__product-link" ] }, - { - "any": [ - { - "id": "region", - "data": { - "isIframe": false - }, - "relatedNodes": [], - "impact": "moderate", - "message": "All page content is contained by landmarks" - } - ], - "all": [], - "none": [], - "impact": null, - "html": "
    Sale Product on sale
    ", - "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-link > .wc-block-grid__product-onsale" - ] - }, - { - "any": [ - { - "id": "region", - "data": { - "isIframe": false - }, - "relatedNodes": [], - "impact": "moderate", - "message": "All page content is contained by landmarks" - } - ], - "all": [], - "none": [], - "impact": null, - "html": "Product on sale", - "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-link > .wc-block-grid__product-onsale > .screen-reader-text" - ] - }, { "any": [ { @@ -23815,9 +23775,9 @@ "all": [], "none": [], "impact": null, - "html": "\"Beanie", + "html": "\"Jenkins", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Beanie with Logo\"]" + ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Jenkins Captain\"]" ] }, { @@ -23835,7 +23795,7 @@ "all": [], "none": [], "impact": null, - "html": "
    Beanie with Logo
    ", + "html": "
    Jenkins Captain
    ", "target": [ ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(7) > .wc-block-grid__product-link > .wc-block-grid__product-title" ] @@ -23855,7 +23815,7 @@ "all": [], "none": [], "impact": null, - "html": "
    ", + "html": "
    25,00 лв.
    ", "target": [ ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price" ] @@ -23875,9 +23835,9 @@ "all": [], "none": [], "impact": null, - "html": "Original price was: 20,00 лв..", + "html": "25,00 лв.", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > .screen-reader-text:nth-child(2)" + ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > .woocommerce-Price-amount.amount" ] }, { @@ -23895,9 +23855,9 @@ "all": [], "none": [], "impact": null, - "html": "Current price is: 18,00 лв..", + "html": "лв.", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > .screen-reader-text:nth-child(4)" + ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > .woocommerce-Price-amount.amount > .woocommerce-Price-currencySymbol" ] }, { @@ -23935,9 +23895,9 @@ "all": [], "none": [], "impact": null, - "html": "
    Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=75\"][data-product_id=\"75\"][data-product_sku=\"Woo-beanie-logo\"]" + ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=120\"][aria-label=\"Add to cart: “Jenkins Captain”\"][data-product_id=\"120\"]" ] }, { @@ -23975,7 +23935,7 @@ "all": [], "none": [], "impact": null, - "html": "", + "html": "", "target": [ ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(8) > .wc-block-grid__product-link" ] @@ -24055,9 +24015,9 @@ "all": [], "none": [], "impact": null, - "html": "\"Beanie\"", + "html": "\"Beanie", "target": [ - "img[alt=\"Beanie\"]" + ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Beanie with Logo\"]" ] }, { @@ -24075,7 +24035,7 @@ "all": [], "none": [], "impact": null, - "html": "
    Beanie
    ", + "html": "
    Beanie with Logo
    ", "target": [ ".wp-block-product-best-sellers > .wc-block-grid__products > .wc-block-grid__product:nth-child(8) > .wc-block-grid__product-link > .wc-block-grid__product-title" ] @@ -24175,9 +24135,9 @@ "all": [], "none": [], "impact": null, - "html": "
    Add to cart", + "html": "Add to cart", "target": [ - "a[href=\"?add-to-cart=38\"]" + ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=75\"][data-product_id=\"75\"][data-product_sku=\"Woo-beanie-logo\"]" ] }, { @@ -24215,7 +24175,7 @@ "all": [], "none": [], "impact": null, - "html": "", + "html": "", "target": [ ".wc-block-grid__product:nth-child(9) > .wc-block-grid__product-link" ] @@ -24295,9 +24255,9 @@ "all": [], "none": [], "impact": null, - "html": "\"Shirt", + "html": "\"Beanie\"", "target": [ - "img[alt=\"Shirt - Green\"]" + "img[alt=\"Beanie\"]" ] }, { @@ -24315,7 +24275,7 @@ "all": [], "none": [], "impact": null, - "html": "
    Shirt – Green
    ", + "html": "
    Beanie
    ", "target": [ ".wc-block-grid__product:nth-child(9) > .wc-block-grid__product-link > .wc-block-grid__product-title" ] @@ -24355,7 +24315,7 @@ "all": [], "none": [], "impact": null, - "html": "Original price was: 25,00 лв..", + "html": "Original price was: 20,00 лв..", "target": [ ".wc-block-grid__product:nth-child(9) > .wc-block-grid__product-price.price > .screen-reader-text:nth-child(2)" ] @@ -24375,7 +24335,7 @@ "all": [], "none": [], "impact": null, - "html": "Current price is: 20,00 лв..", + "html": "Current price is: 18,00 лв..", "target": [ ".wc-block-grid__product:nth-child(9) > .wc-block-grid__product-price.price > .screen-reader-text:nth-child(4)" ] @@ -24415,9 +24375,9 @@ "all": [], "none": [], "impact": null, - "html": "
    Add to cart", + "html": "Add to cart", "target": [ - "a[href=\"?add-to-cart=22\"]" + "a[href=\"?add-to-cart=38\"]" ] }, { @@ -24455,11 +24415,51 @@ "all": [], "none": [], "impact": null, - "html": "", + "html": "", "target": [ ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-link" ] }, + { + "any": [ + { + "id": "region", + "data": { + "isIframe": false + }, + "relatedNodes": [], + "impact": "moderate", + "message": "All page content is contained by landmarks" + } + ], + "all": [], + "none": [], + "impact": null, + "html": "
    Sale Product on sale
    ", + "target": [ + ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-link > .wc-block-grid__product-onsale" + ] + }, + { + "any": [ + { + "id": "region", + "data": { + "isIframe": false + }, + "relatedNodes": [], + "impact": "moderate", + "message": "All page content is contained by landmarks" + } + ], + "all": [], + "none": [], + "impact": null, + "html": "Product on sale", + "target": [ + ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-link > .wc-block-grid__product-onsale > .screen-reader-text" + ] + }, { "any": [ { @@ -24495,9 +24495,9 @@ "all": [], "none": [], "impact": null, - "html": "\"Jenkins", + "html": "\"Shirt", "target": [ - ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Jenkins Actor\"]" + "img[alt=\"Shirt - Green\"]" ] }, { @@ -24515,7 +24515,7 @@ "all": [], "none": [], "impact": null, - "html": "
    Jenkins Actor
    ", + "html": "
    Shirt – Green
    ", "target": [ ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-link > .wc-block-grid__product-title" ] @@ -24535,7 +24535,7 @@ "all": [], "none": [], "impact": null, - "html": "
    20,00 лв.
    ", + "html": "
    ", "target": [ ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-price.price" ] @@ -24555,9 +24555,9 @@ "all": [], "none": [], "impact": null, - "html": "20,00 лв.", + "html": "Original price was: 25,00 лв..", "target": [ - ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-price.price > .woocommerce-Price-amount.amount" + ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-price.price > .screen-reader-text:nth-child(2)" ] }, { @@ -24575,9 +24575,9 @@ "all": [], "none": [], "impact": null, - "html": "лв.", + "html": "Current price is: 20,00 лв..", "target": [ - ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-price.price > .woocommerce-Price-amount.amount > .woocommerce-Price-currencySymbol" + ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-price.price > .screen-reader-text:nth-child(4)" ] }, { @@ -24615,9 +24615,9 @@ "all": [], "none": [], "impact": null, - "html": "Add to cart", + "html": "Add to cart", "target": [ - ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-add-to-cart.wp-block-button > a[href=\"?add-to-cart=124\"][aria-label=\"Add to cart: “Jenkins Actor”\"][data-product_id=\"124\"]" + "a[href=\"?add-to-cart=22\"]" ] }, { @@ -25211,7 +25211,7 @@ "all": [], "none": [], "impact": "serious", - "html": "3 items", + "html": "1 item", "target": [ ".cart-contents > .count" ], @@ -25317,7 +25317,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25351,7 +25351,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25385,7 +25385,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25419,7 +25419,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25453,7 +25453,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25487,7 +25487,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25521,7 +25521,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25555,7 +25555,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25589,7 +25589,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25623,7 +25623,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25657,7 +25657,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25691,7 +25691,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25725,7 +25725,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25759,7 +25759,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25793,7 +25793,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25808,7 +25808,7 @@ "impact": "serious", "html": "20,00 лв.", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > del > .woocommerce-Price-amount.amount" + ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-price.price > del > .woocommerce-Price-amount.amount" ], "failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 2.55 (foreground color: #a1a2a5, background color: #ffffff, font size: 6.0pt (8px), font weight: normal). Expected contrast ratio of 4.5:1" }, @@ -25827,7 +25827,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25842,7 +25842,7 @@ "impact": "serious", "html": "лв.", "target": [ - ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-price.price > del > .woocommerce-Price-amount.amount > .woocommerce-Price-currencySymbol" + ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-price.price > del > .woocommerce-Price-amount.amount > .woocommerce-Price-currencySymbol" ], "failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 2.55 (foreground color: #a1a2a5, background color: #ffffff, font size: 6.0pt (8px), font weight: normal). Expected contrast ratio of 4.5:1" }, @@ -25861,7 +25861,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25876,7 +25876,7 @@ "impact": "serious", "html": "20,00 лв.", "target": [ - ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-price.price > del > .woocommerce-Price-amount.amount" + ".wc-block-grid__product:nth-child(9) > .wc-block-grid__product-price.price > del > .woocommerce-Price-amount.amount" ], "failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 2.55 (foreground color: #a1a2a5, background color: #ffffff, font size: 6.0pt (8px), font weight: normal). Expected contrast ratio of 4.5:1" }, @@ -25895,7 +25895,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25910,7 +25910,7 @@ "impact": "serious", "html": "лв.", "target": [ - ".wc-block-grid__product:nth-child(8) > .wc-block-grid__product-price.price > del > .woocommerce-Price-amount.amount > .woocommerce-Price-currencySymbol" + ".wc-block-grid__product:nth-child(9) > .wc-block-grid__product-price.price > del > .woocommerce-Price-amount.amount > .woocommerce-Price-currencySymbol" ], "failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 2.55 (foreground color: #a1a2a5, background color: #ffffff, font size: 6.0pt (8px), font weight: normal). Expected contrast ratio of 4.5:1" }, @@ -25929,7 +25929,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25944,7 +25944,7 @@ "impact": "serious", "html": "25,00 лв.", "target": [ - ".wc-block-grid__product:nth-child(9) > .wc-block-grid__product-price.price > del > .woocommerce-Price-amount.amount" + ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-price.price > del > .woocommerce-Price-amount.amount" ], "failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 2.55 (foreground color: #a1a2a5, background color: #ffffff, font size: 6.0pt (8px), font weight: normal). Expected contrast ratio of 4.5:1" }, @@ -25963,7 +25963,7 @@ }, "relatedNodes": [ { - "html": "", + "html": "", "target": [ "body" ] @@ -25978,7 +25978,7 @@ "impact": "serious", "html": "лв.", "target": [ - ".wc-block-grid__product:nth-child(9) > .wc-block-grid__product-price.price > del > .woocommerce-Price-amount.amount > .woocommerce-Price-currencySymbol" + ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-price.price > del > .woocommerce-Price-amount.amount > .woocommerce-Price-currencySymbol" ], "failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 2.55 (foreground color: #a1a2a5, background color: #ffffff, font size: 6.0pt (8px), font weight: normal). Expected contrast ratio of 4.5:1" } @@ -26255,9 +26255,9 @@ } ], "impact": "minor", - "html": "\"Jenkins", + "html": "\"Jenkins", "target": [ - ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Jenkins Captain\"]" + ".wc-block-grid__product:nth-child(6) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Jenkins Actor\"]" ], "failureSummary": "Fix all of the following:\n Element contains element with alt text that duplicates existing text" }, @@ -26274,9 +26274,9 @@ } ], "impact": "minor", - "html": "\"Jenkins", + "html": "\"Jenkins", "target": [ - ".wc-block-grid__product:nth-child(10) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Jenkins Actor\"]" + ".wc-block-grid__product:nth-child(7) > .wc-block-grid__product-link > .wc-block-grid__product-image > .attachment-woocommerce_thumbnail.size-woocommerce_thumbnail[alt=\"Jenkins Captain\"]" ], "failureSummary": "Fix all of the following:\n Element contains element with alt text that duplicates existing text" }, diff --git a/eslint.config.cjs b/eslint.config.cjs new file mode 100644 index 0000000..d0b6804 --- /dev/null +++ b/eslint.config.cjs @@ -0,0 +1,43 @@ +const { defineConfig } = require("eslint/config"); +const js = require("@eslint/js"); +const globals = require("globals"); +const tsPlugin = require("@typescript-eslint/eslint-plugin"); +const tsParser = require("@typescript-eslint/parser"); + +module.exports = defineConfig([ + + { + ignores: ["playwright-report/**"] + }, + // 1) JavaScript files + { + files: ["**/*.{js,mjs,cjs}"], + extends: [ js.configs.recommended ], // built-in JS rules + languageOptions: { + globals: globals.browser, + }, + }, + + // 2) TypeScript files + { + files: ["**/*.{ts,tsx}"], + languageOptions: { + parser: tsParser, // use the TS parser + parserOptions: { + ecmaFeatures: { modules: true }, + ecmaVersion: "latest", + project: "./tsconfig.json", + }, + }, + plugins: { + "@typescript-eslint": tsPlugin, // long name + ts: tsPlugin, // short alias + }, + rules: { + // core ESLint rules tweaked for TS: + ...tsPlugin.configs["eslint-recommended"].rules, + // full TS-specific recommended rules: + ...tsPlugin.configs.recommended.rules, + }, + }, +]); diff --git a/package-lock.json b/package-lock.json index 6ba832a..9398c30 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,13 +15,15 @@ "csvtojson": "^2.0.10" }, "devDependencies": { + "@eslint/js": "^9.26.0", "@faker-js/faker": "^9.2.0", - "@playwright/test": "^1.51.0", + "@playwright/test": "^1.52.0", "@types/node": "^22.10.9", - "@typescript-eslint/eslint-plugin": "^8.17.0", - "@typescript-eslint/parser": "^8.17.0", + "@typescript-eslint/eslint-plugin": "^8.32.1", + "@typescript-eslint/parser": "^8.32.1", "dotenv": "^16.4.7", - "eslint": "^9.16.0" + "eslint": "^9.26.0", + "globals": "^16.1.0" } }, "node_modules/@axe-core/playwright": { @@ -37,9 +39,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, "license": "MIT", "dependencies": { @@ -66,13 +68,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", - "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.4", + "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -104,20 +106,33 @@ "node": "*" } }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", + "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/core": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", - "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "license": "MIT", "dependencies": { @@ -149,6 +164,19 @@ "concat-map": "0.0.1" } }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -163,9 +191,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz", - "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.26.0.tgz", + "integrity": "sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==", "dev": true, "license": "MIT", "engines": { @@ -173,9 +201,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -183,12 +211,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", - "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@eslint/core": "^0.13.0", "levn": "^0.4.1" }, "engines": { @@ -264,9 +293,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -277,6 +306,28 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.3.tgz", + "integrity": "sha512-rmOWVRUbUJD7iSvJugjUbFZshTAuJ48MXoZ80Osx1GM0K/H1w7rSEvmw8m6vdWxNASgtaHIhAgre4H/E9GJiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -316,13 +367,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.51.0.tgz", - "integrity": "sha512-dJ0dMbZeHhI+wb77+ljx/FeC8VBP6j/rj9OAojO08JI80wTZy6vRk9KvHKiDCUh4iMpEiseMgqRBIeW+eKX6RA==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.52.0.tgz", + "integrity": "sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.51.0" + "playwright": "1.52.0" }, "bin": { "playwright": "cli.js" @@ -356,21 +407,21 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.17.0.tgz", - "integrity": "sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.1.tgz", + "integrity": "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.17.0", - "@typescript-eslint/type-utils": "8.17.0", - "@typescript-eslint/utils": "8.17.0", - "@typescript-eslint/visitor-keys": "8.17.0", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/type-utils": "8.32.1", + "@typescript-eslint/utils": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -381,25 +432,31 @@ }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.17.0.tgz", - "integrity": "sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.32.1.tgz", + "integrity": "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.17.0", - "@typescript-eslint/types": "8.17.0", - "@typescript-eslint/typescript-estree": "8.17.0", - "@typescript-eslint/visitor-keys": "8.17.0", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/typescript-estree": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4" }, "engines": { @@ -410,23 +467,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.17.0.tgz", - "integrity": "sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.32.1.tgz", + "integrity": "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.17.0", - "@typescript-eslint/visitor-keys": "8.17.0" + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -437,16 +490,16 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.17.0.tgz", - "integrity": "sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.32.1.tgz", + "integrity": "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.17.0", - "@typescript-eslint/utils": "8.17.0", + "@typescript-eslint/typescript-estree": "8.32.1", + "@typescript-eslint/utils": "8.32.1", "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -456,18 +509,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.17.0.tgz", - "integrity": "sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.1.tgz", + "integrity": "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==", "dev": true, "license": "MIT", "engines": { @@ -479,20 +528,20 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.17.0.tgz", - "integrity": "sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.1.tgz", + "integrity": "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.17.0", - "@typescript-eslint/visitor-keys": "8.17.0", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -501,23 +550,21 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.17.0.tgz", - "integrity": "sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.1.tgz", + "integrity": "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.17.0", - "@typescript-eslint/types": "8.17.0", - "@typescript-eslint/typescript-estree": "8.17.0" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/typescript-estree": "8.32.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -527,22 +574,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.17.0.tgz", - "integrity": "sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.1.tgz", + "integrity": "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.17.0", + "@typescript-eslint/types": "8.32.1", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -566,10 +609,24 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, "license": "MIT", "bin": { @@ -649,6 +706,27 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -672,6 +750,47 @@ "node": ">=8" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -723,6 +842,63 @@ "dev": true, "license": "MIT" }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -773,12 +949,13 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -796,6 +973,16 @@ "dev": true, "license": "MIT" }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dotenv": { "version": "16.4.7", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", @@ -809,6 +996,78 @@ "url": "https://dotenvx.com" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -822,30 +1081,32 @@ } }, "node_modules/eslint": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz", - "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.26.0.tgz", + "integrity": "sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.9.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.16.0", - "@eslint/plugin-kit": "^0.2.3", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.13.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.26.0", + "@eslint/plugin-kit": "^0.2.8", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", + "@humanwhocodes/retry": "^0.4.2", + "@modelcontextprotocol/sdk": "^1.8.0", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.5", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", + "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", @@ -861,7 +1122,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3" + "optionator": "^0.9.3", + "zod": "^3.24.2" }, "bin": { "eslint": "bin/eslint.js" @@ -882,9 +1144,9 @@ } }, "node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -1025,6 +1287,98 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.2.tgz", + "integrity": "sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", + "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": "^4.11 || 5 || ^5.0.0-beta.1" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1033,9 +1387,9 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -1043,7 +1397,7 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -1077,9 +1431,9 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, "license": "ISC", "dependencies": { @@ -1112,6 +1466,24 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -1149,6 +1521,26 @@ "dev": true, "license": "ISC" }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -1164,33 +1556,95 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graphemer": { - "version": "1.4.0", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.1.0.tgz", + "integrity": "sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, @@ -1205,6 +1659,62 @@ "node": ">=8" } }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -1216,9 +1726,9 @@ } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1241,6 +1751,23 @@ "node": ">=0.8.19" } }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1272,6 +1799,13 @@ "node": ">=0.12.0" } }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -1366,6 +1900,39 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -1390,6 +1957,29 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -1407,10 +1997,11 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/natural-compare": { "version": "1.4.0", @@ -1418,6 +2009,62 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -1479,6 +2126,16 @@ "node": ">=6" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -1497,6 +2154,16 @@ "node": ">=8" } }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -1510,14 +2177,24 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, "node_modules/playwright": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.0.tgz", - "integrity": "sha512-442pTfGM0xxfCYxuBa/Pu6B2OqxqqaYq39JS8QDMGThUvIOCd6s0ANDog3uwA0cHavVlnTQzGCN7Id2YekDSXA==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.52.0.tgz", + "integrity": "sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.51.0" + "playwright-core": "1.52.0" }, "bin": { "playwright": "cli.js" @@ -1530,9 +2207,9 @@ } }, "node_modules/playwright-core": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.0.tgz", - "integrity": "sha512-x47yPE3Zwhlil7wlNU/iktF7t2r/URR3VLbH6EknJd/04Qc/PSJ0EY3CMXipmglLG+zyRxW6HNo2EGbKLHPWMg==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.52.0.tgz", + "integrity": "sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==", "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" @@ -1551,6 +2228,20 @@ "node": ">= 0.8.0" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -1561,6 +2252,22 @@ "node": ">=6" } }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -1582,6 +2289,32 @@ ], "license": "MIT" }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -1593,9 +2326,9 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", "engines": { @@ -1603,6 +2336,23 @@ "node": ">=0.10.0" } }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -1627,10 +2377,38 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", "bin": { @@ -1640,6 +2418,52 @@ "node": ">=10" } }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1661,6 +2485,92 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", @@ -1710,17 +2620,27 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=16" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=4.8.4" } }, "node_modules/type-check": { @@ -1736,6 +2656,21 @@ "node": ">= 0.8.0" } }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typescript": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", @@ -1757,6 +2692,16 @@ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "dev": true }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -1767,6 +2712,16 @@ "punycode": "^2.1.0" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -1792,6 +2747,13 @@ "node": ">=0.10.0" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -1803,6 +2765,26 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", + "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } } }, "dependencies": { @@ -1815,9 +2797,9 @@ } }, "@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, "requires": { "eslint-visitor-keys": "^3.4.3" @@ -1830,12 +2812,12 @@ "dev": true }, "@eslint/config-array": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", - "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", "dev": true, "requires": { - "@eslint/object-schema": "^2.1.4", + "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -1861,16 +2843,25 @@ } } }, - "@eslint/core": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", - "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", + "@eslint/config-helpers": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", + "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", "dev": true }, + "@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.15" + } + }, "@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -1894,6 +2885,12 @@ "concat-map": "0.0.1" } }, + "globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -1906,23 +2903,24 @@ } }, "@eslint/js": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz", - "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.26.0.tgz", + "integrity": "sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==", "dev": true }, "@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true }, "@eslint/plugin-kit": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", - "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", "dev": true, "requires": { + "@eslint/core": "^0.13.0", "levn": "^0.4.1" } }, @@ -1963,11 +2961,29 @@ "dev": true }, "@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true }, + "@modelcontextprotocol/sdk": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.3.tgz", + "integrity": "sha512-rmOWVRUbUJD7iSvJugjUbFZshTAuJ48MXoZ80Osx1GM0K/H1w7rSEvmw8m6vdWxNASgtaHIhAgre4H/E9GJiYQ==", + "dev": true, + "requires": { + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1995,12 +3011,12 @@ } }, "@playwright/test": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.51.0.tgz", - "integrity": "sha512-dJ0dMbZeHhI+wb77+ljx/FeC8VBP6j/rj9OAojO08JI80wTZy6vRk9KvHKiDCUh4iMpEiseMgqRBIeW+eKX6RA==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.52.0.tgz", + "integrity": "sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==", "dev": true, "requires": { - "playwright": "1.51.0" + "playwright": "1.52.0" } }, "@types/estree": { @@ -2025,98 +3041,106 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.17.0.tgz", - "integrity": "sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.1.tgz", + "integrity": "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.17.0", - "@typescript-eslint/type-utils": "8.17.0", - "@typescript-eslint/utils": "8.17.0", - "@typescript-eslint/visitor-keys": "8.17.0", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/type-utils": "8.32.1", + "@typescript-eslint/utils": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.1.0" + }, + "dependencies": { + "ignore": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", + "dev": true + } } }, "@typescript-eslint/parser": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.17.0.tgz", - "integrity": "sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.32.1.tgz", + "integrity": "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "8.17.0", - "@typescript-eslint/types": "8.17.0", - "@typescript-eslint/typescript-estree": "8.17.0", - "@typescript-eslint/visitor-keys": "8.17.0", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/typescript-estree": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.17.0.tgz", - "integrity": "sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.32.1.tgz", + "integrity": "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==", "dev": true, "requires": { - "@typescript-eslint/types": "8.17.0", - "@typescript-eslint/visitor-keys": "8.17.0" + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1" } }, "@typescript-eslint/type-utils": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.17.0.tgz", - "integrity": "sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.32.1.tgz", + "integrity": "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "8.17.0", - "@typescript-eslint/utils": "8.17.0", + "@typescript-eslint/typescript-estree": "8.32.1", + "@typescript-eslint/utils": "8.32.1", "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.1.0" } }, "@typescript-eslint/types": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.17.0.tgz", - "integrity": "sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.1.tgz", + "integrity": "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.17.0.tgz", - "integrity": "sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.1.tgz", + "integrity": "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==", "dev": true, "requires": { - "@typescript-eslint/types": "8.17.0", - "@typescript-eslint/visitor-keys": "8.17.0", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.1.0" } }, "@typescript-eslint/utils": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.17.0.tgz", - "integrity": "sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.1.tgz", + "integrity": "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.17.0", - "@typescript-eslint/types": "8.17.0", - "@typescript-eslint/typescript-estree": "8.17.0" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/typescript-estree": "8.32.1" } }, "@typescript-eslint/visitor-keys": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.17.0.tgz", - "integrity": "sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.1.tgz", + "integrity": "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==", "dev": true, "requires": { - "@typescript-eslint/types": "8.17.0", + "@typescript-eslint/types": "8.32.1", "eslint-visitor-keys": "^4.2.0" }, "dependencies": { @@ -2128,10 +3152,20 @@ } } }, + "accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "requires": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + } + }, "acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true }, "acorn-jsx": { @@ -2184,6 +3218,23 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, + "body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "dev": true, + "requires": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + } + }, "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -2202,6 +3253,32 @@ "fill-range": "^7.1.1" } }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, + "call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2239,6 +3316,43 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true + }, + "cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true + }, + "cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2271,12 +3385,12 @@ } }, "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, "deep-is": { @@ -2285,12 +3399,68 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, "dotenv": { "version": "16.4.7", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", "dev": true }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true + }, + "es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, + "es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2298,29 +3468,31 @@ "dev": true }, "eslint": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz", - "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.26.0.tgz", + "integrity": "sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.9.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.16.0", - "@eslint/plugin-kit": "^0.2.3", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.13.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.26.0", + "@eslint/plugin-kit": "^0.2.8", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", + "@humanwhocodes/retry": "^0.4.2", + "@modelcontextprotocol/sdk": "^1.8.0", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.5", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", + "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", @@ -2336,7 +3508,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3" + "optionator": "^0.9.3", + "zod": "^3.24.2" }, "dependencies": { "brace-expansion": { @@ -2367,9 +3540,9 @@ } }, "eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -2431,6 +3604,69 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "requires": { + "eventsource-parser": "^3.0.1" + } + }, + "eventsource-parser": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.2.tgz", + "integrity": "sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==", + "dev": true + }, + "express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "dev": true, + "requires": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + } + }, + "express-rate-limit": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", + "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", + "dev": true, + "requires": {} + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2438,16 +3674,16 @@ "dev": true }, "fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "dependencies": { "glob-parent": { @@ -2474,9 +3710,9 @@ "dev": true }, "fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -2500,6 +3736,20 @@ "to-regex-range": "^5.0.1" } }, + "finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "dev": true, + "requires": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + } + }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2526,6 +3776,18 @@ "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", "dev": true }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true + }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -2533,6 +3795,40 @@ "dev": true, "optional": true }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + }, + "get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + } + }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + } + }, "glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -2543,9 +3839,15 @@ } }, "globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.1.0.tgz", + "integrity": "sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==", + "dev": true + }, + "gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true }, "graphemer": { @@ -2560,6 +3862,43 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, "ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -2567,9 +3906,9 @@ "dev": true }, "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -2582,6 +3921,18 @@ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2603,6 +3954,12 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true + }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -2680,6 +4037,24 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true + }, + "media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true + }, + "merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2696,6 +4071,21 @@ "picomatch": "^2.3.1" } }, + "mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true + }, + "mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "requires": { + "mime-db": "^1.54.0" + } + }, "minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -2706,9 +4096,9 @@ } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "natural-compare": { @@ -2717,6 +4107,42 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, "optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -2758,6 +4184,12 @@ "callsites": "^3.0.0" } }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2770,26 +4202,38 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, + "path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "dev": true + }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "dev": true + }, "playwright": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.0.tgz", - "integrity": "sha512-442pTfGM0xxfCYxuBa/Pu6B2OqxqqaYq39JS8QDMGThUvIOCd6s0ANDog3uwA0cHavVlnTQzGCN7Id2YekDSXA==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.52.0.tgz", + "integrity": "sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==", "dev": true, "requires": { "fsevents": "2.3.2", - "playwright-core": "1.51.0" + "playwright-core": "1.52.0" } }, "playwright-core": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.0.tgz", - "integrity": "sha512-x47yPE3Zwhlil7wlNU/iktF7t2r/URR3VLbH6EknJd/04Qc/PSJ0EY3CMXipmglLG+zyRxW6HNo2EGbKLHPWMg==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.52.0.tgz", + "integrity": "sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==" }, "prelude-ls": { "version": "1.2.1", @@ -2797,18 +4241,55 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, "punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true }, + "qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dev": true, + "requires": { + "side-channel": "^1.1.0" + } + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + } + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -2816,11 +4297,24 @@ "dev": true }, "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true }, + "router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "requires": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + } + }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -2830,10 +4324,59 @@ "queue-microtask": "^1.2.2" } }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true + }, + "send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dev": true, + "requires": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + } + }, + "serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "dev": true, + "requires": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, "shebang-command": { @@ -2851,6 +4394,60 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + } + }, + "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==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + } + }, + "side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + } + }, + "side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + }, "strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", @@ -2883,10 +4480,16 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, "ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, "requires": {} }, @@ -2899,6 +4502,17 @@ "prelude-ls": "^1.2.1" } }, + "type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "requires": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + } + }, "typescript": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", @@ -2912,6 +4526,12 @@ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "dev": true }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -2921,6 +4541,12 @@ "punycode": "^2.1.0" } }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -2936,11 +4562,30 @@ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true + }, + "zod": { + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", + "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", + "dev": true + }, + "zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "dev": true, + "requires": {} } } } diff --git a/package.json b/package.json index 3f8991e..2672e23 100644 --- a/package.json +++ b/package.json @@ -3,18 +3,21 @@ "version": "1.0.0", "description": "", "main": "index.js", - "scripts": {}, + "scripts": { + "lint": "eslint . --ext .ts" + }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "@faker-js/faker": "^9.2.0", - "@playwright/test": "^1.51.0", + "@playwright/test": "^1.52.0", "@types/node": "^22.10.9", - "@typescript-eslint/eslint-plugin": "^8.17.0", - "@typescript-eslint/parser": "^8.17.0", + "@typescript-eslint/eslint-plugin": "^8.32.1", + "@typescript-eslint/parser": "^8.32.1", "dotenv": "^16.4.7", - "eslint": "^9.16.0" + "eslint": "^9.26.0", + "globals": "^16.1.0" }, "dependencies": { "@axe-core/playwright": "^4.10.1", diff --git a/pages/BasePage.ts b/pages/BasePage.ts index 7d9f4fc..35ea115 100644 --- a/pages/BasePage.ts +++ b/pages/BasePage.ts @@ -1,4 +1,4 @@ -import { Page, Locator, expect } from '@playwright/test'; +import { Page, expect } from '@playwright/test'; export default abstract class BasePage { protected constructor(protected page: Page) {} diff --git a/tests/api/api.spec.ts b/tests/api/api.spec.ts index 78ab39d..f1ae032 100644 --- a/tests/api/api.spec.ts +++ b/tests/api/api.spec.ts @@ -1,4 +1,14 @@ import test, { expect } from '@playwright/test'; +import { + ApiStructure, + Page, + Post, + Category, + MediaItem, + SearchResult, + CommentItem, + User, +} from '../types/wp-api'; const BASE_URL = 'https://ovcharski.com/shop/wp-json'; const API_VERSION = 'wp/v2'; @@ -9,11 +19,15 @@ test.describe('WordPress API Tests', () => { test('GET /wp/v2 should return API structure', async ({ request }) => { const response = await request.get(`${BASE_URL}/${API_VERSION}/`); await expect(response).toBeOK(); - const body = await response.json(); + + const body = (await response.json()) as ApiStructure; expect(body.namespace).toBe(API_VERSION); expect(body.routes).toBeInstanceOf(Object); - expect(Object.values(body.routes).some((route: any) => route.namespace === API_VERSION)).toBeTruthy(); + + const allRoutes = Object.values(body.routes); + const hasOurNamespace = allRoutes.some(route => route.namespace === API_VERSION); + expect(hasOurNamespace).toBeTruthy(); }); }); @@ -24,7 +38,7 @@ test.describe('WordPress API Tests', () => { }); await expect(response).toBeOK(); - const pages = await response.json(); + const pages = (await response.json()) as Page[]; expect(pages).toBeInstanceOf(Array); pages.forEach(page => { @@ -46,7 +60,7 @@ test.describe('WordPress API Tests', () => { }); await expect(response).toBeOK(); - const posts = await response.json(); + const posts = (await response.json()) as Post[]; expect(posts).toHaveLength(perPage); expect(response.headers()['x-wp-total']).toBeTruthy(); @@ -60,7 +74,7 @@ test.describe('WordPress API Tests', () => { }); await expect(response).toBeOK(); - const categories = await response.json(); + const categories = (await response.json()) as Category[]; expect(categories).toBeInstanceOf(Array); categories.forEach(category => { @@ -80,7 +94,7 @@ test.describe('WordPress API Tests', () => { }); await expect(response).toBeOK(); - const mediaItems = await response.json(); + const mediaItems = (await response.json()) as MediaItem[]; expect(mediaItems).toBeInstanceOf(Array); mediaItems.forEach(media => { @@ -116,7 +130,7 @@ test.describe('WordPress API Tests', () => { }); await expect(response).toBeOK(); - const results = await response.json(); + const results = (await response.json()) as SearchResult[]; expect(results).toBeInstanceOf(Array); results.forEach(post => { @@ -127,13 +141,15 @@ test.describe('WordPress API Tests', () => { test.describe('User Management', () => { test('GET /users should not expose sensitive information', async ({ request }) => { - const response = await request.get(`${BASE_URL}/${API_VERSION}/users`, { - params: { _fields: 'id,name,slug' } - }); + const response = await request.get( + `${BASE_URL}/${API_VERSION}/users`, + { params: { _fields: 'id,name,slug' } } + ); await expect(response).toBeOK(); - const users = await response.json(); + const users = (await response.json()) as User[]; + expect(users).toBeInstanceOf(Array); users.forEach(user => { expect(user).not.toHaveProperty('email'); expect(user).not.toHaveProperty('password'); @@ -145,7 +161,7 @@ test.describe('WordPress API Tests', () => { test.describe('Comment System', () => { test('GET /comments should return comments for valid post', async ({ request }) => { const postsResponse = await request.get(`${BASE_URL}/${API_VERSION}/posts`); - const posts = await postsResponse.json(); + const posts = (await postsResponse.json()) as Post[]; const postId = posts[0]?.id; test.skip(!postId, 'No posts available for comment testing'); @@ -155,7 +171,7 @@ test.describe('WordPress API Tests', () => { }); await expect(response).toBeOK(); - const comments = await response.json(); + const comments = (await response.json()) as CommentItem[]; expect(comments).toBeInstanceOf(Array); comments.forEach(comment => { @@ -163,4 +179,4 @@ test.describe('WordPress API Tests', () => { }); }); }); -}); \ No newline at end of file +}); diff --git a/tests/e2e/make-order.spec.ts b/tests/e2e/make-order.spec.ts index 1edf27c..f733055 100644 --- a/tests/e2e/make-order.spec.ts +++ b/tests/e2e/make-order.spec.ts @@ -1,70 +1,82 @@ -import test, { expect } from '@playwright/test'; +import test, { expect, type Page } from '@playwright/test'; import CheckoutPage from '../../pages/CheckoutPage'; import { faker } from '@faker-js/faker'; const baseURL = 'https://ovcharski.com/shop/'; const PHONE_NUMBER = '0883883883'; -function generateCheckoutData() { - return { - firstname: faker.person.firstName(), - lastname: faker.person.lastName(), - company: faker.company.name(), - streetaddress: faker.location.streetAddress(), - apaddress: faker.location.secondaryAddress(), - towncity: faker.location.city(), - postcode: faker.location.zipCode(), - phone: PHONE_NUMBER, - email: faker.internet.email(), - }; +interface CheckoutData { + firstname: string; + lastname: string; + company: string; + streetaddress: string; + apaddress: string; + towncity: string; + postcode: string; + phone: string; + email: string; } -async function completeCheckout(page: any, checkoutPage: CheckoutPage) { - const data = generateCheckoutData(); - await checkoutPage.fillCheckoutForm( - data.firstname, - data.lastname, - data.company, - data.streetaddress, - data.apaddress, - data.towncity, - data.postcode, - data.phone, - data.email, - ); - await checkoutPage.placeOrder(); +function generateCheckoutData(): CheckoutData { + return { + firstname: faker.person.firstName(), + lastname: faker.person.lastName(), + company: faker.company.name(), + streetaddress: faker.location.streetAddress(), + apaddress: faker.location.secondaryAddress(), + towncity: faker.location.city(), + postcode: faker.location.zipCode(), + phone: PHONE_NUMBER, + email: faker.internet.email(), + }; +} + +async function completeCheckout(page: Page, checkoutPage: CheckoutPage): Promise { + const data = generateCheckoutData(); + await checkoutPage.fillCheckoutForm( + data.firstname, + data.lastname, + data.company, + data.streetaddress, + data.apaddress, + data.towncity, + data.postcode, + data.phone, + data.email, + ); + await checkoutPage.placeOrder(); } test.use({ storageState: './NoAuth.json' }); test('Make an order', async ({ page }) => { - const checkout = new CheckoutPage(page); - await page.goto(baseURL); - await page.getByLabel('Visit product category Jenkins Artwork').click(); - await expect(page).toHaveURL(`${baseURL}product-category/jenkins-artwork/`); - await page.getByRole('link', { name: 'Jenkins Cosmonaut Jenkins Cosmonaut 20,00 лв.' }).click(); - await expect(page).toHaveURL(`${baseURL}product/jenkins-cosmonaut/`); - await page.getByRole('button', { name: 'Add to cart' }).click(); - await page.locator('#content').getByRole('link', { name: 'View cart ' }).click(); - await expect(page).toHaveURL(`${baseURL}cart/`); - await page.getByRole('link', { name: 'Proceed to checkout ' }).click(); - await expect(page).toHaveURL(`${baseURL}checkout/`); - await completeCheckout(page, checkout); - await expect(page.getByRole('heading', { name: 'Order received' })).toBeVisible(); - await expect(page.getByText('Thank you. Your order has been received.')).toBeVisible(); + const checkout = new CheckoutPage(page); + await page.goto(baseURL); + await page.getByLabel('Visit product category Jenkins Artwork').click(); + await expect(page).toHaveURL(`${baseURL}product-category/jenkins-artwork/`); + await page.getByRole('link', { name: 'Jenkins Cosmonaut Jenkins Cosmonaut 20,00 лв.' }).click(); + await expect(page).toHaveURL(`${baseURL}product/jenkins-cosmonaut/`); + await page.getByRole('button', { name: 'Add to cart' }).click(); + await page.locator('#content').getByRole('link', { name: 'View cart ' }).click(); + await expect(page).toHaveURL(`${baseURL}cart/`); + await page.getByRole('link', { name: 'Proceed to checkout ' }).click(); + await expect(page).toHaveURL(`${baseURL}checkout/`); + await completeCheckout(page, checkout); + await expect(page.getByRole('heading', { name: 'Order received' })).toBeVisible(); + await expect(page.getByText('Thank you. Your order has been received.')).toBeVisible(); }); test('Make an order via search', async ({ page }) => { - const checkout = new CheckoutPage(page); - await page.goto(baseURL); - await page.getByRole('searchbox', { name: 'Search for:' }).fill('Jenkinstein'); - await page.getByRole('searchbox', { name: 'Search for:' }).press('Enter'); - await expect(page).toHaveURL(`${baseURL}product/jenkins-jenkinstein/`); - await page.getByRole('button', { name: 'Add to cart' }).click(); - await page.locator('#content').getByRole('link', { name: 'View cart ' }).click(); - await expect(page).toHaveURL(`${baseURL}cart/`); - await page.getByRole('link', { name: 'Proceed to checkout ' }).click(); - await expect(page).toHaveURL(`${baseURL}checkout/`); - await completeCheckout(page, checkout); - await expect(page.getByRole('heading', { name: 'Order received' })).toBeVisible(); -}); \ No newline at end of file + const checkout = new CheckoutPage(page); + await page.goto(baseURL); + await page.getByRole('searchbox', { name: 'Search for:' }).fill('Jenkinstein'); + await page.getByRole('searchbox', { name: 'Search for:' }).press('Enter'); + await expect(page).toHaveURL(`${baseURL}product/jenkins-jenkinstein/`); + await page.getByRole('button', { name: 'Add to cart' }).click(); + await page.locator('#content').getByRole('link', { name: 'View cart ' }).click(); + await expect(page).toHaveURL(`${baseURL}cart/`); + await page.getByRole('link', { name: 'Proceed to checkout ' }).click(); + await expect(page).toHaveURL(`${baseURL}checkout/`); + await completeCheckout(page, checkout); + await expect(page.getByRole('heading', { name: 'Order received' })).toBeVisible(); +}); diff --git a/tests/e2e/search.spec.ts b/tests/e2e/search.spec.ts index ec243c8..695bed7 100644 --- a/tests/e2e/search.spec.ts +++ b/tests/e2e/search.spec.ts @@ -1,4 +1,4 @@ -import { test, expect, type Page } from '@playwright/test'; +import { test, expect } from '@playwright/test'; const testData = [ { searchQuery: 'Album', sku: 'woo-album', url: 'https://ovcharski.com/shop/product/album/' }, diff --git a/tests/types/wp-api.ts b/tests/types/wp-api.ts new file mode 100644 index 0000000..144a619 --- /dev/null +++ b/tests/types/wp-api.ts @@ -0,0 +1,48 @@ +export interface RouteInfo { + namespace: string; + // add more properties here if needed + } + + export interface ApiStructure { + namespace: string; + routes: Record; + } + + export interface Page { + id: number; + link: string; + slug: string; + } + + export interface Post { + id: number; + } + + export interface Category { + id: number; + name: string; + slug: string; + } + + export interface MediaItem { + id: number; + source_url: string; + alt_text: string; + } + + export interface SearchResult { + id: number; + slug: string; + title: { rendered: string }; + } + + export interface CommentItem { + post: number; + } + + export interface User { + id: number; + name: string; + slug: string; + } + \ No newline at end of file diff --git a/tests/ui/open-homepage-mobile-refactored.spec.ts b/tests/ui/open-homepage-mobile-refactored.spec.ts index 1c89cd3..82cb5cc 100644 --- a/tests/ui/open-homepage-mobile-refactored.spec.ts +++ b/tests/ui/open-homepage-mobile-refactored.spec.ts @@ -1,26 +1,27 @@ -import { test, expect } from '@playwright/test'; +import test from '@playwright/test'; +import type { Page } from '@playwright/test'; import HomePage from '../../pages/HomePage'; // Common test setup to reduce repetition const commonTestSetup = (viewportName: string) => { - return async ({ page }) => { + return async ({ page }: { page: Page }) => { try { const homePage = new HomePage(page); // The empty object represents options passed to the goto() method. - // This object could include several configuration options, such as: timeout, waitUntil, referer, headers await page.goto('/shop/', {}); // Verify the welcome text using HomePage methods - await homePage.verifyWelcomeText("Welcome to the store"); + await homePage.verifyWelcomeText('Welcome to the store'); // Verify the footer text using HomePage methods - await homePage.verifyFooterText("© Automation Demo Site 2025 Built with WooCommerce."); + await homePage.verifyFooterText( + '© Automation Demo Site 2025 Built with WooCommerce.' + ); // Capture screenshots with consistent naming await homePage.captureScreenshot(viewportName); await homePage.captureFullPageScreenshot(viewportName); - } catch (error) { console.error(`Test failed for ${viewportName} viewport:`, error); throw error; @@ -38,11 +39,10 @@ const viewports = [ { name: 'SE', width: 375, height: 667 }, ]; -// Dynamically generate tests for each viewport -viewports.forEach(viewport => { +viewports.forEach((viewport) => { test.describe(`${viewport.name.toUpperCase()} viewport`, () => { test.use({ viewport: { width: viewport.width, height: viewport.height } }); - test('Open Homepage Mobile', commonTestSetup(viewport.name)); + test(`Open Homepage Mobile (${viewport.name})`, commonTestSetup(viewport.name)); }); }); diff --git a/tests/ui/open-homepage.spec.ts b/tests/ui/open-homepage.spec.ts index 9dd397c..23b6077 100644 --- a/tests/ui/open-homepage.spec.ts +++ b/tests/ui/open-homepage.spec.ts @@ -1,4 +1,4 @@ -import { test, expect } from '@playwright/test'; +import { test } from '@playwright/test'; import HomePage from '../../pages/HomePage'; test.afterEach(async ({ page }, testInfo) => { diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..3929141 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "CommonJS", + "strict": true, + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["./**/*.ts"] + } + \ No newline at end of file